Обновлено 29.08.2022
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов в рунете Pyatilistnik.org. В прошлый раз мы с вами мы с вами разбирали процедуру создания центрального хранилища административных шаблонов GPO. Движемся дальше и сегодня мы рассмотрим, самую распространенную задачу связанную с групповыми политиками, а именно научимся ее обновлять локально и удаленно, я расскажу в каких ситуациях данная информация вам можете помочь. Мы рассмотрим, какие инструменты у вас есть в арсенале, и я уверяю вас, что вы явно знали не обо всех.
Для чего нужно уметь обновлять групповую политику?
Перед тем, как перейти к практической части я бы хотел описать ряд ситуаций, которые вы можете встретить в своей практике, где вам можете потребоваться ручное обновление GPO. Еще хочу напомнить, что по умолчанию, любая операционная система Windows, являющаяся членом домена AD сама, автоматически производит обновление групповых политик каждые 90-120 минут, это позволяет не генерировать много сетевого трафика и сделать балансировку при обращении к мастеру PDC, но бывают и другие ситуации.
Предположим, что вы внесли важные обновления настроек для ваших серверов, например для авторизации CredSSP, или закрываете какую-то дыру безопасности, логично, что в Active Directory, это делается через групповые политики. Когда у вас 5-10 серверов, то нет проблем чтобы зайти на каждый из них через удаленный рабочий стол и выполнить команду, а когда серверов сотни, тут уже нужна массовость. Еще не нужно сбрасывать со счетов ситуации, когда вы по RDP не можете зайти, через редактор политик обновить не получается, что делать, тут можно сделать все удаленно через PowerShell или командную строку, об этом то же поговорим.
Вы всегда должны уметь и иметь возможность вносить массовые изменения на ваших серверах, и применять их как можно скорее
Методы обновления GPO
Давайте составим список способов и инструментов, которые вы можете использовать:
- Командная строка Windows — позволяет быстро выполнить обновление, работает локально
- Оболочка PowerShell — так же, как и cmd позволяет сделать обновление, как локально, так и удаленно
- Оснастка «Управление групповой политикой» — удаленное обновление GPO, есть возможность выбрать отдельные объекты
- Утилита PsExec — позволяет удаленно выполнить задачу
Давайте теперь опробуем каждый из этих методов.
Как обновить GPO через командную строку
Для выполнения этого метода, вы должны зайти локально на компьютер или сервер, открыть командную строку и ввести вот такую, небольшую команду:
Ключ /force произведет принудительное обновление групповой политики. Хочу отметить, что некоторые настройки могут применяться, только после выхода из системы. Если политика показала, что успешно обновилась, но эффекта не произошло, то смотрите мою статью «Почему не применяются GPO», придется делать траблшутинг.
Как вы можете обратить внимание, что команда выше производит обновление политик, как для пользователя, так и для компьютера, но при желании вы можете этим манипулировать и явным образом указать, что подлежит апдейту. Для этого есть ключ /Target:{Computer | User}. Предположим, что мне нужно выполнить только для пользователя, для этого пишем:
gpupdate /force /target:User
Еще интересный ключик, это выполнить задержку /Wait:{ваше значение}.По умолчанию значение 600 секунд.
Как обновить GPO через PowerShell
Оболочка PowerShell так же имеет отдельный командлет, который легко может инициировать запрос на обновление групповой политики, называется он Invoke-GPUpdate.
Invoke-GPUpdate — это командлет обновляющий параметры групповой политики, включая настройки безопасности, которые установлены на удаленных компьютерах с помощью планирования хода выполнения команды Gpupdate. Вы можете комбинировать этот командлет по сценарию, чтобы запланировать команду Gpupdate на группе компьютеров. Обновление может быть запланировано для немедленного запуска параметров политики или ожидания в течение определенного периода времени, максимум до 31 дня. Чтобы избежать нагрузки на сеть, время обновления будет смещено на случайную задержку.
Давайте запросим обновление политик GPO на моем тестовом сервере с Windows Server 2019, для этого запускаем оболочку PowerShell и вводим команду:
Invoke-GPUpdate –RandomDelayInMinutes 0
Ключ –RandomDelayInMinutes 0 установит задержку в выполнении на ноль секунд, в противном случае обновление будет выполнено рандомно, через некоторое время.
Обратите внимание, что командлет не выдает никаких результатов, если все работает нормально. В некоторых случаях ваши пользователи могут увидеть всплывающее окно командной строки с заголовком taskeng.exe, которое отображает сообщение «Политика обновления». Через секунду окно исчезает.
Если нужно произвести обновление на удаленном компьютере, то нужно воспользоваться ключом -Computer, команда примет вот такой вид:
Invoke-GPUpdate -Computer dc01.root.pyatilistnik.org –RandomDelayInMinutes 0
Если нужно выполнить принудительно без запроса подтверждения пользователя, то укажите ключ -Force.
Если нужно указать явно, что необходимо запросить политики только для пользователя или компьютера, то можно использовать ключ -Target, который имеет значения User или Computer. Кстати если удаленный компьютер не отвечает, то вы получите ошибку:
Invoke-GPUpdate : Компьютер «dc01.root.pyatilistnik.org» не отвечает. Целевой компьютер выключен или отключены правила брандмауэра удаленного управления запланированными задачами (Invoke-GPUpdate : Computer «dc01.root.pyatilistnik.org» is not responding. The target computer is either turned off or Remote Scheduled Tasks Management Firewall rules are disabled.).
Имя параметра: computer
строка:1 знак:1
+ Invoke-GPUpdate -Computer dc01.root.pyatilistnik.org -Target User –Ra …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : OperationTimeout: (:) [Invoke-GPUpdate], ArgumentException
+ FullyQualifiedErrorId : COMException,Microsoft.GroupPolicy.Commands .InvokeGPUpdateCommand
Еще одним преимуществом командлета PowerShell является то, что у вас есть больше возможностей в выборе машин, которые вы хотите обновить. Например, с помощью приведенной ниже команды вы должны выбрать все компьютеры, которые начинаются с «Note*«.
Get-ADComputer –Filter ‘Name -like «Note*»‘ | foreach{ Invoke-GPUpdate –Computer $_.name -Force -RandomDelayInMinutes 0}
Если нужно выбрать все компьютеры, то ставим звездочку «*»
Get-ADComputer –Filter * | foreach{ Invoke-GPUpdate –Computer $_.name -Force -RandomDelayInMinutes 0}
При желании вы можете найти все компьютеры по версиям операционных систем и сделать обновление групповых политик по данному критерию.
Не забываем, что можно ограничить поиск отдельным организационным подразделением, для этого есть ключ -Searchbase и команда примет вот такой вид:
Get-ADComputer –Filter * -Searchbase «OU=Windows10,OU=Компьютеры,OU=Оргструктура,DC=root, DC=pyatilistnik,DC=org» | foreach{ Invoke-GPUpdate –Computer $_.name -Force -RandomDelayInMinutes 0}
Еще вы можете подготовить текстовый файл со списком серверов, который так же можно через цикл обработать, вот по такому принципу:
$comps = Get-Content «C:tempcomps.txt»
foreach ($comp in $comps)
{
Invoke-GPUpdate –Computer $_.name -Force -RandomDelayInMinutes 0
}
Я также добавил здесь параметр -Force, чтобы обеспечить повторное применение параметров групповой политики, даже если клиент замечает, что новые версии GPO недоступны. Таким образом, когда мы говорим о принудительном обновлении групповой политики, мы на самом деле имеем в виду две разные вещи. Без параметра Force мы просто незамедлительно инициируем обновление; если мы добавим параметр Force, мы форсируем обновление, даже если обновлять нечего. Параметр Force вступает в игру, если вы считаете, что что-то пошло не так в предыдущем обновлении объекта групповой политики.
Очень важно выполнять скрипт в системе, на которой установлен пакет RSAT, или отдельный его компонент консоль управления групповой политикой, инача вы будите получать ошибку.
Invoke-GPUpdate : The term ‘Invoke-GPUpdate’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, o
r if a path was included, verify that the path is correct and try again.
At C:TempGPupdate-Force.ps1:12 char:5
+ Invoke-GPUpdate -ComputerName $server -AsJob -Target «Computer»-R …
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Invoke-GPUpdate:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Обновление групповой политики через оснастку GPMC
Начиная с операционной системы Windows Server 2012 R2, компания Microsoft расширила функционал оснастки по управлению политиками. Разработчики внедрили механизм, массового и точечного инициирования применения политик GPO к нужным объектам и заметьте через графический интерфейс. Откройте оснастку «Управление групповой политикой«, проще всего, это сделать через окно «Выполнить«, введя там там команду gpmc.msc.
Далее, что вы делаете. Находите нужную вам OU, щелкнуть правым кликом и из контекстного меню выбрать пункт «Обновление групповой политики«.
У вас появится окно «Принудительное обновление групповой политики», в котором вы увидите количество объектов, к которым будет применено действие
На следующем экране вы увидите результат отработки команды, в первом моем примере политики успешно применилась.
При желании все результаты команды можно сохранить в CSV файле
Вот пример содержимого такого файла
на компьютерах, где таким методом была запущена процедура принудительного применения GPO, вы в логах Windows можете обнаружить событие с кодом 1704:
Политика безопасности в объектах групповой политики успешно применена.
То же самое можно посмотреть и в Windows Admin Center, где нужно зайти в раздел события.
Ошибка 8007071a «Удаленный вызов процедуры был отменен»
Иногда в консоли GPMC вы можете получать ошибку:
8007071a «Удаленный вызов процедуры был отменен»
Связана она с тем, что на удаленных компьютерах у вас брандмауэр Windows блокирует эти вызовы, чтобы это поправить я вам советую сделать разрешающую политику, подробнее читайте, как исправить ошибку 8007071a.
Обновление GPO через PSexec
Я вам очень часто рассказываю в своих примерах из моей практики, об утилите PSexec и сборнике SysInternals от Марка Руссиновича. Суть метода в том, что с помощью специальной утилиты вы сможете выполнить удаленную команду, ранее я так удаленно включал RDP на сервере или клиентской машинке.
Далее вы распаковываете архив, если он в таком виде и открываете папку с утилитами SysInternals в командной строке, напомню сделать, это можно через команду cd или через правый клик с зажатым Shift по нужной папке, выбрав пункт «Открыть окно команд».
Обращаю внимание, что у вас должны быть соблюдены несколько требований:
- Как и в случае Invoke-GPUpdate, вы должны изменить настройки брандмауэра на своих клиентах. Поскольку PsExec использует протокол SMB, вам нужно открыть TCP-порт 445. Как открыть порт я уже подробно рассказывал, можете посмотреть, советую использовать для этого групповую политику.
- Второе, это наличие прав на удаленном компьютере, чтобы запустить там Gpupdate
Теперь выполните команду:
psexec \имя компьютера –i gpupdate
Обратите внимание, что параметр -i здесь важен. Это гарантирует, что PsExec взаимодействует с удаленным рабочим столом, что необходимо для обновления пользовательских политик. Если этот параметр не указан, будут обновлены только конфигурации компьютера, хотя ни PsExec, ни gpupdate не выдадут сообщение об ошибке. Без параметра –i gpupdate обновит пользовательские настройки, только если вы вошли в систему с одинаковой учетной записью на исходном и целевом компьютере.
В результате будет удаленный запуск утилиты gpupdate, если все хорошо, то вы получите сообщение «gpupdate exited on svt2019s01.root.pyatilistnik.org with error code 0«.
на удаленном компьютере в журналах системы вы увидите два события 1500 и 1501.
Событие 1500: Параметры групповой политики для этого компьютера обработаны успешно. Не обнаружено изменений со времени последней успешной обработки групповой политики.
Событие 1501: Параметры групповой политики для этого пользователя обработаны успешно. Не обнаружено изменений со времени последней успешной обработки групповой политики.
Так же вы можете подключиться вообще к удаленной командной строке, через команду:
psexec \имя компьютера –i cmd
Далее просто пишите gpupdate /force, обратите внимание я через команду hostname показал, что подключение идет с одного компьютера на другой.
Если компьютер не подключен к сети, вы получите следующее сообщение об ошибке:
Couldn’t access ComputerName:The network name cannot be found.
Make sure that the default admin$ share is enabled on ComputerName
Чтобы массово обновить групповую политику на всех компьютерах домена, воспользуйтесь знаком звездочки «*»:
Если это не помогло и выскочила ошибка, то может воспользоваться через PowerShell. В оболочке перейдите в каталог с утилитами PSTools и выполните:
Get-ADComputer –filter ‘Name -like «*»‘ | Select-Object -ExpandProperty Name | foreach{ Invoke-Expression –Command «.psexec.exe \$_ -i gpupdate.exe»}
Или можно из конкретного OU добавив
Get-ADComputer –filter ‘Name -like «*»‘-Searchbase «OU=Windows10,OU=Компьютеры,OU=Оргструктура,DC=root, DC=pyatilistnik,DC=org» | Select-Object -ExpandProperty Name | foreach{ Invoke-Expression –Command «.psexec.exe \$_ -i gpupdate.exe»}
Другой вариант — сначала экспортировать все имена компьютеров из контейнера Active Directory в текстовый файл с помощью командлета Get-ADComputer:
Get-ADComputer –filter ‘Name -like «win*»‘ -Searchbase «OU=Windows10,OU=Компьютеры,OU=Оргструктура,DC=root, DC=pyatilistnik,DC=org» | Select-Object -ExpandProperty Name | Out-File -Encoding ascii c:tmpComputerList.txt
Обратите внимание, что мы должны кодировать выходной файл с помощью ASCII, чтобы мы могли прочитать его содержимое из пакетного файла следующим образом:
For /f «tokens=*» %%a in (c:tmpComputerList.txt) Do psexec \%%a -i gpupdate
PsExec против Invoke-GPUpdate
Основным недостатком метода PsExec является то, что он относительно медленный. Это может занять от 3 до 4 секунд на компьютер, а для компьютеров, которые не подключены к сети, это может занять еще больше времени. PsExec иногда даже зависал во время моих тестов.
Разрешение входящих подключений через порт 445 является угрозой безопасности. Компьютерные черви могут использовать этот порт, а хакеры могут делать много неприятных вещей с помощью PsExec. Открытие порта планировщика заданий для Invoke-GPUpdate также проблематично, но я думаю, что порт 445 более популярен среди программистов вредоносных программ.
Таким образом, в большинстве сценариев Invoke-GPUpdate является лучшим вариантом. Однако, если вы все равно открыли порт 445 по другим причинам и не хотите открывать порты Invoke-GPUpdate, вы можете предпочесть PsExec для принудительного обновления групповой политики.
Удаленное обновление GPO через Enter-PSSession
Еще в PowerShell есть командлет для удаленного подключения к компьютеру, называется он Enter-PSSession, его принцип работ, как у PsExec. Откройте оснастку PowerShell и введите:
Enter-PSSession -ComputerName svt2019s01
Далее вы подключитесь к удаленному компьютеру, где потом просто введите gpupdate /force.
Удаленное обновление GPO через Windows Admin Center
Если вы в своей практике используете утилиту удаленного администрирования Windows Admin Center, то вы легко можете подключиться к удаленному серверу и обновить политики GPO все через тот же gpupdate /force.
На этом у меня все. Я вам постарался подробно рассказать, о всех методах локального и дистанционного обновления групповых политик пользователя и компьютера на ваших компьютерах домена. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
-
Question
-
Hi
how can i connect to a remote computer and edit its local security policy
I used gpedit.msc /gpcomputer:target
but i can not change local security policy on that local pc
it will be very useful for me ! for example i like to add a user to its logon as a batch job permissions
Thanks
All replies
-
Try using quotation marks:
gpedit.msc /gpcomputer:»target»
MCTS — Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
http://mariusene.wordpress.com/-
Proposed as answer by
Wednesday, July 18, 2012 5:02 AM
-
Proposed as answer by
-
i am using this but what ?
u mean if i use quotations i am able to edit local gpo’s ?
i have no problem getting remote access to gpo of a pc using above command but it does not load the local security policy part
-
I hope you’re still not waiting for the answer, but just in case you are (or anyone else searching for the answer comes across this page), make sure you insert a space between the : of /gpcomputer: and the computer name. e.g.
gpedit.msc /gpcomputer: computername
(and not gpedit.msc /gpcomputer:computername)
-
Proposed as answer by
Robin F Herbert
Wednesday, August 20, 2014 1:03 PM
-
Proposed as answer by
-
Useless answer.
The local group policy load but there is only 3 items under Security Settings.
I think to achieve that you will need to use security templates or to set 1 system, export the settings and import it to the other computer.
-
A note here. The command works either way on my machine running Windows 10.
-
The correct answer is you cannot edit LOCAL SECURITY POLICY on remote computer.
Instead you can export the settings from another computer and then import them.
-
Edited by
HolyHa1fDead
Sunday, September 8, 2019 10:46 PM -
Proposed as answer by
Steve Ireland
Tuesday, March 24, 2020 3:13 PM
-
Edited by
-
rephrasing the original question: is there a way to run secpol.msc against a remote computer in the same way it’s possible to do this with gpedit.msc?
-
Question
-
Hi
how can i connect to a remote computer and edit its local security policy
I used gpedit.msc /gpcomputer:target
but i can not change local security policy on that local pc
it will be very useful for me ! for example i like to add a user to its logon as a batch job permissions
Thanks
All replies
-
Try using quotation marks:
gpedit.msc /gpcomputer:»target»
MCTS — Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
http://mariusene.wordpress.com/-
Proposed as answer by
Wednesday, July 18, 2012 5:02 AM
-
Proposed as answer by
-
i am using this but what ?
u mean if i use quotations i am able to edit local gpo’s ?
i have no problem getting remote access to gpo of a pc using above command but it does not load the local security policy part
-
I hope you’re still not waiting for the answer, but just in case you are (or anyone else searching for the answer comes across this page), make sure you insert a space between the : of /gpcomputer: and the computer name. e.g.
gpedit.msc /gpcomputer: computername
(and not gpedit.msc /gpcomputer:computername)
-
Proposed as answer by
Robin F Herbert
Wednesday, August 20, 2014 1:03 PM
-
Proposed as answer by
-
Useless answer.
The local group policy load but there is only 3 items under Security Settings.
I think to achieve that you will need to use security templates or to set 1 system, export the settings and import it to the other computer.
-
A note here. The command works either way on my machine running Windows 10.
-
The correct answer is you cannot edit LOCAL SECURITY POLICY on remote computer.
Instead you can export the settings from another computer and then import them.
-
Edited by
HolyHa1fDead
Sunday, September 8, 2019 10:46 PM -
Proposed as answer by
Steve Ireland
Tuesday, March 24, 2020 3:13 PM
-
Edited by
-
rephrasing the original question: is there a way to run secpol.msc against a remote computer in the same way it’s possible to do this with gpedit.msc?
Данный материал является переводом оригинальной статьи «Active Directory Pro : Robert Allen : How to Update Group Policy on Remote Computers» и рассчитан на начинающих администраторов Windows.
В конфигурации по умолчанию доменные компьютеры обновляют групповые политики (Group Policy) при запуске операционной системы, а затем политики автоматически обновляются в фоновом режиме каждые 90 минут. Но бывают случаи, когда вы вносите изменения в существующие объекты групповой политики (Group Policy Objects/GPO) или создаете новые GPO, и вам нужно, чтобы изменения вступили в силу немедленно.
Далее мы рассмотрим три различных способа удаленного обновления групповой политики. Первый способ лучше всего подходит для старых клиентов Windows, второй и третий способы — для систем, работающих под управлением 2012 года и более поздних версий.
Способ 1: Использование утилит GPUpdate и PsExec
Этот способ использует на клиентских компьютерах встроенную в Windows команду под названием gpupdate. Чтобы немедленно принудительно обновить групповую политику на локальном компьютере, используют команду вида:
gpupdate /force
Параметр /force принудительно обновит все политики, а не только новые.
Однако, если у вас множество компьютеров, которые нуждаются в обновлении, было бы непросто входить в каждый из них и выполнять эту команду. Чтобы выполнить указанную (или любую другую) команду на удаленном компьютере, вы можете воспользоваться утилитой PsExec из набора инструментов Sysinternals.
Вот пример использования PsExec для удаленного обновления групповой политики:
PsExec \Computername gpupdate
Просто замените Computername на фактическое имя хоста удаленного компьютера.
Способ 2: Использование Консоли Group Policy Management
В Windows Server 2012 и более поздних версиях теперь можно принудительно обновлять групповую политику на удаленных компьютерах с помощью консоли управления групповой политикой Group Policy Management.
Этот метод очень прост и позволяет запускать обновление в одном подразделении (Organizational Unit/OU) или во всех подразделениях Active Directory.
Шаг 1: Найдите в главном меню Консоль управления групповой политикой «Group Policy Management».
Вы можете открыть эту консоль на компьютере, на котором установлены средства RSAT.
Шаг 2: В дереве структуры подразделений (OU) домена Active Directory щелкните правой кнопкой мыши OU, чтобы открыть контекстное меню команд управления и вызвать пункт «Group Policy Update«.
Вы можете обновить отдельное подразделение или родительское подразделение, и оно обновит все дочерние подразделения.
Мы собираемся обновить свое родительское подразделение «ADPRO Computers«. В этом подразделении есть несколько подразделений, разбитых на отделы. Это приведет к запуску обновления групповой политики на всех компьютерах, вложенных в эти OU.
Отвечаем утвердительно на вопрос о запуске обновления на указанном количестве компьютеров.
Далее мы увидим окно, показывающее нам статус обновления групповой политики на каждом компьютере.
Вот так просто использовать консоль управления групповой политикой для удаленного принудительного обновления групповой политики.
Способ 3: Использование Powershell командлета Invoke-GPUpdate
В Windows 7 / Windows Server 2012 и более новых ОС можно принудительно выполнить немедленное обновление с помощью PowerShell командлета Invoke-Gpupdate.
Вам потребуется установить PowerShell, а также упомянутую консоль управления групповой политикой (Group Policy Management) из состава RSAT.
Пример вызова команды обновления групповых политик:
Invoke-GPUpdate –Computer 'COMPUTER02' -RandomDelayInMinutes 0
Значение параметра RandomDelayInMinutes указывает задержку выполнения в минутах. Установив для него значение 0, вы сразу же обновите групповую политику.
Единственным недостатком использования этой команды является то, что клиенты получат всплывающее окно CMD, как показано ниже.
Это окно отображается около 3 секунд, а затем закрывается.
Если вы хотите использовать команду PowerShell для принудительного обновления на всех компьютерах в Active Directory, вы можете использовать следующие команды:
$computers = Get-ADComputer -Filter "*"
$computers | ForEach-Object -Process { Invoke-GPUpdate -Computer $_.name -RandomDelayInMinutes 0 -Force }
Приведенные выше команды будут извлекать каждый компьютер из домена, помещать их в переменную и запускать команды для каждого объекта в переменной.
Замечание (вне рамок перевода текста исходной статьи):
При использовании командлета Invoke-GPUpdate на целевой системе в логе фиксируется 2 события: с кодом 1500 (обновление политик компьютера) и с кодом 1501 (обновление политик пользователя).
Если на удалённых компьютерах требуется форсированное обновление только компьютерных политик и не требуется обновление пользовательских политик, то можно избежать появления вышеописанного окна CMD. Это возможно, если воспользоваться таргетированием выполнения, то есть добавить к команде опцию -Target.
Пример команды, при которой обновится только политика компьютера (регистрация события 1500, окно в сессии пользователя не появляется):
Invoke-GPUpdate -Computer "computername" -RandomDelayInMinutes 0 -Target Computer
Пример команды, при которой обновится только политика пользователя (регистрация события 1501, окно в сессии пользователя появляется
Invoke-GPUpdate -Computer "computername" -RandomDelayInMinutes 0 -Target User
Дополнительно по теме групповых политик можно ознакомится со статьёй о построении отчёта о результирующих групповых политиках, применяемых к конкретному компьютеру и/или пользователю «GPResult Tool: How To Check What Group Policy Objects are Applied».
































