Как найти (и удалить) непривязанные объекты GPOS в Active Directory

По мере роста организации растет и ее среда Active Directory (AD) и инфраструктура Group Policy (GP). Объекты групповой политики (GPO) вскоре могут выйти из-под контроля, и прежде чем вы это заметите, у вас уже появится десятки непривязанных GPO, загромождающих вашу среду. Давайте это изменить.

В этом уроке вы узнаете, как обнаружить все эти непривязанные GPO с помощью консоли управления групповой политикой (GPMC) и PowerShell.

Приступим!

Предварительные требования

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

Откуда берутся непривязанные 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 перейдите к Лес: <имя вашего леса —> Домены —> <имя вашего домена>, щелкните правой кнопкой мыши по имени домена и выберите Поиск. Это действие вызовет диалоговое окно Поиск объектов групповой политики.

Search option in GPMC console

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

На следующем снимке экрана, сочетание этих настроек будет искать все GPO, связанные по крайней мере с одним OU в домене homelab.local.

Когда закончите, щелкните на Добавить, чтобы добавить критерий. Он появится в разделе Все критерии поиска.

Adding search item in “Search for Group Policy Objects” window

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

using search option in “Search for Group Policy Objects” window

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

Search results for linked GPOs

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

Это задача будет занимать много времени, и поэтому вы увидите, как выполнить эту задачу с помощью PowerShell в следующем разделе.

Comparing search results with all the Group Policy Objects

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

Displaying linked GPO

Поиск непривязанных GPO с помощью PowerShell

Перелопачивание GPO в GPMC может сработать для нескольких GPO, но вы столкнетесь с проблемой, если у вас сотни или тысячи GPO, управляющих тысячами конечных точек. В этом случае пришло время автоматизировать этот процесс и создать удобный инструмент PowerShell.

Предполагается, что вы находитесь на своем локальном компьютере с установленным RSAT:

1. Откройте консоль Windows PowerShell.

2. Импортируйте модуль GroupPolicy. Модуль GroupPolicy поставляется с RSAT и должен уже быть установлен в вашей системе. Этот модуль содержит все необходимые команды для работы с GPO в PowerShell.

Import-Module GroupPolicy

3. Запустите командлет PowerShell Get-GPO с использованием параметра All. Этот командлет запрашивает AD и возвращает все найденные GPO.

Get-GPO -All
Get-Gpo cmdlet output

4. Теперь, когда вы можете запросить все GPO в домене, вам нужно выяснить, какие из них не связаны. Для этого запустите Get-GPOReport командлет. Этот командлет позволяет указать имя и тип вывода для возврата.

Get-GPOReport -Name SomeGPO -ReportType XML

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

Sample output containing LinksTo section

Командлет Get-GPOReport может получить отчет только для одного GPO за раз. Этот командлет включает в себя результаты поиска только из доменов, но не из сайтов AD.

5. Теперь, когда вы знаете, как найти все GPO с помощью Get-GPO и командлет для выявления того, к чему они привязаны (Get-GPOReport), объедините их, скопировав и вставив приведенную ниже команду PowerShell в вашу консоль.

Команда ниже запрашивает все GPO в домене (Get-GPO) и затем генерирует XML-отчет для каждого из них (Get-GPOReport), позволяя возвращать только те, в отчете которых нет строки <LinksTo> (Select-String).

Get-GPO -All | Where-Object {
     $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>"
 }

В среде учебника вы можете видеть в приведенном ниже примере, что UnlinkedGPO1 и UnlinkedGPO2 не связаны ни с одним OU.

Listing out unlinked GPO in the domain

Создание инструмента PowerShell для несвязанных GPO

Теперь давайте объединим все, что вы узнали, и создадим сценарий PowerShell, который вы могли бы использовать в реальном мире.

1. Откройте ваш любимый редактор кода и скопируйте/вставьте в него следующий сценарий PowerShell. Сохраните сценарий как Remove-UnlinkedGPO.ps1. Этот сценарий:

  • Создает папку с текущей датой для хранения отчетов о несвязанных GPO.
  • Находит все GPO в AD, которые не связаны.
  • Создает HTML-отчет для каждого несвязанного GPO и сохраняет его на диск.
  • Создает и добавляет в текстовый файл список всех несвязанных GPO.
  • Удаляет каждый несвязанный GPO с шагом подтверждения с использованием командлета Remove-GPO.

Вы также можете скачать скрипт Remove-UnlinkedGPO.ps1 через GitHub.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## Создает каталог для хранения отчетов о GPO
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# Получает все GPO с типом отчета gpo в формате XML и также ищет раздел в отчете XML.
# Рассматривает только те GPO, у которых нет раздела.
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # Резервное копирование GPO, отчета HTML и сохранение деталей GPO в текстовый файл являются необязательными.
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # Запускает отчет и сохраняет его в виде отчета HTML на диске
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # Создает и добавляет в текстовый файл с именем UnlinkedGPOs.txt в папке резервного копирования, который
   # содержит каждый объект GPO, возвращаемый Get-GPO
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # Удаляет GPO, но сначала запрашивает подтверждение
   $_.Displayname | Remove-GPO -Confirm
 }

2. Выполните скрипт Remove-UnlinkedGPO.ps1.

3. Если найден несвязанный GPO, скрипт попросит вас удалить его. Этот запрос поступает от командлета Remove-GPO с использованием параметра Confirm. Чтобы подтвердить удаление этого отдельного GPO, щелкните Да, в противном случае нажмите Да для всех, чтобы удалить все несвязанные GPO без дальнейшего подтверждения.

GPO deletion confirmation prompt

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

Displaying Backup Folder

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

GPO HTML report

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

UnlinkedGPOs.txt GPO listing

Заключение

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

Какой способ вы предпочитаете? Можете ли вы придумать способ улучшить описанный скрипт PowerShell?

Source:
https://adamtheautomator.com/unlinked-gpo/