Для обновления политик Active Directory, вместо команды CMD gpudate, в Powershell используется Invoke-GPUpdate. В этом статье будут рассмотрены примеры обновления политик как для всего AD, так и для отдельной OU.
Сама команда идет в комплекте с ролью AD или установленным RSAT.
Обновление GPO на одном компьютере
Представим, что у нас есть компьютер 'CL5' и мы хотим обновить политики, которые предназначены для компьютера или пользователя. Это можно сделать так:
Invoke-GPUpdate -Computer 'CL5'
Для работы этой команды, а так же большинства других с возможностью удаленного подключения, должен работать PSRemoting.
По умолчанию эта команда не применяет новые политики моментально, а делает это с определенным интервалом. Что бы избежать этого нужно указать параметр:
- RandomDelayInMinutes - где значение 0 обозначает "моментальное обновление". Кроме этого можно указать значение в минутах, которое будет определять время обновления политик после запуска команды.
В документации Microsoft написано, что для значений больших чем 0 так же применяется "случайное смещение", но как оно вычисляется мне выяснить не удалось. Такой подход используется, если вы ожидаете какую-то большую нагрузку на сеть или сервер.
В этом примере политики будут применены моментально:
Invoke-GPUpdate -Computer 'CL5' -RandomDelayInMinutes 0
При этом у пользователей появится следующее окно, которое нельзя никак скрыть:
Как и с gpupdate в CMD мы можем указать источник применения политики в Target:
- User - обновить GPO предназначенные для пользователя;
- Computer - обновить GPO для компьютера.
Сами политики могут не применяться, например, до повторного входа пользователя или перезагрузки. Если такие действия необходимы можно использовать следующие ключи:
- Boot - компьютер будет перезагружен после того, как политика будет скачена;
- LogOff - после применения политики пользователю выйдет из под своей учетной записи для повторного входа.
Пример работы с обоими ключами:
Invoke-GPUpdate -Computer 'CL5' -RandomDelayInMinutes 0 -Target 'User' -LogOff -Force
Force исключает ситуацию, где у пользователя будет запрошено подтверждение на какое-то действия (на выход например). Окно с примером, где этого ключа не было:
Возможные проблемы
Некоторые GPO так и не вступили в действие при использовании ключей Boot и LogOff. Просто отображалось окно аналогичное показанному на изображении выше. После закрытия окна перезагрузка или выход пользователя тоже не произошел.
Команда Boot не перезагружает компьютер, а только выбрасывает пользователя для повторного входа. Возможно это связано с самой политикой, так как она не требовала перезагрузку.
Так же читал про проблемы, которые связаны с отсутствием или использованием старой версии RSAT. Об этом говорят следующие ошибки:
- Invoke-GPUpdate: The term 'Invoke-GPUpdate' not recognized as the name of a cmdlet...
- Invoke-GPUpdate : Имя "Invoke-GPUpdate" не распознано как имя командлета, функции...
Получение списка компьютеров с Get-ADComputer в Powershell
Обновление с использованием AD
Имя каждого компьютера можно найти через следующий запрос:
Get-ADComputer -Filter *
У меня есть организационная единица 'Moscow', в домене 'domain.local'. Что бы найти компьютеры в этом OU можно использовать следующий синтаксис:
Get-ADComputer -Filter * -SearchBase "OU=Moscow,DC=domain,DC=local"
Обновление политик можно сделать через конвейер следующим образом:
(Get-ADComputer -Filter * -SearchBase "OU=Moscow,DC=domain,DC=local").Name |
Invoke-GPUpdate -RandomDelayInMinutes 0 -Force -ErrorAction SilentlyContinue
Ключ -ErrorAction SilentlyContinue позволяет исключить вывод ошибок, которые связаны с выключенными компьютерами.
Если компьютеров в AD много и вам важна скорость обновления - лучше использовать циклы с задержкой:
$computers = (Get-ADComputer -Filter * -SearchBase "OU=Moscow,DC=domain,DC=local").Name
foreach ($computer in $computers){
# Получаем случайное число от 1 до 10
$random_number = Get-Random -Minimum 1 -Maximum 10
# Выполняем обновление с использованием случайного числа для задержки
Invoke-GPUpdate -RandomDelayInMinutes $random_number -Force -ErrorAction SilentlyContinue
}
Получаем в Powershell активных сессий пользователей AD и их компьютеров
...
Подписывайтесь на наш Telegram канал
Теги: #powershell #ad