• Авторизация


350 GPO и все-все-все 13-02-2015 13:32 к комментариям - к полной версии - понравилось!


Итак... Имеем небольшой доменчик тысяч на 30 пользователей образованный миграцией в него разных других доменчиков. в домене конечно попытались во время миграции соблюдать порядок, но доменные политики остались вне поля зрения. Ну так уж случилось) Теперь этот доменчик мигрирует в новую среду, ессно что хочется навести порядок. Лезем в GPMC и видим что-то около 350 объектов групповых политик, многие прилинкованы совсем не к одному контейнеру, многие, как видно из их названия разрабытывались на основе какой то одной типовой и вроде бы как похожи. 
 
Задача - сделать реестр GPO, понять что лишнее, что можно скрестить друг с другом и и вообще - причесать весь этот взрыв на макаронной фабрике.
 
Ну для начала получаем репорты всех политики простым дедовским способом - на каждой из политик кликаем "правым глазом" и просим сохранить как html а потом и как xml. или пользуемся технетом, находим в нем раздел Group Policy Cmdlets in Windows PowerShell и получаем тоже что и в первом случае но гораздо быстрее)
 
А! совсем забыл! политики любят вызывать скрипты - выгружаем скрипты - в эксплорере, в адресной строке пишем \\имя_домена попадаем в корень и таи простым поиском ищем файлики со всевозможными исполняемыми расширениями вида *.bat, *.vbs, *.cmd и тому подобное.
ну и получаем кучу мусора в количестве около 600 файликов.
 
что ж теперь с этим барахлом делать?
 
ну... берем старый добрый Excel (спасибо товарищу Гейтсу!!!) и по первоначальной дурости пытаемся запихать в него данные XML.
Как ни странно Excel хоть и умеет это делать, но делает с косяками - причина кроется в самом формате XML - заголовки данных для каждого файлика будут разными - ибо в какой-то политике есть параметр, например logon script, а в другой - он просто не определен. От такого количества заголовков Excel-ю слегка сносит кукушечку и по началу он доооолго импортит данные (порядка 4-х часов). каждый раз пытаясь хоть как понять а какой заголовок чему соответвует, а потом мы получаем структурированную кашу работать с которой просто невозможно.
Берем свою вторую дурость и запихиваем данные в эксель путем копипасты из открытого в броузере репорта политики. получается все довольно не плохо, но это не таблица а так - какое то подобие. потом плюем и на форматирование пишем макрос копипасты из открытого excel-ем HTML с закрытием листа и копированием его в новую книгу. получаем 351 лист в новой книге. листать - невозможно. Вспоминаем про гиперссылки внутри книги. злобно сдираем в интернете макрос позволяющий сделать оглавление: http://www.planetaexcel.ru/techniques/3/60/
коротенько это вот так - 
Откройте Диспетчер Имен на вкладке Формулы (Formulas – Name Manager) и создайте новый именованный диапазон с именем, допустим, Оглавление. В поле Диапазон (Reference) введите вот такую формулу:
=ПОЛУЧИТЬ.РАБОЧУЮ.КНИГУ(1)  
=GET.WORKBOOK(1)
 
Теперь в переменной Оглавление содержатся наши искомые имена. Чтобы извлечь их оттуда на лист, можно воспользоваться функцией ИНДЕКС (INDEX), которая «выдергивает» элементы из массива по их номеру:
 
=ИНДЕКС(Оглавление; СТРОКА()) 
=INDEX(Оглавление; ROW())
 
Функция СТРОКА (ROW) выдает номер текущей строки и, в данном случае, нужна только для того, чтобы вручную не создавать отдельный столбец с порядковыми номерами извлекаемых элементов (1,2,3…). Таким образом, в ячейке А1 у нас получится имя первого листа, в А2 – имя второго и т.д.
И, наконец, для добавления к именам листов "живых" гиперссылок для быстрой навигации, можно использовать все ту же функцию ГИПЕРССЫЛКА (HYPERLINK), которая будет формировать адрес для перехода из имени листа
 
потом автоматизируем переход с каждого листа на лист с оглавлением - точно! именно созданием гиперссылки из первой ячейки листа!
ну, можно как то уже что то делать)))
смотрим на что получилось и понимаем что надо все это парсить - ну не совпадают номера ячеек на разных листах - так уж устроен вывод GPO в HTML - это даже не таблица, а просто хитро сверстанная простыня с набором данных.
 
пытаемся понять к каким контейнерам привязаны политики - опять таки макросом: 
 
Sub параметры_безопасности()
'
' Макрос11 Макрос
'
 
