По мере роста организации растет и ее среда Active Directory (AD) и инфраструктура Group Policy (GP). Объекты групповой политики (GPO) вскоре могут выйти из-под контроля, и прежде чем вы это заметите, у вас уже появится десятки непривязанных GPO, загромождающих вашу среду. Давайте это изменить.
В этом уроке вы узнаете, как обнаружить все эти непривязанные GPO с помощью консоли управления групповой политикой (GPMC) и PowerShell.
Приступим!
Предварительные требования
Эта статья будет учебным пособием с практическими примерами. Если вы хотите следовать за мной, убедитесь, что у вас есть:
- Домен Active Directory. В этой статье будет использоваться домен с именем HomeLab.Local.
- A Windows computer joined to the AD domain. This tutorial will use Windows 10.
- На компьютере под управлением Windows установлен пакет Удаленные инструменты администрирования сервера (RSAT).
Откуда берутся непривязанные GPO?
Когда вы создаёте GPO и определяете все настройки, которые вы намерены применить к компьютерам клиентов, этот GPO на самом деле ничего не делает. Чтобы действительно воздействовать на компьютеры клиентов, GPO должен быть связан с организационной единицей (OU) в Active Directory.
С течением времени, по мере того как администраторы создают все больше GPO, забывают их связывать, отсоединяют GPO от OU, намереваются удалить их, но так и не делают этого, GPO, простаивающие и ничего не делающие, могут распространяться. Особенно в больших организациях непривязанные GPO могут разрастаться до сотен, если их не правильно поддерживать.
Поиск непривязанных GPO в GPMC
Вы можете найти непривязанные GPO одним из двух способов: через GPMC или через PowerShell. Если у вас всего несколько непривязанных GPO, может быть разумнее использовать GPMC, а не создавать сценарий PowerShell.
Чтобы найти непривязанные GPO через GPMC:
1. Откройте GPMC, перейдя в меню “Групповая политика” и введя “Управление групповой политикой”. Когда появится программа GPMC, откройте её.
2. В GPMC перейдите к Лес: <имя вашего леса —> Домены —> <имя вашего домена>, щелкните правой кнопкой мыши по имени домена и выберите Поиск. Это действие вызовет диалоговое окно Поиск объектов групповой политики.

3. Нажмите на выпадающий список Поиск элемента и выберите Ссылки GPO. Этот элемент поиска будет искать GPO, связанные с OU. Измените выпадающий список Условие на Существует в и домен на ваш домен.
На следующем снимке экрана, сочетание этих настроек будет искать все GPO, связанные по крайней мере с одним OU в домене homelab.local.
Когда закончите, щелкните на Добавить, чтобы добавить критерий. Он появится в разделе Все критерии поиска.

4. Теперь нажмите кнопку Поиск, чтобы найти все GPO, соответствующие критериям поиска.

5. Как показано на следующем снимке экрана, в результатах поиска показываются только связанные GPO.

6. Чтобы найти непривязанные GPO, сравните их вручную со всеми связанными GPO, как показано ниже. На снимке экрана ниже показано, что только три GPO связаны. Просмотрите раздел Объекты групповой политики, чтобы увидеть, что два из них не отображаются (UnlinkedGPO1 и UnlinkedGPO2). Это означает, что они не связаны.
Это задача будет занимать много времени, и поэтому вы увидите, как выполнить эту задачу с помощью PowerShell в следующем разделе.

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

Поиск непривязанных GPO с помощью PowerShell
Перелопачивание GPO в GPMC может сработать для нескольких GPO, но вы столкнетесь с проблемой, если у вас сотни или тысячи GPO, управляющих тысячами конечных точек. В этом случае пришло время автоматизировать этот процесс и создать удобный инструмент PowerShell.
Предполагается, что вы находитесь на своем локальном компьютере с установленным RSAT:
1. Откройте консоль Windows PowerShell.
2. Импортируйте модуль GroupPolicy. Модуль GroupPolicy поставляется с RSAT и должен уже быть установлен в вашей системе. Этот модуль содержит все необходимые команды для работы с GPO в PowerShell.
3. Запустите командлет PowerShell Get-GPO
с использованием параметра All
. Этот командлет запрашивает AD и возвращает все найденные GPO.

