sergey vasin

The IT blog

Используем PowerShell для определения серверов, требующих перезагрузки – Hey, Scripting Guy! Blog

leave a comment »

Резюме: Microsoft Scripting Guy, Ed Wilson рассказывает об использовании Windows PowerShell для определения требующих перезагрузки серверов.

Определяем серверы, требующие перезагрузки

Для определения всех серверов, которым нужна перезагрузка после установки обновлений, нам нужно проверить реестр сервера на наличие следующего ключа:

HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

В случае, если нет файлов, требующих переименования, ключ PendingFileRenameOperations отсутствует. Операция переименования происходит когда один файл замещается другим, и новый файл переименовывается, чтобы занять место оригинального файла. Этот ключ реестра показан на следующем рисунке.

01

Используем модуль ActiveDirectory для получения списка всех серверов

Для того, чтобы найти все серверы, мы воспользуемся модулем ActiveDirectory и командлетом Get-ADComputer. Мы запустим этот командлет со значением OperatingSystem для параметра –Properties и передадим результаты командлету Where-Object, где выберем только те компьютеры, в названии операционной системы которых содержится слово server.

Import-Module ActiveDirectory

$servers = Get-ADComputer -Filter * -Properties operatingsystem |

Where operatingsystem -match ‘server’

Находим запись реестра на удаленных компьютерах

Теперь мне нужно определить, присутствует ли на компьютере запись PendingFileRenameOperations. Для этого существует множество способов. Я же буду использовать командлеты Invoke-Command и Get-ItemProperty.

Заметка: Для того, чтобы использовать локальную переменную на удаленном компьютере вам нужно использовать модификатор $using (появившийся в Windows PowerShell 3.0). В ином случае, командлет Invoke-Command будет искать эту переменную на удаленном компьютере, что может привести к ошибкам, которые будет трудно диагностировать.

В приведенном примере командлет Invoke-Command запускает код, указанный в параметре ScriptBlock на каждом сервере из переменной $servers. Для получения имени каждого сервера я использую новую функциональность Windows PowerShell 3.0 — автоматический foreach. Я указываю значение silentlycontinue (цифровое значение — 0) для параметра ErrorAction (EA – его алиас), чтобы предотвратить появления сообщений об ошибках в консоли. Это сделано потому, что для получения записи реестра мы используем командлет Get-ItemProperty, который возвращает сообщение об ошибке в случае ее отсутствия. $Using:path передает командлету значение локальной переменной path, а $Using:name передает значение локальной переменной name. Этот код приведен ниже.

Invoke-command -ComputerName $servers.name -Ea 0 -ScriptBlock {

Get-ItemProperty -Path $using:path -Name $using:name}

Теперь я воспользуюсь командлетом Select-Object для того, чтобы выбрать только имя компьютера и информацию о существовании ключа реестра

Select-Object pscomputername, @{

LABEL=’RebootRequired’;

EXPRESSION={if($_.PendingFileRenameOperations){$true}}}

Запустив скрипт, мы получим список компьютеров, требующих перезагрузки.

02

Поскольку командлет возвращает объекты, содержащие имя компьютера, его результаты могут быть переданы командлету Restart-Computer.

Автор:

Ed Wilson, Microsoft Scripting Guy

Оригинал:

http://blogs.technet.com/b/heyscriptingguy/archive/2013/02/20/use-powershell-to-find-servers-that-need-a-reboot.aspx


Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Written by Сергей Васин

Апрель 2, 2013 в 11:37

Опубликовано в HeyScriptingGuyBlog, PowerShell

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s