Очередной пост со знатной предысторией. Как-то пользователь, спутав свой компьютер и удалённый, выключил именно удалённый. Список фобий при работе с 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
На этом у меня сегодня всё.