![]() |
Скрипт - оповещение об изменении в группе AD
Если в группе AD типа "FS*" есть в поле Description текст "Штат*", то необходимо найти эту группу "Штат*" и отправить человеку, состоящему в ней, письмо (типа ответственному лицу за эту группу). В письме должна быть информация о той самой группе "FS*", а именно в ней находятся тоже группы "Штат*", которые содержат конкретных юзеров (часто нескольких или вообще никого), и в письме нужно указать ФИО, должность и отдел этого каждого юзера. Кроме того письмо должно отравляться только в том случае, если в группе произошли изменения.
Спасибо, большое Kazun за помощь в теме Index was outside the bounds of the array, где он написал как лучше получить данные о юзерах. В результате эти данные оказалось удобнее всего записать в .csv-файл. Проверку факта изменения в группе я решил сделать через атрибут группы usnchanged, а саму группу идентифицировать по атрибуту objectguid. На данный момент у меня есть это: С powershell только начал разбираться, до этого скрипты вообще не давали писать, поэтому может я вообще не правильно начал и всё можно проще сделать. Прошу помощи и критики |
Если слишком много прошу, то хотя бы вот это может подскажете:
Compare-Object -ReferenceObject $massivenew -DifferenceObject $massiveold -IncludeEqual -Property objectguid | foreach { # если группа есть в старом массиве и её нет в нынешнем, то эту строку надо удалить из старого массива if ($_.SideIndicator -eq "=>") { $massive = @() $mas = 0 foreach ($mas in $massiveold){ # !тут проверка почему-то не даёт результата и mas записывается в массив в любом случае, не понимаю почему if ("$mas.objectguid" -ne "$_.objectguid") { $massive += $mas } } $massiveold = $massive $massiveold | export-csv -Path $changefailpath -Encoding Unicode -NoTypeInformation } В массивах инфа из csv-файлов. Csv-файл содержит следующее: "objectguid","usnchanged" "ffbb1f66-8dae-4009-a138-a27a1658a652","51719894" "68ae1a6a-bd2b-4c74-82df-0944c59bb54f","78975645" "5e2cfe12-9810-415b-9a17-8b587fe7fe3a","49131227" |
1) usnchanged - неуникальный параметр и различается на разных DC
2) Зачем дублировать перменные $group и $massivenew? Два раза заполняются одинаковыми данными. 3) Зачем получать группы, которые не подпадают под условие Description? 4) Зачем заполнять Description значением Штат*,а сравнивать objectguid ? Или предполагается,что группы никогда не переименовываются ? 5) $_.SideIndicator -eq "=>" - Какой смысл операции? Эти данные уже не нужны , поэтому надо отфильтровать только по $_.SideIndicator -ne "=>" и выгрузить новый файл 1 раз, а не для каждой группы. 6) Членство меняется в группах Штат,а не в тех где содежится атрибут description штат. Поэтому для какой группы ожидается изменение членства? 7) Группа FS может иметь одинаковый usnchanged, а вот у вложенных групп usnchanged будет разный, но Description под условие Штат* не подпадет. |
Kazun, как же лучше контролировать изменения, если атрибут usnchanged не подходит?
2) сначала писал часть с получением информации о пользователях, потом тестировал отправление сообщений и уже потом писал проверку изменений в группе. Действительно, $group уже не нужен. |
Тупо в лоб, по членству в группе.
|
4) Description может быть одинаковым у разных групп, имя группы со временем тоже может измениться, поэтому уникальный идентификатор objectguid мне показался лучшим для точной идентификации группы. Или лучше использовать другой критерий?
6) Да, должно было контролироваться только добавление прав новым должностям (группам "Штат*"). То есть членство в группе, где есть description "Штат*". Но это я не додумал. Теперь думаю сохранять csv-файл для каждой группы на диске и сверять с ними, поэтому будет видно изменения и в группах "Штат*" . |
4) ObjectGuid - не меняется, но и в Description его нет. Поэтому при переименовании, в Description будет имя, а не objectguid и поиск будет затруднен.
PS. А вообще задача странная, отсылать отчет об изменении пользователю, что в конечном итоге через полгода изменений не даст полной картины. Почему не отправлять актуальное членство в группах по требованию? |
Kazun, потому что ответственные за папки - это руководители отделов и им начхать на безопасность, пока не обнаружится, что кто-то сливает конкурентам информацию. А вот если к ним придёт письмо и там окажется, что доступ к папке имеет человек не из их отдела, то они могут об этом сообщить.
По этой же причине изначально я не хотел инфу засовывать в отдельный файл, а чтобы была красивая табличка сразу в письме. Но ради простоты решил оставить это на потом. Вообще, хотел делать просто рассылку раз в месяц, но ребята из центрального офиса сказали, что пускай будет рассылка только при изменениях в группе - вот и пыжусь ) Хотя в конечном итоге я хочу подтянуть себя в powershell, поэтому чем задача сложнее, тем лучше, наверное. Kazun, 4) я кажется понял. Ты имеешь ввиду, что группу "Штат" могут изменить? Да, это тоже может вылиться в проблему. Но группа Штат скорее всего не изменится, а будет создана другая, когда должность решать изменить. Человека перенесут в новую группу, а старую удалят когда всё устаканится. Возможно Description будут менять отдельным скриптом, но скорее всего об этом никто не думал ещё. Большое спасибо за помощь. Перепишу скрипт с учётом выявленных проблем. |
Всё-таки дописал код, но появилась проблема.
Если у пользователя не заполнено одно из полей, например, title или department, то Compare-Object сравнивает неправильно: считает строчку полученную из AD и сохранённую в файле разными (оба объекта PSCustomObject ). Этот объект в csv файле пишется так: "Иванов Иван Иванович";; Выделил жирным в коде проблемные строки. Очень жду критику и надеюсь на помощь Код:
Import-Module Activedirectory |
Цитата:
![]() Это нагляднее, особенно в коде. |
Iska, спасибо!
Правда у меня нет такого выбора при редактировании. Использовал написание тега вручную. |
Посмотрите в Профиль, Настройки форума, Разное. Попробуйте перевыбрать «Интерфейс редактора сообщений: Базовый редактор…».
|
1)Как вариант можно обнулить значения из CSV файла, т.к "" -ne $null.
Код:
$prop = Write-Output Name Title Department |
Iska, у меня был выбран расширенный редактор. Выбрал базовый, но не помогло.
Kazun, 1) Спасибо! Помогло :) Использование в данному случае Write-Output для меня неожиданно, возьму на заметку. 2) Должности меняются довольно редко, поэтому особой проблемы нет. Если изменился человек на данной должности, то в целом можно было бы сделать доп. проверку, но я думаю, что новенькому сотруднику это не нужно, т.к. он ещё не влился в работу. Добавил в скрипт возможность исключать из проверки некоторые группы. В целом скрипт работает как надо, за что огромное спасибо тебе, Kazun! Ещё хотелось бы: 1) body письма как-нибудь выудить из функции и задавать в начале скрипта. 2) в csv-файле, когда открываешь его в excel, все ширина столбцов стандартного размера, а хотелось бы, чтобы ширина подбиралась по содержимому ячеек. Код:
Import-Module Activedirectory |
Время: 20:53. |
Время: 20:53.
© OSzone.net 2001-