• Централизованный сбор и обработка журналов печати Windows

    В небольших офисах далеко не всегда используются сетевые принтеры и МФУ, поэтому получить статистику использования печатающих устройств получить достаточно сложно. Тем более, если это требуется произвести с минимальными затратами. Такие данные смогут помочь определить наиболее активно используемые устройства, оценить нагрузку на них и принять своевременные решения по закупке расходных материалов, техническом обслуживании или даже замене на более экономичные и производительные. Данную задачу возможно решить без дополнительного ПО используя встроенные средства управления журналами Windows и скриптом на Powershell.
    Читать дальше →
  • Автоматическое управление паролями в Active Directory

    Однажды мне всё это надоело…
    Вероятно, в большинстве случаев именно с этой фразы начинается творчество системных администраторов. В результате мы видим (хотя, правильнее сказать, даже и не замечаем) появление множества маленьких программ, которые выполняют свои точные и строго определённые задачи в одной большой системе.

    Случилась (да и регулярно случается) со мной подобная история. Не скажу, что я изобрёл что-то новое и выдающееся. Скорее наоборот – воспользовался трудами коллег, найденными в просторах интернета и в кладезях премудрости Хабра. Но мне удалось объединить их для решения вполне конкретной и достаточно интересной задачи. Далее я опишу конкретное решение конкретной задачи по управлению паролями пользователей в Active Directory. Точнее, автоматизацию проверки срока действия этих паролей и генерации новых паролей. В качестве признательности коллегам я счёл необходимым опубликовать это решение здесь, в надежде, что оно кому-то пригодится или послужит источником новых идей.
    Дальше подробное описание и код
  • Наблюдаем за новыми арендами адресов на DHCP сервере с помощью PowerShell

    Хочу рассказать об одном из способов мониторить новые аренды адресов на Windows DHCP сервере со множеством скопов. Задача была следующая: находить новые аренды и пробегать список глазами на предмет неугодных хостов с последующим их баном.

    Для решения мы создадим базу SQLite и будем сохранять в ней информацию о существующих арендах, а затем, с помощью запроса, сравнивать таблицу, полученную ранее (например, вчера или неделю назад) с актуальными данными.
    Читать дальше →
  • Powershell для тестировщиков



    Перед вами «быстрый старт» для работы с PowerShell для начинающих тестировщиков. Вы работаете и в один из дней, наконец, смиряетесь с тем фактом, что человек по сути своей ленивое существо, но при этом достаточно хитрое, чтобы облегчить себе жизнь. И, не долго думая, решаете автоматизировать повседневные задачи. Естественно, минимальными усилиями.
    Читать дальше →
  • Загрузка фото пользователя в Active Directory с помощью PowerShell

    Если вы используете Active Directory у вас используется Exchange, OwnCloud, SharePoint или другая система с возможностью отображения аватара или фото, то после прочтения данный статьи у вас появится возможность загрузить фото пользователя в AD для отображения в Outlook, Lync, на порталах SharePoint и других системах.
    Читать дальше →
    • +18
    • 59,5k
    • 5
  • Try/Catch/Finally

    Когда вы используете Try/Catch/Finally, команда которая будет выполняться помещается в блок Try. Если произойдет ошибка в процессе выполнения команды, то она будет записана в переменную $Error, и выполнение скрипта перейдет к блоку Catch.
    Читать дальше →
    • –2
    • 45k
    • 2
  • Advanced PowerShell vol. 1: повторное использование кода

      Привет! Как большой поклонник и активный практик PowerShell я часто сталкиваюсь с тем, что мне необходимо повторно использовать ранее написанные куски кода.
      Собственно, для современных языков программирования code reuse — это обычное дело.
      PowerShell в этом вопросе не отстает, и предлагает разработчикам (написателям скриптов) сразу несколько механизмов обращения к написанному ранее коду.
      Вот они по возрастанию сложности: использование функций, дот-сорсинг и написание собственных модулей.

      Рассмотрим их все порядку.

      В качестве решения лабораторной задачи напишем скрипт, который расширяет раздел C:\ до максимально возможного размера на удаленном Windows-сервере LAB-FS1.
      Такой скрипт будет состоять из одной строки и выглядеть так:

      Invoke-Command -ComputerName LAB-FS1 -ScriptBlock { "rescan", "select volume=c", "extend" | diskpart }

      Работает это так. Сначала PowerShell устанавливает удаленное соединение с сервером LAB-FS1 и запускает на нем локально набор команд, заключенный в фигурные скобки параметра -ScriptBlock. Этот набор в свою очередь последовательно передает команде diskpart три текстовых параметра, а diskpart выполняет (по очереди) повторное сканирование разделов, выбор раздела C:\ и расширение его до максимально возможного размера.



      Как видите, скрипт крайне простой, но в то же время крайне полезный.
      Рассмотрим, как правильно упаковать его для повторного использования.
      Для этого у нас есть три способа.
    • AdBlock похитил этот баннер, но баннеры не зубы — отрастут

      Подробнее
      Реклама
    • Сбор информации о рабочих станциях через Powershell

      • Tutorial
      Сбор информации о рабочих станциях через Powershell.

      Этот пост будет посвящен работе написанию скриптов на Powershell. Далее я предполагаю, что читатель уже сталкивался с написанием скриптов в windows среде. Итак:

      Была у меня задача собрать некоторую информацию по пользовательским рабочим станциям в организации. Все станции в AD и пользователи тоже, что упрощает задачу. Есть контейнер, где находятся все станции, значит нужно пройтись по всем, взяв интересующую информацию, и отобразить результат. Раз так, то пишем скрипт. При написании, я стараюсь делать скрипт по частям. ИМХО для меня так проще и понятнее.
      Читать дальше →
    • DFS Replication и «временные» файлы

        Всем привет!
        Это моя первая публикация, надеюсь, что в дальнейшем буду писать часто.
        Если что-то неправильно оформил, поправьте, я исправлю как надо.

        В работе пришлось столкнуться с интересной особенностью работы DFS Replication. И хотя сам рассматриваемый вопрос не нов, набить на нем шишки могут многие.

        Итак, у нас есть стабильно работающая среда, в которой успешно настроены и работают DFS-репликации. Создана репликационная группа, в нее добавлены все нужные серверы, топология корректна, расписание тоже, все хорошо… пока однажды новые файлы, добавленные в реплицируемую папку не перестают копироваться на удаленные серверы.

        Для примера я сделал тестовую среду, в которой всего два сервера — LAB-DC1 и LAB-FS1. На каждом из них есть папка C:\DFSR, между которыми и должна проходить репликация.

        Копируем в эту папку на LAB-DC1 два тестовых файла и видим, что на второй сервер отреплицировался только один.

        image

        Почему?
        А вот почему!
        • +13
        • 19,4k
        • 4
      • Автоматическое подключение сетевых МФУ с возможностью сканирования [Часть 2]

          Kyocera M2035dn, Xerox WorkCentre 3615 и 6505DN


          Как и обещал в первой части, за которую я успешно получил инвайт в песочнице, в этой заметке я покажу как подключить сетевые МФУ Kyocera M2035dn, Xerox WorkCentre 3615 и 6505DN, а в конце статьи добавлю небольшой бонус с которым любой скрипт связанный с сетью становится лучше.



          Как бы небыли прекрасны гомогенные инфраструктуры, пусть даже в части принтеров и мфу, реальность зачастую ставит свои условия. В то время как пользователи сами в полный рост подключали и успешно сканировали с некогда проблемных МФУ HP, в компанию приехал японский гость — Kyocera M2035dn.

          Kyocera M2035dn


          Приехал как всегда не в мое уютное админское логово, а сразу на объект и как и мфу от HP, в глаза его я, если честно, даже не видел.
          Первым делом качаем драйвер и смотрим содержимое… ба, знакомые все люди:



          Есть пометка о том, что подключение сетевое (network) и есть ID!
          Узнать что делать со всем этим
        • Jump Start в PowerShell (часть II)

          • Tutorial
          Кто, если не ты? Когда, если не сейчас?



          В предыдущей части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Узнали, что PowerShell имеет огромный Help.

          В этой части мы разберёмся с переменными, узнаем, что они за типы и как к ним обращаться, как их сравнивать и выводить всевозможными способами. Обязательно разберёмся с циклами и напишем несколько функций.
          Читать дальше →
        • Автоматическое подключение сетевых МФУ с возможностью сканирования [Часть 1]

          HP LaserJet 1522, 1536, 3052/3055, 300/400 Color...


          Я думаю, многим системным администраторам известны описанные в заголовке мфу, отличаются они, в первую очередь, не очень удобной установкой и от этого имеют дурную славу. Однажды, копируя на очередной компьютер сквозь узкий канал пакет fullsolution для мфу весом около 300 мегабайт, идея разобрать этот инсталлятор и автоматизировать установку вылезла попапом на глаза — работу пришлось приостановить.



          Разбором драйвера я занимался уже около полутора лет назад, в то время интернет на эту тему был совершенно пуст. Сейчас быстро погуглил по теперь уже известным мне ключевым словам утилит и нашел немного разрозненной информации. Несмотря на это, я решил. что собранная в одно место информация все равно не помешает, при том, что в этом посте она более полная.
          Читать дальше →
        • Jump Start в PowerShell (часть I)

          Только автоматизация. Только PowerShell.



          Предисловие


          В качестве хобби и при наличии времени преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий). На данный момент у меня мало времени, чтобы уделить его группе студентов, зато вполне достаточно, чтобы подготовить пост здесь, на Хабре.

          Я работаю системным администратором в крупной не ИТ-компании с большой завязкой на ИТ ресурсы. По роду деятельности представляется решать большое количество однотипных задач по обслуживанию пользователей.

          С языком PowerShell познакомился около двух лет назад, но вплотную занялся им лишь спустя год, не осознав поначалу его огромных возможностей. В статье, прежде всего, я буду ориентироваться на тех, кто хочет начать работать с PowerShell, но пока не доверяет ему или не знает, с какой стороны подступиться к этому чуду.

          Внимание: PowerShell вызывает привыкание.
          Читать дальше →
        • Отслеживаем удаление файлов на PowerShell

          Привет, Хабр! Тема моего поста уже поднималась здесь, но мне есть, что добавить.

          Когда наше файловое хранилище разменяло третий терабайт, все чаще наш отдел стал получать просьбы выяснить, кто удалил важный документ или целую папку с документами. Нередко это происходит по чьему-то злому умыслу. Бэкапы — это хорошо, но страна должна знать своих героев. А молоко вдвойне вкусней, когда мы можем написать его на PowerShell.

          Пока разбирался, решил записать для коллег по цеху, а потом подумал, что может пригодиться кому-то еще. Материал получился смешанный. Кто-то найдет для себя готовое решение, кому-то пригодятся несколько неочевидные методы работы с PowerShell или планировщиком задач, а кто-то проверит на быстродействие свои скрипты.

          В процессе поиска решения задачи прочитал статью за авторством Deks. Решил взять ее за основу, но некоторые моменты меня не устраивали.
          • Во-первых, время генерации отчета за четыре часа на 2-терабайтном хранилище, с которым одновременно работает около 200 человек, составило около пяти минут. И это притом, что лишнего у нас в логи не пишется. Это меньше, чем у Deks, но больше, чем хотелосю бы, потому что...
          • Во-вторых, все то же самое нужно было реализовать еще на двадцати серверах, гораздо менее производительных, чем основной.
          • В-третьих, вызывал вопросы график запуска генерации отчетов.
          • И в-четвертых, хотелось исключить себя из процесса доставки собранной информации конечным потребителям (читай: автоматизировать, чтобы мне с этим вопросом больше не звонили).

          Но ход мыслей Deks мне понравился...
          Читать дальше →
        • Пишем свой пакет для Chocolatey



          Chocolatey — пакетный менеджер для windows сильно облегчающий процедуру установки программ, а уж сколько он экономит времени. Про это чудо уже писали на хабре и даже было показано как написать свой пакет для него, но там было больше ручной работы, я же хочу показать как можно немного упростить это дело.
          Читать дальше →
          • +8
          • 14,8k
          • 4
        • Работа с алертами в System Center Operations Manager, используя свой коннектор

          Статья расчитана на людей, хорошо знакомых с продуктом System Center Operations Manager.

          Терминология:
          SCOM — вместо полного названия;
          Алерт — то же самое, что alert. Просто хорошего аналога в русском языке нет.

          Введение

          В SCOM, в отличие от многих других систем мониторинга, алерт является самостоятельным объектом. В зависимости от настроек, проверка может быть уже зеленой, но алерт так и оставаться активным. Алерты используются и обрабатываются:
          • оператором (человеком)
          • стандартными коннекторами (например, Command Channel)
          • внешними коннекторами (например, коннектор для синхронизацией с системой Service Desk)

          Читать дальше →
        • Скрипт исправления даты установки пароля пользователя в AD

            Всем привет!
            Иногда возникает ситуация, когда надо пользователю изменить дату установки пароля в Active Directory. Представляю скрипт. Наверняка многим пригодится.
            set-ADUserPswDate.ps1
            # Основной скрипт изменения даты установки пароля по файлу или по учетной записи пользователя.
            # Автор Лужин Кирилл
            # luzhin.kirill@yandex.ru
            
            Add-PSSnapin Quest.ActiveRoles.ADManagement;
            
            $gsFilename = "c:\scriptps\set-ADUserPswDate.txt";
            $giRows = (Get-Content -LiteralPath $gsFilename).Count;
            $giX = 0;
            $giMinimumSleep = 218;
            $giMaximumSleep = 884;
            $gtBeginDay = "08:00:00";
            $gtEndDay = "19:00:00";
            $today_date = Get-date -Format "dd.MM.yyyy";
            
            function set-password($lsAccount) {
            	Set-QADUser $lsAccount -ObjectAttributes @{pwdLastSet=0} | Out-Null;
            	Set-QADUser $lsAccount -ObjectAttributes @{pwdLastSet=-1} | Out-Null;
            }
            
            function get-password($lsAccount) {
            	get-qaduser $lsAccount -IncludedProperties pwdLastSet | % {$lsPwdLastSet = $_.pwdLastSet;}
            	$lsPwdLastSet = $lsPwdLastSet.AddHours(3);
            	$lsPwdLastSetNorm = get-date -uformat '%d.%m.%Y %R' -Date $lsPwdLastSet;
            	return $lsPwdLastSetNorm;
            }
            
            function send-eMail($to,$toCc,$text="",$subject="Изменение даты установки пароля",$toBcc="admin3@domain.com") {
            	write-host "Кому: $to | тема: $subject | текст: $text";
            	$Enc = [Text.Encoding]::UTF8;
            	Send-MailMessage -to $to -from "admin1@domain.com" -Bcc $toBcc -Cc $toCc -subject $subject -smtpServer MAIL-SRV -BodyAsHtml $text -Encoding $Enc;
            }
            
            function get-sleepRandom($liMinimum, $liMaximum) {
            	$giSleep = Get-Random -minimum $liMinimum -maximum $liMaximum
            	# $giSleep = 30;
            	$giSleepS = $giSleep % 60;
            	$giSleepM = $giSleep - $giSleepS;
            	$giSleepM = $giSleepM / 60;
            	$gdFuture = (Get-Date).AddSeconds($giSleep);
            	write-host "Ждем"$giSleepM" минут "$giSleepS" секунд (будет выполнен "$gdFuture")...";
            	Start-Sleep -Seconds $giSleep
            }
            
            function isAtWork($ltBegin, $ltEnd) {
            	$lbAtWork = $FALSE;
            	
            	$giDayOfWeek = (get-date).DayOfWeek.ToString('d');
            		
            	if (($giDayOfWeek -gt 0) -and ($giDayOfWeek -lt 6)) {
            		$today_date_full = $today_date + " " + $ltBegin;
            		$today_date_full2 = $today_date + " " + $ltEnd;
            		write-host $today_date_full" - "$today_date_full2;
            		$a=[datetime]::parse($today_date_full);
            		$c=[datetime]::parse($today_date_full2);
            		$b = get-date;
            		
            		if (($b -gt $a) -and ($b -lt $c)) {
            			write-host $b". Время позже 8:00 и раньше 19:00, пользователь может поменять пароль!";
            			$lbAtWork = $TRUE;
            		} else {
            			write-host "Время раньше 8:00 или позже 19:00, пользователь не может поменять пароль.";
            		}
            	} else {
            		write-host "Сегодня выходной, пользователя нет на работе.";
            	}
            	
            	return $lbAtWork;
            }
            
            function update-password_wReport($lsAccount) {
            	write-host " ";
            	write-host "*"$lsAccount;
            	$gbAtWork = isAtWork $gtBeginDay $gtEndDay;
            	if ($gbAtWork) {
            		$gsPwdLastSet = get-password $lsAccount;
            		$lsText = "<tr><td style='border:1px solid RGB(200,200,200);'><strong>" + $lsAccount + "</strong></td><td style='border:1px solid RGB(200,200,200);'>" + $gsPwdLastSet + "</td>";
            		set-password $lsAccount;
            		$gsPwdLastSet = get-password $lsAccount;
            		$lsText = $lsText + "<td style='border:1px solid RGB(200,200,200);'>" + $gsPwdLastSet + "</td></tr>";
            	} else {
            		$lsText = "<tr><td style='border:1px solid RGB(200,200,200);'><strong>" + $lsAccount + "</strong></td><td style='border:1px solid RGB(200,200,200);'>Нет на работе</td><td style='border:1px solid RGB(200,200,200);'></td></tr>";
            	}
            	return $lsText;
            }
            
            $gsText = $gsText + "<table style='border-collapse:collapse; width:500px; font-family:Tahoma,Arial,Calibri;font-size:10pt;'>";
            $gsText = $gsText + "<tr><td style='width:40%; border:1px solid RGB(200,200,200); text-align:center;'>Учетная запись</td>";
            $gsText = $gsText + "<td style='width:130px; border:1px solid RGB(200,200,200); text-align:center;'>Было</td><td style='width:130px; border:1px solid RGB(200,200,200); text-align:center;'>Стало</td></tr>";
            
            if ($ARGS[0] -ne $Null) {
            	$gsText = $gsText + (update-password_wReport $ARGS[0]);
            } else {
            	Get-Content -LiteralPath $gsFilename | 
            		% {
            			$gsText = $gsText + (update-password_wReport $_);
            			
            			$giX = $giX + 1;
            			if ($giX -lt $giRows) {
            				get-sleepRandom $giMinimumSleep $giMaximumSleep;
            			}
            		}
            }
            $gsText = $gsText + "</table>";
            if ($ARGS[1] -ne $Null) {
            	send-eMail $ARGS[1] "admin1@domain.com" $gsText;
            } else {
            	send-eMail "admin1@domain.com" "admin2@domain.com" $gsText;
            }


            Под катом описание, использование и особенности.
            Читать дальше →
            • –2
            • 6,5k
            • 6
          • Предупреждение пользователей об истечении пароля и действия учётной записи

              Всем привет!
              Столкнулись как-то с ситуацией, когда 1 января у многих пользователей истёк срок действия учётной записи и они были заблокированы. Соответственно не смогли работать, шквал телефонных звонков, начиная с утра 1-го числа. Было принято решение заранее предупреждать пользователей об истечении пароля и действия учётной записи по почте. С копией списка предупреждённых пользователей администратору.
              Скрипты реализации под катом.
              Читать дальше →
              • +5
              • 15,9k
              • 7
            • Как проимпортировать неимпортируемое

              • Tutorial

              Проблема, идея, и решение


              Здравствуйте, дорогие мои детишечки. Спешу сообщить вам, что в мою голову пришла еще одна идея, которая вылилась вот в эту заметку. Идея, собственно говоря, пришла из проблемы, которую подкинула горячо мной любимая и уважаемая компания Microsoft и их новый продукт Windows Server 2012 R2. И тут я нисколько не иронизирую, мне они действительно нравятся. Но начнем по порядку.
              Прежде всего отмечу, что я, кроме всего прочего еще и тренер по всякого рода продуктам Microsoft, и соответственно имею доступ к определенным плюшкам в виде готовых виртуальных машин для подготовки к курсам, в рамках учебного центра. И вот, собственно, решил я попробовать погонять новый сервер, ну и, как водится, развернуть на нем виртуалочки от одного курса. Выкачал эти машины, все подготовил, распаковал. И тут меня поджидало ужасное. Они категорически отказывались импортироваться.
              Подробности
            • Как я сайт на powershell парсил

              Предисловие


              Прежде всего хочу отметить, я не программист. Я админ, пока. Хотелось бы конечно зваться архитектором, но в обозримом пространстве подходящих вакансий, с адекватными требованиями, а главное, зарплатами за эти требования нет. А жаль.
              Собственно говоря, в рамках этой заметки хочу рассказать о полезных плюшках новой версии Powershell. В частности, о возможности быстро и уверенно парсить веб-странички и делать это «параллельно».
              Читать дальше →
              • +12
              • 21,4k
              • 2

            Самое читаемое