Заметки · 19.12.2025

Без права на выключение

Очередной пост со знатной предысторией. Как-то пользователь, спутав свой компьютер и удалённый, выключил именно удалённый. Список фобий при работе с mstsc был незамедлительно обновлён.

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

Так вот. Это очередной пост про применение политик без самих групповых политик. Предыдущая история про имитирование групповых политик с помощью записей в реестре пылится где-то здесь.

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

$explorer = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" 
New-ItemProperty -Path $explorer -Name "NoClose" -Value 1 -PropertyType DWord -Force

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

Принцип работы такой — по пути реестра, указанного в переменной $explorer будет создана DWORD-запись NoClose со значением 1. Если изначальный функционал управления питанием потребуется вернуть — замените 1 на 0 и снова выполните команду.

Разумеется, любые действия с реестром стоит осуществлять только от имени администратора.

К сожалению, этого может оказаться мало, так как кнопка Выключения останется на экране блокировки. Удаляем и её:

$lockscreen = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
New-ItemProperty -Path $lockscreen -Name "ShutdownWithoutLogon" -Value 0 -PropertyType DWord -Force

Принцип тот же. Меняется только параметр и ветка реестра. Кстати, этой настройкой можно воспользоваться отдельно, чтобы запретить кому-либо выключать компьютер не пройдя сначала авторизацию.

Конечно, всё указанное выше можно соединить в один очень полезный ps1-скрипт, запуская его по необходимости. Впрочем, знатоки могут упрекнуть мой метод работы с реестром в нахальности. И, думаю, будут полностью правы.

По правилам хорошего тона, сначала нужно проверить существует ли нужная запись в реестре по предполагаемому пути, а уже потом вносить изменения в существующую запись или создавать новую. Но это по правилам хорошего тона. Я же предложил просто форсировать создание записи без реверансов.

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

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

Stop-Computer -Force

Ну, или этим для перезапуска:

Restart-Computer -Force

А вот итоговый вариант для копипасты:

# Скрыть выключение из меню Пуск #
$explorer = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" 
New-ItemProperty -Path $explorer -Name "NoClose" -Value 1 -PropertyType DWord -Force

# Скрыть выключение с экрана блокировки #
$lockscreen = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
New-ItemProperty -Path $lockscreen -Name "ShutdownWithoutLogon" -Value 0 -PropertyType DWord -Force

И, напоследок, если необходимо применить настройку на удалённом компьютере с помощью WinRM и PSRemoting (где-то здесь даже есть модуль) — воспользуйтесь такой склейкой:

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name "NoClose" -Value 1 -PropertyType DWord -Force; New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ShutdownWithoutLogon" -Value 0 -PropertyType DWord -Force

На этом у меня сегодня всё.