'
Line0:
C1 = "C1"
C2 = "C2"
Set RangeObj = Cells.Find(What:="Параметры данного объекта групповой политики применяются только для следующих групп, пользователей и компьютеров:", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
        If RangeObj Is Nothing Then GoTo Line1 Else RangeObj.Select
       Range(Selection, Selection.End(xlToRight)).Select
   C1 = ActiveCell.Address
   
   Set RangeObj = Cells.Find(What:="Фильтрация WMI", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
        If RangeObj Is Nothing Then GoTo Line1 Else RangeObj.Select
       Range(Selection, Selection.End(xlToRight)).Select
   C2 = ActiveCell.Address
   
   If C1 = C2 Then GoTo Line2 Else RangeObj.Select
 
   Range(C1, C2).Select
   
    Selection.Copy
    Worksheets("Лист5").Activate
        Selection.End(xlToLeft).Select
    Selection.End(xlDown).Select
    Range("B319").Select
    Selection.End(xlUp).Select
    ActiveCell.Offset(1, 0).Select
        Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    ActiveCell.Offset(1, -1).Select
    
    Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
 
    GoTo Line0
    
Line1:
    
    Set RangeObj = Cells.Find(What:="Делегирование", After:=ActiveCell, LookIn:=xlFormulas _
        , LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False)
        If RangeObj Is Nothing Then GoTo Line2 Else RangeObj.Select
       Range(Selection, Selection.End(xlToRight)).Select
   C2 = ActiveCell.Address
   
    If C1 = C2 Then GoTo Line2 Else RangeObj.Select
 
   Range(C1, C2).Select
   
    Selection.Copy
    Worksheets("Лист5").Activate
        Selection.End(xlToLeft).Select
    Selection.End(xlDown).Select
    Range("B319").Select
    Selection.End(xlUp).Select
    ActiveCell.Offset(1, 0).Select
    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=True
    ActiveCell.Offset(1, -1).Select
    'Stop
    
    Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
'    Stop
    GoTo Line0
    
Line2:     Worksheets("Лист5").Activate
        Selection.End(xlToLeft).Select
    Selection.End(xlDown).Select
    Range("B319").Select
    Selection.End(xlUp).Select
    ActiveCell.Offset(1, 0).Select
    ActiveCell = "N"
    ActiveCell.Offset(1, -1).Select
    
    Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True
 '   Stop
    GoTo Line0
End Sub
 
и увы - по другому итоговую табличку не заполнить...
 
поковырялись, получили табличку:
 
Домен/Сайт GUID Название User Group Policy loopback processing mode Comment (из GPMC, при наличии) Прерывается наследование (Y/N) Форсируется (Y/N) Объекты применения GPO исходного леса Объекты применения GPO целевого леса Назначение - описание результата отработки политики Выполняемые скрипты Тестовая (Y/N) Наличие настроек в Computer Configuration (Y/N) Наличие настроек в User Configuration (Y/N) Фильтрация по группам безопасности (Y/N) Фильтрация WMI (Y/N) Целевое состояние (переносится как есть, интегрируется в стандартные GPO, не переносится, см лист "Расширенный статус") Имя целевого GPO (если применимо) если вдруг не переезжает то не применимо
 
и вспомнили что  репорте нет данных о наследовании по контейнерам - т.е. столбец Прерывается наследование (Y/N) мы просто так не заполним....
 
вспоминаем что есть Group Policy Cmdlets in Windows PowerShell и в нем Get-GPInheritance - запускаем, получаем полную фигню вида:
 
Name                  : SS_WW
ContainerType         : OU
Path                  : ou=##_ws,dc=##,dc=###,dc=##
GpoInheritanceBlocked : No
GpoLinks              : {AAA_LLL_NO_WWW, AAA_1234_W7_##+$$ RR, AAA_1234+WWW, AAA_LLL_SSSS-CliInst...}
InheritedGpoLinks     :  {default domain controllers policy, default domain policy, AAA_1234+WWW, AAA_LLL_SSSS-CliInst...}
 
как видим - линки обрезаны, попытки поиграться с выводом ни к чему не приводят....
 
рвем последние волосья на лысине, лезем в гугл и.... Аллилуя!!!!! 
Некий Fred Young, The University of Waikato, Hamilton, NZ, (https://github.com/wanion) в далеком 2012 году создал набор функций к PowerShell-у решающих именно мою задачу. И опубликовал их!! Низкий поклон тебе добрый человечищще!!!! и пусть в твоей Новой Зеландии всегда будет хорошая погода, и да не перестанут коровы давать молоко, и трава всегда будет зеленой и океан комфортной температуры!
 
 
вот такая история происходила с 8-го января по 10-е февраля 
 
вверх^ к полной версии понравилось! в evernote
Комментарии (1):
Gorely 16-02-2015-04:38 удалить
ах да.... как же все таки сравнить между собой политики)))) да очень просто т.к. на экспорте в ХТМЛ мы имеем куски текста - то и сравнивать мы будем тупо текст - для чего нам подойдет хоть тот же самый (Хвала Великому!!!) WinWord или (что лично меня устраивает) Notepad++ - открыли 2 новых файлика, пустых разумеется, открыли 2 политики в броузере - скопировали текст в нотепад и нажали Alt+D результат вам понраится надо только не забывать, что в разные политики ОДНИ те те же параметры могут внесены в разное время, отчего может показаться что они сиииильно отличаются...


Комментарии (1): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник 350 GPO и все-все-все | it_is_it - Ничего не трогай, ничего не меняй! | Лента друзей it_is_it / Полная версия Добавить в друзья Страницы: раньше»