Поиск объектов GPO без связей к организационным подразделениям
Добрый день! Уважаемые системные администраторы и гости одного из крупнейших IT блогов России Pyztilistnik.org. В прошлый раз мы с вами разбирали проблему с размером токена MaxTokenSize и решили проблему с доступом на сервис IIS. В сегодняшней публикации я хотел бы вернуться к обсуждению одного из важнейших инструментов AD по массовому управлению инфраструктурой, к групповым политикам. Когда у вас организация не очень большая, то количество политик (Объектов GPO) может быть маленьким, но когда компания разрастается и ее структура Active Directory с организационными подразделениями становится заметной, вы можете столкнуться с ситуацией, что среди ваших объектов групповой политики есть те, которые ни к кому не присоединены и не используются. Может встать вопрос, о их необходимости, лично я всегда придерживаюсь правила, что не используется лучше удалить или убрать в архив. В сегодняшней статье я вас научу искать политики GPO, которые не имеют связей с OU и не используются в вашей инфраструктуре.
Постановка задачи
Научиться быстро находить ненужные групповые политики, которые не используются и не присоединены ни к одному организационному подразделению. В итоге мы сможем уменьшить количество GPO, уменьшить размер папки Sysvol, для больших организаций со слабыми каналами, уменьшение объема этой папки, уменьшит время репликации. На выходе получаем оптимизированную базу GPO объектов.
Методы поиска несвязанных объектов групповой политики
Объекты групповой политики (GPO) идеально подходят для настройки различных элементов конфигурации на большом количестве устройств в домене Active Directory. Один объект групповой политики может обеспечить изменение на всех устройствах в домене за несколько минут. Объекты групповой политики - отличный способ массового управления системами из одного места, но со временем вы можете получить сотни или даже тысячи таких объектов. Для оптимизации объектов GPO мы научимся использовать PowerShell для отображения привязки объектов групповой политики к подразделениям в Active Directory.
Несвязанные объекты групповой политики - это те объекты групповой политики, которые больше не применимы к компьютерам или пользователям. Поскольку объекты GPO должны быть связаны с одним или несколькими подразделениями для применения изменений конфигурации, объекты GPO, которые не связаны с одним подразделением, вообще не имеют никакого эффекта. Чтобы поддерживать Active Directory в чистоте, важно обнаруживать и удалять эти объекты групповой политики, если они больше не нужны. К сожалению, нет хорошего способа сделать это через консоль управления групповыми политиками, но мы можем реализовать это с помощью PowerShell и модуля Active Directory.
Когда вы откроете оснастку "управление групповой политикой", лучше всего, это сделать через окно "Выполнить" gpmc.msc и посмотрите список всех ваших объектов GPO, то обнаружите, что при выборе всего списка вы не видите столбца отображающего наличие линка с каким-то OU в AD. Обходить каждую политику не очень удобно и долго.
В моем примере есть десяток объектов GPO, визуально я вижу, что меня на уровне домена используются две политики "Default Domain Policy" и "Добавление прав DHCP". Давайте посмотрим какие атрибуты есть у них. Для этого запустите оболочку PowerShell и введите команду:
Вы получите список атрибутов, которые есть у политики, к сожалению тут нет такого, который бы мог вам сказать, есть ли у него связь с организационным подразделением или сайтов Active Directory.
Чтобы получить нужную информацию, вам потребуется воспользоваться командлетом Get-GPOReport, но перед этим вы должны знать имя или GUID политики. Get-GPOReport - это командлет, который создает отчет в формате XML или HTML, он описывает свойства и параметры политики для определенного объекта групповой политики (GPO) или для всех объектов групповой политики в домене. Информация, сообщаемая для каждого объекта групповой политики, включает: сведения, ссылки, фильтрацию безопасности, фильтрацию инструментария управления Windows (WMI), делегирование, а также конфигурации компьютеров и пользователей.
Можно указать параметр "All" для создания отчета для каждого объекта групповой политики в домене или указать параметр "Имя" или "Guid" для создания отчета по объекту групповой политики. Вы также можете передать объекты GPO в этот командлет. Если вы указываете файл через параметр Path , отчет записывается в файл; в противном случае он выводится на дисплей.
или
Get-GPOReport -Guid 13EA95D5-1418-46A1-9009-038C79E80FFD -ReportType html -Path C:\Scripts\gporeport.html
В итоге в нужной папке у меня создались файлы отчета.
Вот так вот выглядит отчет в формате HTML, тут видно, что есть раздел "Ссылки" и в нем присутствует, что мой объект GPO присоединен к домену root по пути root.pyatilistnik.org.
Если посмотреть файл в формате XML, то тут будет интересный раздел <linksTo>, в котором так же будет присутствовать имя OU или домена куда прилинкована групповая политики, вы это увидите в поле <SOMName>. В поле <SOMPath> вы увидите путь, чуть ниже статус включена или нет.
Логично предположить, что если у самого объекта групповой политики нет атрибутов, которые бы имели информацию, к кому они присоединены, то нужно ее искать на объектах присоединения. В моем примере, это будет корень домена, но так же может быть и сайт или организационное подразделение. Откройте редактор атрибутов ADSIEdit или оснастку ADUC. Откройте свойства объекта, я это делаю через оснастку "Пользователи и компьютеры", которая имеет вкладку "Редактор атрибутов". Тут вам нужно найти атрибут gPLink.
gPLink - это атрибут, сортированный список параметров групповой политики. Каждый вариант является DWORD. Значение указывает на расположение GPC в Active Directory. GPLink - хранится в Active Directory на объекте, с которым связан объект групповой политики.
- Когда объект групповой политики связывается с подразделением, атрибут GPlink объекта подразделения обновляется
- Если объект групповой политики связан с доменом или объектом OU, GPLINK реплицируется по всему домену (с разделом домена).
- Если объект групповой политики связан с объектом сайта, он реплицируется по всему лесу (с разделом конфигурации). Когда объект групповой политики связывается с сайтом, атрибут GPLink объекта SITE OBJECT обновляется. Объект сайта хранится в "Configuration\Sites" - это важно, потому что, в отличие от раздела домена, все контроллеры домена в лесу имеют копию раздела конфигурации.
Вот строка из редактора атрибутов на нужном объекте, как видно содержится LDAP ссылка
GUID 13EA95D5-1418-46A1-9009-038C79E80FFD соответствует политике "Добавление прав DHCP".
Зная, о существовании атрибута gPLink и командлете Get-GPOReport, мы можем воспользоваться данной связкой, чтобы получить нужные нам данные. Предполагая, что вы подключены к компьютеру с Active Directory с соответствующими правами и у вас установлен модуль ActiveDirectory, вам сначала нужно найти все ссылки на объекты групповой политики в среде Active Directory. Для этого используйте Get-GPO командлет с параметром All.
Как только у вас есть все объекты групповой политики, назначенные для переменной $gpos, вы можете приступить к изучению каждой из них. Для этого вы будете использовать цикл foreach. Поскольку выходные объекты Get-Gpo не имеют свойства, позволяющего определить, с каким подразделением они связаны, вы вынуждены использовать другой вызываемый командлет Get-GPOReport. Используйте свойство ID для каждого представленного объекта $gpo.ID и передайте его командлету Get-GPOReport.
Так как вам нужно будет еще немного изучить вывод Get-GPOReport, обязательно выведите отчет в формате XML. Это позволяет легко ссылаться на свойства переменной $gpoReport. Обратите внимание, что я приведу $gpoReport к формату XML. Это позволит вам ссылаться на различные узлы внутри XML, а не анализировать его как строку.
[xml]$gpoReport = Get-GPOReport -Guid $gpo.ID -ReportType xml
}
Теперь у вас есть код для создания отчета о GPO XML для каждого объекта GPO. На этом этапе проверьте свойство GPO.LinksTo для каждого, $gpoReport, чтобы определить, является ли оно нулевым или нет. Если оно нулевое, то это означает, что OU не было связано с ним. Зная это, вы можете включать только те объекты групповой политики, которые не связаны с OU, с помощью простого условия if/then.
foreach ($gpo in $gpos) {
[xml]$gpoReport = Get-GPOReport -Guid $gpo.ID -ReportType xml
if (-not $gpoReport.GPO.LinksTo) {
$gpo.DisplayName
}
}
Этот цикл foreach теперь проверяет каждый объект групповой политики в среде Active Directory, получает отчет в формате XML, проверяет соответствующее свойство в отчете XML и, если в этом свойстве не определено подразделение, выводит имя объекта групповой политики. Но это еще не все, вы можете пойти еще дальше и воспользоваться прекрасным скриптом gPLinkReport 1.2. Чтобы установить скрипт из интернета можете выполнить команду или скачать его у меня:
Хочу напомнить, что у вас должен быть загружен и установлен модуль PowerShell для Active Directory. Примеры выполнения команд со скриптом:
.\gPLinkReport.ps1 | Export-Csv -Path .\GPLinkReport.csv -NoTypeInformation (Экспортирует данные в файл)
В итоге у вас получиться вот такая удобная таблица, вам будет интересен столбец "CannonicalName" и те групповые политики, кто не имеет никаких связей с объектами AD будут иметь статус _GPO_NOT_LINKED.
Вот такими методами мы легко выяснили, какие из групповых политик у вас просто простаивают, а какие нет. На этом у меня все, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.