4. Теперь, когда вы можете запросить все GPO в домене, вам нужно выяснить, какие из них не связаны. Для этого запустите Get-GPOReport
командлет. Этот командлет позволяет указать имя и тип вывода для возврата.
Вручную скопируйте и вставьте одно из найденных имен GPO из шага выше и выполните эту команду. Вы увидите, что командлет возвращает XML-отчет со всеми настройками, которые есть в GPO. В частности, обратите внимание на раздел под названием LinksTo
, как показано ниже. Этот раздел содержит узел XML SOMPath
, представляющий путь к ОУ, к которому он связан.

Командлет
Get-GPOReport
может получить отчет только для одного GPO за раз. Этот командлет включает в себя результаты поиска только из доменов, но не из сайтов AD.
5. Теперь, когда вы знаете, как найти все GPO с помощью Get-GPO
и командлет для выявления того, к чему они привязаны (Get-GPOReport
), объедините их, скопировав и вставив приведенную ниже команду PowerShell в вашу консоль.
Команда ниже запрашивает все GPO в домене (Get-GPO
) и затем генерирует XML-отчет для каждого из них (Get-GPOReport
), позволяя возвращать только те, в отчете которых нет строки <LinksTo>
(Select-String
).
В среде учебника вы можете видеть в приведенном ниже примере, что UnlinkedGPO1 и UnlinkedGPO2 не связаны ни с одним OU.

Создание инструмента PowerShell для несвязанных GPO
Теперь давайте объединим все, что вы узнали, и создадим сценарий PowerShell, который вы могли бы использовать в реальном мире.
1. Откройте ваш любимый редактор кода и скопируйте/вставьте в него следующий сценарий PowerShell. Сохраните сценарий как Remove-UnlinkedGPO.ps1. Этот сценарий:
- Создает папку с текущей датой для хранения отчетов о несвязанных GPO.
- Находит все GPO в AD, которые не связаны.
- Создает HTML-отчет для каждого несвязанного GPO и сохраняет его на диск.
- Создает и добавляет в текстовый файл список всех несвязанных GPO.
- Удаляет каждый несвязанный GPO с шагом подтверждения с использованием командлета
Remove-GPO
.
Вы также можете скачать скрипт Remove-UnlinkedGPO.ps1 через GitHub.
2. Выполните скрипт Remove-UnlinkedGPO.ps1.
3. Если найден несвязанный GPO, скрипт попросит вас удалить его. Этот запрос поступает от командлета Remove-GPO
с использованием параметра Confirm
. Чтобы подтвердить удаление этого отдельного GPO, щелкните Да, в противном случае нажмите Да для всех, чтобы удалить все несвязанные GPO без дальнейшего подтверждения.

После завершения выполнения скрипта и обнаружения хотя бы одного несвязанного GPO, вы должны увидеть в папке C:\GPOBackup\<date> содержимое GPO в виде папки GUID вместе с HTML-отчетами и файлом UnlinkedGPOs.txt.

4. Теперь откройте один из отчетов HTML GPO в веб-браузере. Вы увидите, что отчет содержит все настройки, определенные в этом GPO. В приведенном ниже примере GPO UnlinkedGPO1 содержит настройки для политики выполнения PowerShell.

5. Наконец, откройте файл UnlinkedGPOs.txt. Вы увидите, что он содержит тот же вывод, который вы получили от командлета Get-GPO
.

Заключение
Теперь вы должны знать, как найти все эти несвязанные GPO в вашей среде AD с помощью GPMC и PowerShell.
Какой способ вы предпочитаете? Можете ли вы придумать способ улучшить описанный скрипт PowerShell?