Поиск по групповым политикам, за минуту
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов России Pyatilistnik.org. Не так давно мы с вами разбирали вопрос "По чему не применяются групповые политики", многим она была полезной и позволила получить новые знания. В сегодняшней публикации я хочу вам показать, как вы можете производить поиск по ключевому слову, значению во всех объектах групповой политики вашего домена Active Directory, опишу когда это полезно.
Постановка задачи
Предположим, что у вас есть инфраструктура Active Directory, все настройки клиентских компьютеров осуществляются через групповые политики, и это правильно так как централизация наше все. В какой-то момент вам необходимо выяснить какая групповая политика вносит ту или иную настройку, если у вас нет практики постоянного комментирования в GPO, то при их большом количестве это может быть весьма затруднительно и долго. Простой пример, у вас есть RDS ферма на которой работают ваши сотрудники, логично предположить, что на них применяются политики компьютера и пользователя, вам необходимо выяснить, какой именно объект добавляет выполнение скрипта при входе, количество политик у вас 20 и более, согласитесь, что не очень удобно их все открывать и искать нужную настройку. Вот для такой ручной работы можно использовать блага предоставленные компанией Microsoft, а именно оболочку PowerShell.
Поиск внутри GPO через PowerShell
Я все больше постигаю возможности PowerShell и нашел решение позволяющее произвести поиск по нужному значению во всех объектах групповой политики буквально за несколько минут. Я предлагаю вам для этого воспользоваться нижеописанным скриптом. Искать мы в моем примере будем сценарий AddRemPrinters-new, который добавляет при входе пользователя назначенные ему принтеры, данный метод отличается от распространения через публикацию в Active Directory или оснастку управление печатью. Давайте откроем оснастку "Управление групповой политикой" и посмотрим, что есть в моем тестовом домене, хочу подчеркнуть, что в настоящей рабочей инфраструктуре GPO объектов может быть от нескольких десяткой до нескольких сотен. В домене root.pyatilistnik.org их 15 штук.
Как я и писал выше мне нужно выяснить в какой из них у меня идет подключение скрипта AddRemPrinters-new. Когда вы явно не знаете, где искать можно бегло пробежаться по каждой политике, это я так называю обезьяний метод, подразумевает полностью ручную работу, особенно интересно когда политик куча. Что вы делаете:
- Выберите нужную групповую политику
- Перейдите в ней на вкладку "Параметры"
- Раскройте области действия политики "Конфигурация компьютера" и "Конфигурация пользователя", после чего произведите поиск значения в данной групповой политике
Как видите, это очень интересно, особенно когда параметров много и не все даже могут из них отображаться, могут быть проблемы с административными шаблонами, в результате чего вы можете наблюдать ошибку "Пространство имен "Microsoft.Policies.WindowsStore" уже определено как целевое пространство имен для другого файла в хранилище".
Я стараюсь рационально использовать свое время и люблю, чтобы по возможности все было легко и автоматизированно, поэтому я и люблю PowerShell, который в этом поможет. Скачайте скрипт представленный чуть ниже, его разработал замечательный инженер Microsoft Тони Муррай.
Содержимое скрипта по поиску в объектах групповых политик
# Что будем искать
$string = Read-Host -Prompt "What string do you want to search for?"
# Задаем домен для поиска
$DomainName = $env:USERDNSDOMAIN
# Находим все групповые политики в данном домене
write-host "Finding all the GPOs in $DomainName"
Import-Module grouppolicy
$allGposInDomain = Get-GPO -All -Domain $DomainName
#Заглядываем в каждый XML в GPO
Write-Host "Starting search...."
foreach ($gpo in $allGposInDomain) {
$report = Get-GPOReport -Guid $gpo.Id -ReportType Xml
if ($report -match $string) {
write-host "********** Match found in: $($gpo.DisplayName) **********"
} # end if
else {
Write-Host "No match in: $($gpo.DisplayName)"
} # end else
} # end foreach
Запуск скрипта по поиску
Это простой сценарий Powershell, который использует командлеты групповой политики для поиска строки в объектах групповой политики. Единственным вводом является строка для поиска. Вывод показывает все объекты групповой политики и соответствует ли их (XML) содержимое указанной строке. Обратите внимание, что скрипт не предоставляет никакой информации о том, где в объекте групповой политики находится строка. Для этого вы можете открыть HTML-отчет для объектов групповой политики, для которых есть совпадения, и выполнить поиск вручную.
- Не запускать - D
- Запустить однажды - R
- Приостановить - S
Или же может быть ошибка "так как выполнение скриптов запрещено для данной системы"
Если делаете один раз, то можете не менять политику ExecutionPolicy, если часто то поменяйте, по ссылке выше.
Первое, что вас спросят, это что нужно искать внутри объекта GPO, я ввожу AddRemPrinters-new. После нажатия "Enter" сразу запускается скрипт и происходит поиск по всем политикам, если политика не содержит нужного нам значения, то она выдает статус "No match in", если совпадение обнаружено, то вы увидите статус "Match found in и имя политики". В моем примере я обнаружил нужное мне значение в политике под именем "AllClients-DefaultSettings" и "Add-Printers".
Как видите такой метод, гораздо проще, единственное есть нюансы, скрипт ищет точное значение, но вы можете дописать его, чтобы он искал и по части слова. Если вы знаете еще методы, позволяющие вам производить быстрый и действенный поиск по объектам GPO, то прошу описать его в комментариях. На этом у меня все, с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.
Благодарю. Хотел было сам написать…но наткнулся на ваш блог.
Добрый день! Сам столкнулся с такой задачей, решил поделиться решением.
Спасибо. Что за метод AddRemPrinters-new? можно рассказать поподробнее? чем он лучше или хуже остальных.
Супер!
Спасибо!