Войти

Показать полную графическую версию : Парсинг GPO из HTML в БД


dahiko
01-11-2023, 14:37
Всем привет!

Есть такая задача - автоматизировать поиск измений в групповых политиках GPO. Т.к. стандарнтные средства Active Directory не показывают, что именно изменилось в GPO, а только сам факт изменения можно увидеть в логе, я решил написать что-то свое.

И так, у меня есть такая идея:

Экспортировать в HTML-отчет те GPO, которые я хочу отслеживать. Например так:
Get-GPOReport -Name "Default Security For Domain" -ReportType HTML -Path "C:\users\vasya\Desktop\GPOReport1.html"

Распарсить этот HTML-файл и сложить куда-то, например в БД. Пока не понимаю, как это будет выглядеть. Возможно в одну ячейчку в JSON формате все запихнуть. А возможно и сделать отдельную таблицу с столбцами для параметров GPO.
Далее отсжеживать изменение GPO по дате. Если поменялась, опять повторить пункты 1 и 2.
Затем сравнивать между собой два результата, чтобы понять ЧТО именно поменялось.


Вот я сейчас застрял на втором пункте и не понимаю, как это лучше сделать? Есть небольшой опыт в BASH и Powershell. Как написать такую регулярку, чтобы все разложила пополочкам, не понимаю. С моими навыками в BASH смогу точно выдернуть информацию из разделов GPO "Подробности", "Ссылки". Но разделы "Конфигурция конмпьюрета" и "Конфигурация пользователя" не смогу. Все усложняется тем, что в этих разделах внутри GPO может быть много политик - более тысячи запросто. А у каждой политики несколько значений параметра и вложенные в них подпараметры.

Пример 1.
В политике «Конфигурация компьютера\Политики\Конфигурация Windows\Параметры безопасности\Локальные политики/Параметры безопасности\Аудит\Аудит: аудит доступа глобальных системных объектов» может несколько значений Параметра: «Включено», «Отключено» или «Не определено».

Пример2.
В политике «Конфигурация компьютера\Политики\Административные шаблоны\Компоненты Windows/Политики автозапуска\Выключение автозапуска» может несколько значений Параметра: «Включено», «Выключено» или «Не определено». А так же у параметра может быть еще и вложенный параметр. В данном случае он называется «Отключить автозапуск:» и он тоже имеет несколько значений. Например "Все устройства".

И таких нюансов много, и не могу найти закономерность.


Примечания:

Делать простой DIFF двух HTML файлов построчно – не подходит. Так, как в одной строке в GPO много лишней информации, которая мешает. И приходится потом все равно глазами искать, что же именно было изменено. Пробовал - совсем не то, что нужно.

Перевести HTML в JSON пробовал разными онлайн сервисами - не подходит, потому что в JSON меняется структура и нет полного пути к конкретной политике. Например, из этого остается только это [U]«Аудит: аудит доступа глобальных системных объектов». И это совсем плохо, т.к. нет понимания где именно в GPO лежит эта политика. Так что сокрее всего нужно что-то кастомное.

Каждую GPO можно выгрузить еще и в XML. Но структура XML содержит не полную информацию, поэтому все таки приходится использовать HTML в момент выгрузки всех параметров GPO. Именно в HTML есть полный путь к конкретному пункту политики.


Если кто-то сталкивался с такой задачей, просьба подсказать. Если получиться правильно все распарсить, то смогу далее прикрутить к этому некий веб-интерфейс и вообще получится "конфетка".

Пример HTML файла можно взять тут (https://cloud.mail.ru/public/m6Dj/KwKmPnxDa)

Заранее спасибо!

P.S. Не предлагайте Policy Analyzer - не подходит.

DJ Mogarych
01-11-2023, 15:38
Перевести HTML в JSON »

gc 'D:\Downloads\Default Security for Domain Vasya.html' -Encoding utf8 |
C:\scripts\pandoc\pandoc.exe -f html -t json -o 'D:\Downloads\Default Security for Domain Vasya.json'

https://pandoc.org/

dahiko
02-11-2023, 07:40
https://pandoc.org/ »


Прикольная штука. Попробовал, т.к. делал на Винде, то у меня было так:
C:\Users\vasya\Desktop\pandoc.exe C:\Users\vasya\Desktop\123.html -f html -t json -o C:\Users\vasya\Desktop\123.json



И вот, что получилоь:
1. Pandoc перевел все в одну строку и там куча массивов внутри массива. Это усложняет дальше обрабатывать этот файл. По крайней мере для меня. В принципе я делал тоже самое на сайте https://alldocs.app/convert-html-to-pandoc-json когда искал решение.

2. Pandoc добавляет лишнее. Например, из этого "Время ожидания в секундах перед включением заставки" получилось это

[{"t":"Str","c":"Время"},{"t":"Space"},{"t":"Str","c":"ожидания"},{"t":"Space"},{"t":"Str","c":"в"},{"t":"Space"},{"t":"Str","c":"секундах"},{"t":"Space"},{"t":"Str","c":"перед"},{"t":"Space"},{"t":"Str","c":"включением"},{"t":"Space"},{"t":"Str","c":"заставки"}]}]]]]

Нужно опять писать какие-то регулярки, чтобы дальше это собрать в одно предложение без лишней воды.

Вобщем, не совсем то, что хочется, но буду попробовать дальше раскручивать Pandoc и искать другие решения. Спасибо.

DJ Mogarych
02-11-2023, 09:41
Переводите не в json, a в plain text, там результат получается лучше:


gc 'D:\Downloads\Default Security for Domain Vasya.html' |
C:\scripts\pandoc\pandoc.exe -f html -t plain -o 'D:\Downloads\Default Security for Domain Vasya.txt'

dahiko
02-11-2023, 13:13
gc 'D:\Downloads\Default Security for Domain Vasya.html' |
C:\scripts\pandoc\pandoc.exe -f html -t plain -o 'D:\Downloads\Default Security for Domain Vasya.txt' »

Это выглядит намного лучше. Есть нюансы конечно.

1. Например, эту же строку "Время ожидания в секундах перед включением заставки" вернул вот так:

+-----------------------+-----------------------+-----------------------+
| Тайм-аут экранной | Включено | |
| заставки | | |
+-----------------------+-----------------------+-----------------------+
| ----------------- | | |
| --------------------- | | |
| --------------- ----- | | |
| Время ожидан | | |
| ия в секундах перед в | | |
| ключением заставки | | |
| | | |
| | | |
| | | |
| Секунды: | | |
| | | |
| 700 | | |
| ----------------- | | |
| --------------------- | | |
| --------------- ----- | | |
+-----------------------+-----------------------+-----------------------+

2. Еще добавил символы тире в заголовках столбцов и их количество отличается в зависимости от содержимого текста

Системные объекты

Политика Параметр
----------------------------------------------------------------------------------------------------------------------- ----------
Системные объекты: усилить разрешения по умолчанию для внутренних системных объектов (например, символических ссылок) Включено

Устройства

Политика Параметр
----------------------------------------------------------------------------------------- ----------------
Устройства: запретить пользователям установку драйверов принтера Включено
Устройства: разрешить доступ к дисководам гибких дисков только локальным пользователям Отключено
Устройства: разрешить доступ к дисководам компакт-дисков только локальным пользователям Отключено
Устройства: разрешить форматирование и извлечение съемных носителей Администраторы


Кажется с этим лучше работать, чем с тем JSON. Спасибо.

Тему пока не буду отмечать решенной. Вдруг еще кто-то напишет что-то полезного.




© OSzone.net 2001-2012