Обновление политик AD с командой Powershell Invoke-GPUpdate


22 июня 2020


Удаленное обновление политик AD с Powershell Invoke-GPUpdate на примере

Для обновления политик 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

При этом у пользователей появится следующее окно, которое нельзя никак скрыть:

Применение политик AD удаленно с Powersell Invoke-GPUdate

Как и с gpupdate в CMD мы можем указать источник применения политики в Target:

  • User - обновить GPO предназначенные для пользователя;
  • Computer - обновить GPO для компьютера.

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

  • Boot - компьютер будет перезагружен после того, как политика будет скачена;
  • LogOff - после применения политики пользователю выйдет из под своей учетной записи для повторного входа.

Пример работы с обоими ключами:

Invoke-GPUpdate -Computer 'CL5' -RandomDelayInMinutes 0 -Target 'User' -LogOff -Force

Force исключает ситуацию, где у пользователя будет запрошено подтверждение на какое-то действия (на выход например). Окно с примером, где этого ключа не было:

Запрос на применение политик AD удаленно с Powersell Invoke-GPUdate

Возможные проблемы

Некоторые GPO так и не вступили в действие при использовании ключей Boot и LogOff. Просто отображалось окно аналогичное показанному на изображении выше. После закрытия окна перезагрузка или выход пользователя тоже не произошел.

Команда Boot не перезагружает компьютер, а только выбрасывает пользователя для повторного входа. Возможно это связано с самой политикой, так как она не требовала перезагрузку.

Так же читал про проблемы, которые связаны с отсутствием или использованием старой версии RSAT. Об этом говорят следующие ошибки:

  • Invoke-GPUpdate: The term 'Invoke-GPUpdate' not recognized as the name of a cmdlet...
  • Invoke-GPUpdate : Имя "Invoke-GPUpdate" не распознано как имя командлета, функции...

 

Обновление с использованием AD

Имя каждого компьютера можно найти через следующий запрос:

Get-ADComputer -Filter *

Получение компьютера AD в Powershell

У меня есть организационная единица 'Moscow', в домене 'domain.local'. Что бы найти компьютеры в этом OU можно использовать следующий синтаксис:

Get-ADComputer -Filter * -SearchBase "OU=Moscow,DC=domain,DC=local"

Получение компьютера из OU AD в Powershell

Обновление политик можно сделать через конвейер следующим образом:

(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


Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, преобретенного опыта и лучшие практики в системном администрировании и программировании.