Заметки о Windows и других программных продуктах Microsoft...

LogOff, Shutdown и Reboot с помощью WMI и PowerShell

LogOff, Shutdown и Reboot с помощью WMI и PowerShell

Для того, чтобы выключить, перезагрузить компьютер или завершить сеанс пользователя, в PowerShell можно воспользоваться методами WMI-класса Win32_OperatingSystem.

Для начала выведем список методов класса:

Get-WmiObject Win32_OperatingSystem | Get-Member -MemberType Method

методы класса Win32_OperatingSystem

 

Если вам надо просто перезагрузить или выключить компьютер, то подойдут методы Reboot и Shutdown соответственно. К примеру, для перезагрузки надо выполнить такую команду:

(Get-WmiObject Win32_OperatingSystem -EnableAllPrivileges).Shutdown()

Завершение работы с помощью метода Shutdown

 

Обратите внимание на ключ EnableAllPrivileges. Повышение привилегий необходимо для данной операции, без него команда завершится с ошибкой.

ошибка при отсутствии привилегий

 

Следующий метод Win32Shutdown в качестве аргумента принимает параметр (Flags), с помощью которого можно выбрать необходимое действие. Параметр представляет из себя битовую маску и может принимать следующие значения:

Log Off (0) — выход из системы. Останавливает все процессы, связанные с контекстом безопасности текущего пользователя, завершает его сеанс  и отображает диалоговое окно входа в систему.

Forced Log Off (4) — принудительный выход из системы. Выход производится незамедлительно, не дожидаясь завершения процессов пользователя. Это может привести к некорректному завершению работы программ и потере данных.

Shutdown (1) — завершение работы. Завершает работу системы и выключает питание компьютера. При этом все запущенные процессы останавливаются, а содержимое памяти сохраняется на диск. Во время завершения работы система обращается к каждому запущенному приложению и ждет от него подтверждения того, что его можно безопасно завершить.

Forced Shutdown (5) — принудительное завершение работы. Завершает работу системы и выключает питание компьютера. При принудительном завершении работы все запущенные программы и службы, включая WMI, отключаются незамедлительно. Из-за этого может произойти потеря данных, а при запуске на удаленном компьютере вы не сможете увидеть результат выполнения команды.

Reboot (2) — перезагрузка. Завершение работы и перезагрузка компьютера.

Forced Reboot (6) — принудительная перезагрузка. При использовании метода принудительной перезагрузки все запущенные программы и службы незамедлительно завершаются, из за чего может произойти потеря данных.

Power Off (8) — выключение. Завершение работы системы и выключение питания компьютера (если это поддерживается).

Forced Power Off (12) — принудительное выключение. Завершение работы системы и выключение питания компьютера. При принудительном выключении все запущенные программы и службы незамедлительно завершаются, из за чего может произойти потеря данных.

К примеру команда для завершения сеанса пользователя (logoff) будет выглядеть так:

(Get-WmiObject Win32_OperatingSystem -EnableAllPrivileges).Win32Shutdown(0)

logoff с помощью метода Win32Shutdown

 

Ну и самый продвинутый метод Win32ShutdownTracker, который имеет четыре параметра — задержку (Timeout), комментарий (Comment), код причины (ReasonCode) и действие (Flags). Действия указываются аналогично предыдущему методу. Коды причины можно посмотреть здесь, хотя если особой необходимости в них нет, можно просто поставить 0. Для примера принудительно завершим работу системы, укажем таймаут 60 секунд и добавим комментарий:

(Get-WmiObject Win32_OperatingSystem -EnableAllPrivileges).Win32ShutdownTracker(60,"Force shutdown",0,5)

Завершение работы с отсрочкой и вывод комментария

 

Примечание. Для операций LogOff, независимо от указанной задержки выход из системы происходит незамедлительно. Добавить комментарий также невозможно.

 
 
Комментарии

Ну ради общего развития интересно. Также как делать из буханки троллейбус — можно, но зачем? ведь если уже есть ps, то можно restart(stop)-Computer, или еще проще shutdown -l (r, и т д)? Для терминальников есть свой командлет invoke-rduserlogoff

Никогда не знаешь, что может понадобиться. Иногда стандартные методы не подходят и приходится копать глубже. Хотя в целом согласен, для общего развития)

ну допустим надо вырубить сервер который выполнил работу и который включится сам когда надо будет снова работать
можно добавить задание в планировщик и вот там скорей всего restart(stop)-Computer работать не будет
а вот (Get-WmiObject Win32_OperatingSystem -EnableAllPrivileges).Shutdown() сработает с скрипте powershell который может до этой команды выполнить ещё что-то полезное …

в 2020 году пропагандируете Get-WmiObject?

Уточните для новичка, Get-WmiObject устаревшее? Чем можно заменить?

Насчет устаревшего можно поспорить. Ну а если поновее, то есть Get-CimInstance например. То же самое, но через HTTPS.