Проблема
Требуется обеспечить принудительное выключение определенных клиентских компьютеров в ночное время. Все компьютеры являются членами домена 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.” – текст уведомления; замените на свой собственный.
Как сделать выборку компьютеров?
Можно, конечно, вручную создать текстовый файл, в котором перечислить все компьютеры, которые следует выключать. А можно автоматизировать создание актуальной выборки на основе данных из 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