Введение
Порою с помощью PowerShell управлять Windows Server 2008 можно гораздо быстрее, чем с помощью привычых GUI-инструментов. В этой статье вы найдет 9 наиболее распространенных задач, которые могут быть реализованы с помощью PowerShell. (10 задача была исключена из перевода из-за того, что демонстрируемый в статье скрипт был неполным – Прим. переводчика).
По данной теме будет два поста. Материала много, материал хороший, но, к сожалению, размещение в одном посте сделает его нечитаемым.
Итак, какие задачи будут рассмотрены:
- Изменение пароля локального администратора с помощью PowerShell
- Перезагрузка или выключение сервера
- Перезапуск службы
- Остановка процесса
- Создание отчета об использовании диска
- Получаем 10 последних ошибок журнала событий
- Сбрасываем контроль доступа к папке
- Получаем server’s uptime
- Получаем информацию о Service Pack
Первые пять задач мы рассмотрим в этом посте, оставшиеся 4 последующем. Заинтересованных приглашаем под кат.
1. Меняем пароль локального администратора
Предположим Вы залогинились как доменный администратор на компьютере под Windows 7, который входит в Ваш домен. Теперь, предположим, Вы хотите сменить пароль локального администратора на удаленном сервере CHI-WIN7-22 в Чикаго. После использования пароля в течение определенного периода времени, его желательно сменить; процедуру необходимо повторять периодически.
Первое, что администратор делает для смены пароль администратора — создает ADSI объект для локального администратора на этом компьютере. Это делается в PowerShell следующим образом:
[ADSI]$Admin=”WinNT://CHI-WIN7-22/Administrator”
Произойдет извлечение учетной записи администратора на сервере CHI-WIN7-22 и присвоение ее ADSI объекту $Admin. Имя WinNT в этой строке чувствительно к регистру, примите это во внимание. Если Вы захотите подключиться к другому компьютеру, просто замените CHI-WIN7-22 на имя того компьютера, к которому Вы хотели бы подключиться.
Однако для начала необходимо узнать, как долго пароль используется, чтобы определить, пришло ли время менять его или нет. Информация из $Admin может быть получена следующим образом:
$Admin.PasswordAge
Выведется время, прошедшее с последней смены пароля. Результат показывается в секундах, переведем ее в дни (осуществим деление на 86400 (количество секунд в сутках)):
$Admin.PasswordAge.Value/86400
Обратите внимание, что было использовано свойство Value. Это было сделано потому, что PasswordAge хранится как коллекция, и поэтому нам необходимо сначала присвоить значение этой коллеции, чтобы вернуть ее в число, к которому можно применить операцию деления.
В итоге Вы можете изменить пароль, вызвав SetPassword метод и затем использовав новый пароль в качестве аргумента.
$Admin.SetPassword(“S3cre+WOrd”)
Внимание: По нажатию Enter, не ждите получения письмо подтверждения. Такового не будет! Изменения будет применены немедленно. То, что я здесь продемонстрировал, является методом, а не командлетом. Помимо прочего это значит, что в отличие от командлетов, SetPassword не поддерживает -whatif или -confirm.
Это все. Позвольте мне продемонстрировать все это PowerShell-картинках.
2. Перезагрузка или остановка сервера
Двигаемся дальше. Перед нами стоит задача перезагрузить или остановить сервер с помощью PowerShell. Как и в первом случае, предположим, что вы залогинены как доменный администратор на машине под Windows 7, которая входит в ваш домен.
Мы будем использовать два WMI-командлета – Restart-Computer и Stop-Computer. И хотя мы не будем их здесь показывать, стоит упомянуть, что эти командлеты принимают альтернативные учетные данные (alternate credentials). Альтернативные учетные данные позволяют Вам уточнить учетную запись пользователя (отличную от той, под которой вы залогинились), так что вы можете осуществлять действия, на которые эта (альтернативная) учетная запись имеет права.
Также среди приятного об этих командлетах – вы сможете использовать -whatif и -confirm. Это значит, если вы захотите перезапустить или выключить сервер, необходимо сначала убедиться, что вы делаете это на предназначенном для этого компьютере. Это удобно, когда вы осуществляете подобные операции с множеством компьютеров.
Для перезагрузки компьютера синтаксис такой:
Restart-Computer -ComputerName <string[ ]>
где -ComputerName <string[ ]> это массив строк, который может состоять как из имени одного, так и нескольких компьютеров. Stop-Computer используется практически тот же самый синтаксис. Например, если Вы хотите перезагрузить два компьютера CHI-DC02 и CHI-FP01, используйте следующую команду:
Restart-Computer “CHI-DC02”, “CHI-FP01”
Ниже приведен фактически скриншот PowerShell, в котором мы использовали аргумент –whatif. Используйте его, если вы просто хотите посмотреть, что случиться, если вы выполните команду.
Все достаточно просто. Давайте теперь усложним задачу. Предположим, что у вас есть список компьютеров в файле servers.txt. Используем командлет Get-Content, чтобы извлечь их имена из файла.
Итак, у вас есть ряд компьютеров, которые вы бы хотели периодически перезагружать, и вы храните их имена в текстовом файле. Каждый раз, когда вам нужно перезагрузить их, вы просто используйте командлет Get-Content. Ниже представлен пример работы Get-Content и Restart-Computer.
Сначала мы получаем содержимое файла, используя Get-Content. Для начала пропингуем этим компьютеры. В этом выражении, мы запустим test-connection, что фактически эквивалентно ping на каждом компьютере. -quiet возвращает значения true или false, а -count 2 означает, что каждый компьютер будет “пропингован” лишь дважды. Те компьютеры, которые будут успешно пропингованы, будут дальше запущены в работу.
Затем мы используем foreach. Цель этого такова: для каждого имени, которое проходит пинг-тест, выводится сообщение зеленым текстом, указывающее на перезагрузку компьютера. “$_” означает текущий объект в конвейере. Затем используем командлет Restart-Computer для перезагрузки тех компьютеров, которые пингуются. Мы также используем параметр –force, чтобы сбросить всех, кто залогинен на данном компьютере
Параметр –whatif используется для того, чтобы посмотреть, что произойдет, без реальной перезагрузки компьютеров.
3. Перезагрузка службы
Restart-Service, как следует из название, это командлет, который перезапускает службу. Хотя у него и отсутствует возможность подключаться к удаленному серверу, может быть активирован PowerShell Remoting, так что Вы можете выполнять ее локально на удаленном компьютере. Это бывает полезно, когда Вы хотите перезапустить службу на группе компьютеров.
Для локальной перезагрузки службы просто напишите Restart-Service “service”, где “service” – имя той службы, которую вы хотите перезагрузить. С другой стороны, если вы хотите перезагрузить службы на одной или нескольких удаленных машинах, используйте командлет Invoke-Command и PowerShell Remoting.
На скриншоте ниже показаны два примера работы командлеты Restart-Service для перезагрузки службы wuauserv (Windows Update). В первом примере Restart-Service выполняется локально. Во втором, она выполняется на удаленном сервере БД CHI-DB01с помощью командлета Invoke-Command.
По умолчанию Restart-Service не выводит никаких объектов, если вы не используете параметр -passthru. Дополнительная информация (Status, Name и другое) – результат его использования. Если служба запущена на нескольких компьютеров и вы хотите перезапустить их также, перечислите их через запятые.
То же самое можно сделать с использование WMI. Создадим WMI объект:
gwmi – это сокращенно для Get-WmiObject.
Давайте посмотрим на методы объекта. Введем Get-Member (сокращенно gm).
Как вы могли заметить, здесь отсутствует метод для перезапуска службы. А это значит, что сначала придется остановить службы через метод StopService и запустить снова с помощью StartService.
Вот как остановить службу, используя метод StopService объекта. Круглая скобка указывает на наличие метода. Если получили ReturnValue равным 0, значит служба успешно остановлена. В противном случае, обратитесь к документации MSDN для класса службы Win32.
Запускаем службу — метод StartService.
Проверяем: запустим команду get-service на этом компьютере. Get-service позволяет получить информацию о службе на удаленном компьютере. Пример запроса для удаленного компьютера CHI-DB01.
4. Остановка процесса
Еще одной частой задачей является остановка процесса. Используем для этого командлет Stop-Process. Он может быть выполнен как локально, так и на удаленной машине (см. пункт 3).
Существует два способа остановки процесса с помощью командлета Stop-Process.
Первый – простой. Запускаете Stop-Process и передаете ему имя или соответствующий ID процесса. Обратите внимание, что мы останавливаем “Calc” (Калькулятор Windows). В данном примере процесс запущен локально.
Второй способ связан с использованием командлета Get-Process для получения одного или нескольких процессов или передачи их в Stop-Process. Для примера взят процесс Notepad. Kill является сокращением для Stop-Process. Notepad запущен локально.
Двигаемся дальше. Перейдем к процессам, запущенным на удаленной машине. Для начала запустим, например, notepad на удаленном компьютере chi-fp01.
Затем, проверим, запущен ли процесс. Для этих целей используем ps, являющимся сокращением для Get-Process.
5. Создаем отчет об использовании дисков
Администраторы должны отслеживать свободное место, оставшееся на серверах. Это можно сделать, использовав WMI и класс Win32_LogicalDisk, которые дают нам информацию такую как ID устройства, размер диска, свободное места и прочую информацию.
Через WMI мы можем обращаться к локальным и удаленным компьютерам. Мы также можем выполнять эти запросы как одной, так и нескольких машинах. Также мы можем: экспортировать данные в .csv или базу данных, создавать текстовый или HTML-отчет или просто вывести результаты на экран.
Пример команды, выполняемой на локальном компьютере.
Get-WmiObject win32_logicaldisk -filter “drivetype=3” | Out-File c:\Reports\Disks.txt
Мы используем командлет GetWmiObject для возвращения информации из класса Win32_LogicalDisk. Затем мы применяем -filter чтобы возвратить только информацию, для которой справедливо утверждение drivetype=3, которое означает фиксированные логические диски, типа C:. Это значит, что информация относительно о USB и сетевых дисках не будет включена. Полученная информация будет записана в файл Disks.txt.
Пример в PS.
Хотя вроде бы все нормально, лучше внести парочку улучшений. Например, добавить отображение свободного места в гигабайтах, а не байтах. Этим мы и займемся.
Чтобы это сделать создадим функцию Get-DiskUtil. Хотя в предыдущем примере мы все делали интерактивно, в этом случае давайте запишем функцию в файл, загрузим в ваш профиль к другим скриптам, которые можно использовать позже.
А вот и сама функция:
Давайте ее разберем.
Функция берет имя компьютера как параметр и задает его как имя локального компьютера по умолчанию.
Затем мы используем фрагмент скрипта Process, где свойство “имя компьютера” передается в функцию. “$_” указывает, что имя компьютера задается как переменная. В противном случае имя компьютера как будет воспринято как параметр.
Далее следует выражение GetWmiObject.
Вывод этого выражения передается в командлет Select-Object (сокращенно Select). Мы используем хеш-таблицы, чтобы создать пользовательское свойство под названием Computername. Фактически будет осуществлено переименование SystemName текущего объекта ($_) в Computername. DeviceID остается неизменным.
Сделаем еще парочку хеш-таблиц. Первая берет свойство Size и делит его на 1GB, вывод будет с двумя знаками после запятой и переименовывает свойство в SizeGB. Вторая производит то же самое со свойством Freespace.
Затем создаем свойство UsedGB, которого нет в WMI. Вычисляется разница между свойствами Size и FreeSpace и делится на 1GB.
В конце создаем еще одно свойство PerFree – свободно в процентах. Оно завершает функцию.
Ниже приведена работа функции для компьютера CHI-FP01, выведенная в таблице (Format-Table (или ft)) с авто форматированием (параметр –auto).
Все и так хорошо, но от этой функции мы можем получить больше. Поэтому предположим, что вам нужно еженедельно получать отчет об использовании дисков на всех серверах в вашей компании. Посмотрим, как этого можно достичь.
Для начала сохраним результаты нашего выражения в переменную $data, чтобы каждый раз не набирать эту команду. Затем, передадим результаты в объект where, пропингуем сервера (дважды) и передадим имя компьютера в созданную нами функцию Get-DiskUtil.
Данные будут храниться в переменной $data. Вы можете вытащить информацию из $data и отсортировать по computername, применив –auto. Информация также может быть направлена на печать (Out-Printer) или в файл (Out-File).
Конвертируем в csv:
Потом Вы можете импортировать этот csv файл для получения снимка статуса использования дисков на момент запуска команды:
Пример:
И напоследок: я покажу, как создать HTML отчет, доступ к которому можно получить из любого места.
Берем $data и передаем ее в Sort Computername. Результат передается в командлет ConvertTo-HTML. Вы можете присвоить заголовок и путь CSS. CSS необходим, так как ConverToHTML не обладает возможностями форматирования. Поэтому если вы хотите, чтобы отчет выглядит прилично, понадобится CSS файл. На последнем этапе пишем результат в файл.
Теперь файл готов, его можно посмотреть с помощью команды start.
Пример HTML отчета.
Помните, что информацию необходимо держать информацию актуальной.
Upd:
В посте приведен перевод статьи с портала petri.co.il
Top 10 Server 2008 Tasks done with PowerShell – Part 1
Вторую часть перевода смотрите здесь.
P.S. Не могли не обратить внимание, что та же задача получения информации о свободном месте на дисках может решаться с помощью нашей бесплатной программы NetWrix Disk Space Monitor.
Посмотреть как программа работает можно на youtube, cкачать здесь , а активировать бесплатную лицензию без ограничения срока действия (и вообще без каких либо ограничений) можно используя следующие данные:
License name: NetWrix Disk Space Monitor Freeware License
License count: 1000000
License code: EhEQEhoaEhEQEhYTEhYaExQa