Решаем 9 задач управления Windows Server 2008 с помощью PowerShell
Upcoming SlideShare
Loading in...5
×
 

Решаем 9 задач управления Windows Server 2008 с помощью PowerShell

on

  • 861 views

 

Statistics

Views

Total Views
861
Views on SlideShare
861
Embed Views
0

Actions

Likes
0
Downloads
4
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft Word

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Решаем 9 задач управления Windows Server 2008 с помощью PowerShell Решаем 9 задач управления Windows Server 2008 с помощью PowerShell Document Transcript

  • ОглавлениеВведение......................................................................................................................................................31. Меняем пароль локального администратора......................................................................................32. Перезагрузка или остановка сервера....................................................................................................53. Перезагрузка службы..............................................................................................................................84. Остановка процесса ..............................................................................................................................125. Создаем отчет об использовании дисков...........................................................................................136. Получаем 10 последних ошибок журнала событий...........................................................................207. Сброс контроля доступа к папке..........................................................................................................248. Получение информации о времени работы сервера (uptime) .........................................................279. Получение информации о service pack ...............................................................................................31
  • ВведениеПорою с помощью PowerShell управлять WindowsServer 2008 можно гораздо быстрее, чемс помощью привычных GUI-инструментов. В этой статье вы найдет 9 наиболеераспространенных задач, которые могут быть реализованы с помощью PowerShell.В руководстве будут рассмотрены следующие задачи:1. Изменение пароля локального администратора с помощью PowerShell2. Перезагрузка или выключение сервера3. Перезапуск службы4. Остановка процесса5. Создание отчета об использовании диска6. Получаем 10 последних ошибок журнала событий7. Сбрасываем контроль доступа к папке8. Получаем server‘suptime9. Получаем информацию о ServicePack1. Меняем пароль локального администратораПредположим Вы залогинились как доменный администратор на компьютере подWindows7, который входит в Ваш домен. Теперь, предположим, Вы хотите сменить парольлокального администратора на удаленном сервере 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. Ихотя мы не будем их здесь показывать, стоит упомянуть, что эти командлеты принимаютальтернативные учетные данные (alternatecredentials). Альтернативные учетные данныепозволяют Вам уточнить учетную запись пользователя (отличную от той, под которой вы
  • залогинились), так что вы можете осуществлять действия, на которые эта(альтернативная) учетная запись имеет права.Также среди приятного об этих командлетах – вы сможете использовать -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, как следует из название, это командлет, который перезапускаетслужбу. Хотя у него и отсутствует возможность подключаться к удаленному серверу,может быть активирован PowerShellRemoting, так что Вы можете выполнять еелокально на удаленном компьютере. Это бывает полезно, когда Вы хотите перезапуститьслужбу на группе компьютеров.Для локальной перезагрузки службы просто напишите Restart-Service “service‖, где―service‖ – имя той службы, которую вы хотите перезагрузить. С другой стороны, если выхотите перезагрузить службы на одной или нескольких удаленных машинах, используйтекомандлетInvoke-Command и PowerShellRemoting.На скриншоте ниже показаны два примера работы командлетыRestart-Serviceдляперезагрузки службы wuauserv(WindowsUpdate). В первом примере 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:ReportsDisks.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и передаем ее в SortComputername. Результат передается вкомандлетConvertTo-HTML. Вы можете присвоить заголовок и путь CSS. CSS необходим,так как ConverToHTMLне обладает возможностями форматирования. Поэтому если выхотите, чтобы отчет выглядит прилично, понадобится CSS файл. На последнем этапепишем результат в файл.
  • Теперь файл готов, его можно посмотреть с помощью команды start.Пример HTML отчета.Помните, что информацию необходимо держать информацию актуальной.
  • 6. Получаем 10 последних ошибок журнала событийКаждое утро, вы возможно просматриваете журналы событий в поисках 10 последнихошибок в системном журнале событий на одном или нескольких компьютерах. Упроститьэту задачу можно с помощью командлетаGet-EventLog.Нужно уточнить имя журнала событий и тип записи. Типичная команда для конкретнойзадачи выглядит так:В нашем случае взят журнал событий ‗system‘ и тип записи ‗Error‖. Если мы не уточняемимя компьютера, информация собирается с локальной машины.Обратите внимание на сообщения (Колонка Message), которые выведены не полностью.Давайте немного изменим команду, что бы мы могли их видеть полностью.Мы просто передали выход предыдущей команды в ft, сокращение для Format-Tableизадали отображения для таблицы следующих свойств: Timewritten, Source, EventIDи
  • Message. Мы также добавили -wrapи -autoдля более красивого отображения. -wrapактивирует обтекание текстов, а -auto– автоматическое форматирование.Как это выглядит:Создадим еще один вариант данной команды. Она сортирует свойства по Sourceи затемосуществляет их группировку. Вывод передается в moreдля отображения только того,что помещается на экран.Пример:
  • Обратите внимание, что элементы сгруппированы по источнику. Сначала идет EventLog,затем Microsoft-Windows-GroupPolicy. — More – указывает на завершенияотображения, необходимо нажать любую клавишу для того, чтобы посмотретьдополнительную информацию.Все эти Get-EventLogкоманды, которые были продемонстрировали, запущены налокальном компьютере. Теперь покажем, как это сделать на удаленной машине.Например, мне необходимо посмотреть 5 последний ошибок на контроллерах домена вофисе в Чикаго (имена компьютеров chi-dc01 и chi-dc02). Предположим, что мненеобходимо отсортировать и сгруппировать результаты по MachineName. Я также хотел
  • бы отобразить следующие свойства Timewritten, Source, EventIDи Message. И сновадобавляю -wrap, -autoиmore ―для красоты‖.Получаем на выходе.Рассматривая задачу №5 (получение информации по свободному месту на дисках), мырассматривали как можно сделать HTML отчет и выложить его на Интернет сервер; то жеможно сделать и с данной задаче.
  • 7. Сброс контроля доступа к папкеПримеров, когда NTFS права на папку настроены не так, как надо, множество. Если этослучается, вы, возможно, захотите, спросить контроль доступа к этой папке. Этореализуется с помощью командлетаSet-Acl(Set-ACL).Самый просто подход – использовать Get-Aclдля извлечения ACL (AccessControlList) из―хорошей‖ папки и копировать его в проблематичную папку. Произведется заменаимеющегося ACL. Хотя и можно создать ACL объект с нуля, первый метод (копирование)желателен, и сейчас я продемонстрирую почему.Предположим, что имеется на компьютере CHI-FP01 папка sales и у этой папки есть―хорошая‖ копия ACL. Копируем ACL и сохраняем в переменную $acl.Давайте взглянем на информацию в ACL:Видите свойство Accessсправа? Фактически это другой объект. Чтобы посмотреть егосодержимое, выполним команду:Что внутри:
  • Как Вы видите, это записи контроля доступа. Если Вы хотите видеть только ссылки(identityreferences), чьи имена совпадают с ―Sales‖, то выполните следующую команду:
  • Теперь если мы используем ту же команду, чтобы посмотреть содержимое свойстваAccess, принадлежащего созданной папке chicagosales, мы ничего не получим. Обратитевнимание на использование сокращений:Одной из возможных причин, почему значения не выводятся, может быть некорректнаявыдача NTFS прав.Очевидно, что решение этой проблемы – копировать ―хороший‖ ACL в ―плохой‖. Но дляначала нужно получить текущие NTFS права папки chicagosales и сохранить в XML файл.Это необходимо для восстановления ACL, если вдруг что-то пойдет не так (импортируемXML файл).После того, как это сделано, запускаем команду Set-Aclдля chicagosales, используя $acl,скопированную из хорошей папки.
  • Проверим, успешно ли осуществлена процедура: Используем ту же команду, которую мыиспользовали ранее для отображения ссылок на тех, чьи имена совпадают с ―Sales‖.Теперь chicagosales NTFS разрешения те же, что и для папки sales. Таким образом, у васесть простой способ управления разрешениями, позволяющий оперативно разрешитьпроблемы контроля доступа.8. Получение информации о времени работы сервера (uptime)Вашем руководству возможно будет интересно регулярно получать информацию овремени работы сервера. Используем для этого WMI класс Win32_OperatingSystem. Онвыведет время работы. Возможен локальный и удаленный запуск команды. Свойство,которое нас интересует, LastBootUpTime. Но так как оно отображается в WMI формате,нам нужно будет конвертировать в более приемлемый формат.
  • Начнем с примера запуска локально под Windows 7.Сначала сохраним результаты GetWmiObjectв переменную $wmi.В $wmiприсутствует несколько свойств, с которыми мы будем работать, а именноCSName (имя компьютера) иLastBootUpTime.LastBootUpTimeотображается WMI формате, поэтому его нужно отконвертировать.Сохраним отконвертированное значение в переменную $boot.Мы используем метод ConverToDateTime, который включен во все WMI объекты,которые вы получаете, когда запускаетеGetWmiObject. Параметр, который выпередаете в этот метод — свойство LastBootUpTimeWMI объекта $wmi.Запросив информацию о $boot, вы получите следующее, что гораздо нагляднеепредыдущего варианта LastBootUpTime:
  • Для определения времени работы машины, вычитываем $bootиз текущих даты/времени,которые могут быть получены с помощью Get-Date.Результат выводится как TimeSpan объект. Отконвертируем его в строку для болеенаглядного представления с помощьюToString().Мы видим, что машина была запущена 2 дня 5 часов 46 минут и т.д.А теперь все, что мы рассмотрели, запишем в виде функции под названием get-boot.Сначала посмотрим на нее полностью.
  • У функции есть параметр, который берет имя компьютера и делает его именемлокального компьютера по умолчанию.Затем мы используем фрагмент скрипта Process, где свойство ―имя компьютера‖передается в функцию. ―$_‖ указывает, что имя компьютера задается как переменная. Впротивном случае имя компьютера как будет воспринято как параметр.Включенное в фрагмент скрипта Processвыражение GetWmiObjectуточняет имяудаленного компьютера.Здесь также будет несколько хеш-таблиц. Свойство CSNameпоменяем наComputername, так мы сможем получить более наглядное отображение. СвойствоLastBootпредставляет собой значение LastBootUpTime, отконвертированное сиспользование метода ConvertToDateTime(). И еще есть свойство Uptime, котороепредставляет собой TimeSpan объект, показывающий, как долго машина была запущена.Если мы запускаем скрипт локально (например, нам не нужно уточнять имя компьютера),функция по умолчанию берет имя локального компьютера. Вот что получится на выходе:
  • Как в случае с задачей 2 предыдущего поста (―Перезагрузка или выключение сервера‖),Вы можете сохранить имена серверов в текстовый файл, обрабатывать те, которыепингуются и передавать их имена в функцию get-boot.9. Получение информации о servicepackПолучать информацию о servicepack важно по ряду причин. Во-первых, вы можете быть впроцессе установки обновления и вам важно нужно найти компьютеры с определѐннымSP. Во-вторых, вы можете осуществлять инвентаризацию или аудит ваших компьютеров,поэтому информация о SP вам будет нужна.Для этого мы снова будет использовать WMI и класс Win32_Operating System. Обратитевнимание на некоторые свойства: theServicePackMajorVersion– целое число (1, 2 или0); ServicePackMinorVersionи CSDVersion, которое выводит информацию в строку,например, ―ServicePack 1‖.
  • При работе нас интересуют в первую очередь свойства CSName(имя компьютера),Caption(ОС), CSDversionиServicePackMajorVersion.Типичное выражение выглядит следующим образом:Как мы видим эта машина под Windows 7 не использует ни один SP, поэтомуServicePackMajorVersion равно 0, а CSDVersion пусто.Создадим функцию Get-SP. В качестве параметра возьмем имя компьютера, поумолчанию совпадающее с именем локального компьютера.И снова мы используем блок скрипта Process. Так что если имя компьютера передается,переменная $computernameбудет установлена в качестве передаваемого объекта.Основная часть функции – выражение класса Get-Wmiobject/Win32_operatingsystem.Как и прежде, создадим пару хеш-таблиц. CSNameпереведем в ComputerName. Вместосвойства CaptionиспользуемOperatingSystem. А вместо CSDVersion— SPName.Наконец, вместо ServicePackMajorVersionиспользуем простоVersion.
  • Вот пример функции, запущенной локально:Теперь можно взять компьютеры из текстового файла, пропинговать их и передать ихимена в созданную функцию get-sp. Результат:
  • Можно видеть, что у CHI-DC02 отсутствует ServicePack 1, который только недавно былвыпущен для Server 2008 R2. А это дает основания задуматься об обновлении ServicePackна этом компьютере.