Взято: http://agorbunov.blogspot.com/2010/11/blog-post.html

Проблема


Требуется обеспечить принудительное выключение определенных клиентских компьютеров в ночное время. Все компьютеры являются членами домена Active Directory.

Теория


Как удаленно выключить компьютер?

Вариантов удаленного выключения существует довольно много:

  • через графическую консоль Управление компьютером (Computer Manager), подключенную к удаленному компьютеру;
  • через штатную утилиту shutdown.exe;
  • с помощью сценария PowerShell;
  • и т.п.

На мой взгляд, для автоматизации задачи массового принудительного удаленного выключения компьютеров лучше всего подходит утилита PsShutdown.exe, являющаяся частью пакета PsTools.

Вариант команды PsShutdown может быть таким:

C:\>PsShutdown \\XP01 -s -f -t 300 –c –n 10 -e p:0:0 –m "Night shutdown. Please contact Servicedesk if you have any questions. Servicedesk phone: 123-45-67."

Описание используемых ключей:

\\XP01 – имя удаленного компьютера, можно заменить файлом со списком компьютеров (например, @C:\Scripts\Computers.txt)

-s – выключение компьютера (если все компьютеры поддерживают режим гибернации, можно заменить ключом –h);

-f – принудительное закрытие всех открытых приложений;

-t 300 – указание времени в секундах, в течение которого выводится окно уведомления о выключении компьютера;

-c – опция, позволяющая пользователю удаленного компьютера отменить выключение (пользователю будет выводиться кнопка Cancel);

-n 10 – максимальное время в секундах, отводимое на подключение к удаленному компьютеру;

-e p0:0 – указание, что выключение является плановым;

-m “Night shutdown. Please contact Service Desk if you have any questions. Service Desk phone: 123-45-67.” – текст уведомления; замените на свой собственный.

image

Как сделать выборку компьютеров?

Можно, конечно, вручную создать текстовый файл, в котором перечислить все компьютеры, которые следует выключать. А можно автоматизировать создание актуальной выборки на основе данных из Active Directory.

Проще всего сделать выборку с помощью утилиты dsquery.exe, присутствующей на серверах или в составе пакета RSAT.

Ниже приведен вариант выборки, создающей список всех компьютеров из контейнера Desktops в домене corp.gorbunov.pro:

C:>DSQUERY *  "OU=Desktops,DC=corp,DC=gorbunov,DC=pro" -filter (objectCategory=computer) -attr name -l > C:\Scripts\Computers.txt

Результат выборки – файл C:\Scripts\Computers.txt со списком имен компьютеров.

Финальное решение


Шаг 1

Создаем на сервере папку C:\Scripts, в которую копируем утилиту PsShutdown.exe.

Шаг 2

В папке C:\Scripts создаем пакетный файл под названием RemoteShutdown.bat.

Файл создает выборку C:\Scripts\Computers.txt и затем запускает массовое выключение компьютеров из выборки.

Для контроля работы файла RemoteShutdown.bat создается файл журнала RemoteShutdownLog.txt.

Листинг файла RemoteShutdown.bat:

@ECHO OFF

DSQUERY * "OU=Desktops,DC=corp,DC=gorbunov,DC=pro" -filter (objectCategory=computer) -attr name -l > C:\Scripts\Computers.txt

C:\Scripts\PsShutdown -s -f -t 300 -c -n 10 -e p:0:0 -m "Night shutdown. Please contact Servicedesk if you have any questions. Servicedesk phone: 123-45-67." @C:\Scripts\Computers.txt > C:\Scripts\RemoteShutdownLog.txt

Для своей сети замените OU=Desktops,DC=corp,DC=gorbunov,DC=pro на путь к своему домену и контейнеру с компьютерами. Фильтр objectCategory=computer можно заменить на свой LDAP-запрос.

Шаг 3

В папке C:\Scripts создаем пакетный файл под названием CancelShutdown.bat.

Этот файл будет полезным для экстренной отмены выключения.

Листинг файла CancelShutdown.bat:

C:\Scripts\PsShutdown -a -n 10 @C:\Scripts\Computers.txt

Шаг 4

Добавляем на сервере файл RemoteShutdown.bat в Планировщик заданий для запуска, например, ежедневно в 22:00.

 

Подробнее об утилите DSQUERY:
http://technet.microsoft.com/en-us/library/cc754232.aspx

Подробнее об утилите PsShutdown:
http://technet.microsoft.com/ru-ru/sysinternals/bb897541.aspx