Войти

Показать полную графическую версию : [решено] Скрипт - оповещение об изменении в группе AD


Geliosvamp
14-08-2014, 15:53
Если в группе AD типа "FS*" есть в поле Description текст "Штат*", то необходимо найти эту группу "Штат*" и отправить человеку, состоящему в ней, письмо (типа ответственному лицу за эту группу). В письме должна быть информация о той самой группе "FS*", а именно в ней находятся тоже группы "Штат*", которые содержат конкретных юзеров (часто нескольких или вообще никого), и в письме нужно указать ФИО, должность и отдел этого каждого юзера. Кроме того письмо должно отравляться только в том случае, если в группе произошли изменения.
Спасибо, большое Kazun за помощь в теме Index was outside the bounds of the array (http://forum.oszone.net/showthread.php?p=2387705#post2387705), где он написал как лучше получить данные о юзерах. В результате эти данные оказалось удобнее всего записать в .csv-файл.
Проверку факта изменения в группе я решил сделать через атрибут группы usnchanged, а саму группу идентифицировать по атрибуту objectguid.

На данный момент у меня есть это:


Import-Module Activedirectory
cls
# задаем переменные
$path = "OU=FS,OU=Groups,OU=Ulsk,DC=corp,DC=contoso,DC=loc" # ветка АД, где искать группы FS_*
$outcsvpath = "e:\"
$changefailpath = "$outcsvpath"+"changemeter.csv"
$mailfrom = "gelios@mail.ru"
$smtpserver = "mail.ru"

# получаем список CN групп, которые есть в ветке $path
$group = Get-ADGroup -Filter * -searchbase $path -Properties * -SearchScope Subtree | Foreach {$_.CN}

# функция получает группу FS, проверяет есть ли ответственный.
# если есть ответственный, то собирает инфу о юзерах в этой группе и отправляет эту инфу в .csv-файле ответственному
function sendinfo ($fs)
{
if ($fs -ne $NULL){
$desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
# если в описании группы написано Штат*, то выполняем
if ($desc -like "Штат*")
{
# получаем уникальные имена групп Штат_*, входящих в группу FS_*
$distnames = Get-ADGroupMember $fs | Foreach {$_.distinguishedName}
# для каждой группы Штат_*, входящей в FS_*
$m = @()
foreach ($distname in $distnames)
{
$m += @(Get-ADGroupMember $distname -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department)
}
$mailto = Get-ADGroupMember $desc | foreach {$_.mail}
$m | export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
Send-MailMessage -From "$mailfrom" -To "$mailto" -SmtpServer "$smtpserver" -Encoding UTF8 -Subject "Отчёт о доступе к папке $fs" -Body "Добрый день! Это отчёт о доступе к подконтрольной Вам папке $fs" -Attachments ($outcsvpath + "$fs" + ".csv")
Remove-Item -Path ("$outcsvpath" + "$fs" + ".csv")
}
}
}

# получаем массив данных для сравнения атрибутов
$massivenew = @()
$i=0
for ($i=0; $i -le ($group.Count-1); $i++)
{
$massivenew += @(Get-ADGroup -Identity $group[$i] -Properties uSNChanged | Select-Object -property objectguid, usnchanged)
}

# эта строка для создания первого файла .csv, с которым будет идти сравнение изменений
#$massivenew |export-csv -Path $changefailpath -Encoding Unicode -NoTypeInformation

# импортируем данные о группе, собранные раньше, чтобы сравнить их с тем, что есть сейчас
$massiveold = Import-Csv $changefailpath

# сравниваем оба массива по атрибуту objectguid
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-файл
# и отправить письмо о содержащихся там сотрудниках ответственному лицу
elseif ($_.SideIndicator -eq "<=")
{
$mas = 0
foreach ($mas in $massivenew)
{
if ("$mas.objectguid" -eq "$_.objectguid")
{
$massiveold += $mas
$fss = Get-ADObject -Properties objectguid, name -Identity "$mas.objectguid" | foreach {$_.name}
}
}
$massiveold | export-csv -Path $changefailpath -Encoding Unicode -NoTypeInformation
sendinfo $fss
}
# если objectguid не различаются в массивах, то нужно сравнивать атрибуты uSNChanged
# если артибуты разные, то ответственному соответствующей группы нужно отправить данные о пользователях
else
{
Compare-Object -ReferenceObject $massivenew -DifferenceObject $massiveold -Property uSNChanged | foreach {
if ($_.SideIndicator)
{
$massive = @()
$mas = 0
foreach ($mas in $massivenew)
{
if (("$mas.uSNChanged" -ne "$_.uSNChanged") -and ("$mas.objectguid" -eq "$_.objectguid"))
{
$massive += $mas
$fss = Get-ADObject -Properties objectguid, name -Identity "$mas.objectguid" | foreach {$_.name}
}
}
$massiveold = $massive
$massiveold | export-csv -Path $changefailpath -Encoding Unicode -NoTypeInformation
sendinfo $fss
}
}
}
}


С powershell только начал разбираться, до этого скрипты вообще не давали писать, поэтому может я вообще не правильно начал и всё можно проще сделать.
Прошу помощи и критики

Geliosvamp
14-08-2014, 17:20
Если слишком много прошу, то хотя бы вот это может подскажете:

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"

Kazun
14-08-2014, 19:11
1) usnchanged - неуникальный параметр и различается на разных DC
2) Зачем дублировать перменные $group и $massivenew? Два раза заполняются одинаковыми данными.
3) Зачем получать группы, которые не подпадают под условие Description?
4) Зачем заполнять Description значением Штат*,а сравнивать objectguid ? Или предполагается,что группы никогда не переименовываются ?

5) $_.SideIndicator -eq "=>" - Какой смысл операции? Эти данные уже не нужны , поэтому надо отфильтровать только по $_.SideIndicator -ne "=>" и выгрузить новый файл 1 раз, а не для каждой группы.

6) Членство меняется в группах Штат,а не в тех где содежится атрибут description штат. Поэтому для какой группы ожидается изменение членства?

7) Группа FS может иметь одинаковый usnchanged, а вот у вложенных групп usnchanged будет разный, но Description под условие Штат* не подпадет.

Geliosvamp
15-08-2014, 08:52
Kazun, как же лучше контролировать изменения, если атрибут usnchanged не подходит?

2) сначала писал часть с получением информации о пользователях, потом тестировал отправление сообщений и уже потом писал проверку изменений в группе. Действительно, $group уже не нужен.

Kazun
15-08-2014, 09:08
Тупо в лоб, по членству в группе.

Geliosvamp
15-08-2014, 09:35
4) Description может быть одинаковым у разных групп, имя группы со временем тоже может измениться, поэтому уникальный идентификатор objectguid мне показался лучшим для точной идентификации группы. Или лучше использовать другой критерий?
6) Да, должно было контролироваться только добавление прав новым должностям (группам "Штат*"). То есть членство в группе, где есть description "Штат*". Но это я не додумал. Теперь думаю сохранять csv-файл для каждой группы на диске и сверять с ними, поэтому будет видно изменения и в группах "Штат*" .

Kazun
15-08-2014, 09:51
4) ObjectGuid - не меняется, но и в Description его нет. Поэтому при переименовании, в Description будет имя, а не objectguid и поиск будет затруднен.


PS. А вообще задача странная, отсылать отчет об изменении пользователю, что в конечном итоге через полгода изменений не даст полной картины. Почему не отправлять актуальное членство в группах по требованию?

Geliosvamp
15-08-2014, 10:07
Kazun, потому что ответственные за папки - это руководители отделов и им начхать на безопасность, пока не обнаружится, что кто-то сливает конкурентам информацию. А вот если к ним придёт письмо и там окажется, что доступ к папке имеет человек не из их отдела, то они могут об этом сообщить.
По этой же причине изначально я не хотел инфу засовывать в отдельный файл, а чтобы была красивая табличка сразу в письме. Но ради простоты решил оставить это на потом.

Вообще, хотел делать просто рассылку раз в месяц, но ребята из центрального офиса сказали, что пускай будет рассылка только при изменениях в группе - вот и пыжусь )
Хотя в конечном итоге я хочу подтянуть себя в powershell, поэтому чем задача сложнее, тем лучше, наверное.

Kazun,
4) я кажется понял. Ты имеешь ввиду, что группу "Штат" могут изменить?
Да, это тоже может вылиться в проблему. Но группа Штат скорее всего не изменится, а будет создана другая, когда должность решать изменить. Человека перенесут в новую группу, а старую удалят когда всё устаканится. Возможно Description будут менять отдельным скриптом, но скорее всего об этом никто не думал ещё.

Большое спасибо за помощь. Перепишу скрипт с учётом выявленных проблем.

Geliosvamp
25-08-2014, 14:45
Всё-таки дописал код, но появилась проблема.
Если у пользователя не заполнено одно из полей, например, title или department, то Compare-Object сравнивает неправильно: считает строчку полученную из AD и сохранённую в файле разными (оба объекта PSCustomObject ).
Этот объект в csv файле пишется так: "Иванов Иван Иванович";;
Выделил жирным в коде проблемные строки.
Очень жду критику и надеюсь на помощь


Import-Module Activedirectory
cls
# задаем переменные
$path = "OU=FS,OU=Groups,OU=Ulsk,DC=corp,DC=contoso,DC=loc" # ветка АД, где искать группы FS_*
$outcsvpath = "e:\FS_Script\" # путь, куда сохраняются файлы
$changefailpath = "$outcsvpath" + "comparison.csv" # путь сохранения файла изменений
$mailfrom = "gelios@mail.ru" # почтовый адрес, от имени которого осуществляется рассылка
$smtpserver = "mail.ru" # почтовый сервер
$mailbody =


# функция создаёт файл "FS*" с инфой и обновляет файл comparison.csv
function sendinfo ($fss)
{
$massiveold = Import-Csv -Path $changefailpath -Encoding UTF8
foreach ($fs in $fss)
{
if ($fs -ne $NULL)
{
# получаем description группы fs
$desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
# если description содержит "Штат"
if ($desc -like "Штат*")
{
# получаем данные о пользователях папки fs
Get-ADGroupMember $fs -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department |
# записываем данные в соответствующий файл
export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
"Сохранен файл: " + "$outcsvpath" + "$fs" + ".csv"
# получаем почтовый адрес ответственного
$mailto = Get-ADGroupMember $desc | foreach {$_.mail}
Send-MailMessage -From "$mailfrom" -To "$mailto" -SmtpServer "$smtpserver" -Encoding UTF8 `
-Attachments ("$outcsvpath" + "$fs" + ".csv") -Subject "Отчёт о доступе к папке $fs" `
-Body "Добрый день! В доступе к подконтрольной Вам папке $fs произошли изменения. `n
Подробная информация о том, кто имеет к ней доступ, содержится во вложенном файле. `n

Ваш, департамент ИТ."
"Отправлено письмо по адресу: $mailto"
# получаем массив, содержащий имя группы и её description
if ($massiveold.name -notcontains $fs)
{
$massiveold += Get-ADGroup -Identity "$fs" -Properties description, name | select name, description
}
}

}
}
# сохраняем обновлённую информацию в comparison.csv
$massiveold | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Файл $changefailpath обновлён"
}


# функция для начального создания файлов csv с информацией о юзера в группах
function Get-FirstFiles
{
# получаем имена групп в OU $path
$fss = Get-ADGroup -Filter * -SearchBase "$path" -Properties name| foreach {$_.name}
$compfile = @()

foreach ($fs in $fss)
{
if ($fs -ne $NULL)
{
# получаем description группы fs
"fs= $fs"
$desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
# если description содержит "Штат"
if ($desc -like "Штат*")
{
# получаем данные о пользователях папки fs
$m = Get-ADGroupMember $fs -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department |
# записываем данные в соответствующий файл
export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
"fs= $fs"
# получаем массив, содержащий имя группы и её description
$compfile += Get-ADGroup -Identity "$fs" -Properties description, name | select name, description
"Сохранен файл: $outcsvpath" + "$fs" + ".csv"+"`n"
}

}
}
# сохраняем информацию для проверки изменений в comparison.csv
$compfile | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Файлы для всех папок FS сохранены"
}
#Get-FirstFiles
# получаем массив новых данных о группах FS и отбираем только те, у которых в description вида "Штат*"
$massivenew = Get-ADGroup -Filter * -searchbase $path -Properties name, description -SearchScope Subtree |
select name, description | where {$_.description -like "Штат*"}
# получаем массив имён всех файлов с данными, которые записаны в comparison.csv
$massiveold = Import-Csv -Path $changefailpath -Encoding UTF8

# сравниваем новый массив со старым по имени групп
compare-Object -ReferenceObject $massivenew -DifferenceObject $massiveold -IncludeEqual -Property name | foreach {

# если папка есть в AD и её нет в файле, то создаём файл и отправляем информацию ответственному
if ($_.SideIndicator -eq "<=")
{
"Найдена новая папка в AD: $($_.name)"
sendinfo -fss "$($_ | foreach {$_.name})"

}
# если name не отличается от старого, то нужно проверить description
elseif ($_.SideIndicator -eq "==")
{
# получаем имя группы, у которой нужно проверить description
$name = $_.name
# получаем description группы с таким именем из нового массива
$massivenew | foreach {
if ($_.name -eq "$name")
{
$descnew = $_.description
}
}
# получаем description группы с таким именем из старого массива
$massiveold | foreach {
if ($_.name -eq "$name")
{
$descold = $_.description
}
}

# сравниваем description новый и старый
# если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv
if ($descnew -ne $descold)
{

$massive = @()
$i = ""
foreach ($i in $massiveold) {
if (($i.name) -ne $name)
{
$massive += $i
}
}

$massiveold = $massive
$massive | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
sendinfo -fss $name
"Отличаются description"
}
# если description не изменился, сравниваем все поля в файлах и, если находим хоть одно несоответствие,
# то отправляем письмо ответственному с новой информацией
else
{
$name = $_.name
"name = $name"
$usersold = Import-Csv -Path ("$outcsvpath" + "$name" + ".csv") -Encoding UTF8 -Delimiter ";"
$usersnew = Get-ADGroupMember $name -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department
Compare-Object -ReferenceObject $usersnew -DifferenceObject $usersold -Property Name,Title,Department | Sort-Object -Unique | foreach
$tempname = $null
$_
if ($_.SideIndicator -ne "==")
{
$tempname = $name
"tempname = $tempname"
"Изменилось = $_"
}
if ($tempname -ne $null)
{
sendinfo -fss $tempname
"Что-то изменилось в файле $outcsvpath" + "$name" + ".csv"
}
}
}
}
# если папка есть в старых данных, но её нет в AD, то надо её удалить из comparison.csv и удалить файл с именем этой папки
else
{
$fs = $_.name
"Найдена устаревшая запись о папке: $fs."
$massive = @()
$massiveold | foreach {
if ($_.name -notcontains "$fs")
{
$massive += $_
}
}
$massive | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Файл $changefailpath обновлён. Запись $fs удалена"

dir $outcsvpath | where {$_.name -eq "$fs.csv"} | Remove-Item
"Файл $outcsvpath" + "$fs" + ".csv удален"
}
}

Iska
25-08-2014, 15:14
Выделил жирным в коде проблемные строки. »
Лучше выделяйте посредством тэга (http://forum.oszone.net/misc.php?do=bbcode#highlight):

http://i.imgur.com/ftxaNhd.png

Это [HIGHLIGHT]нагляднее, особенно в коде.

Geliosvamp
25-08-2014, 15:35
Iska, спасибо!
Правда у меня нет такого выбора при редактировании. Использовал написание тега вручную.

Iska
25-08-2014, 15:59
Посмотрите в Профиль (http://forum.oszone.net/usercp.php), Настройки форума, Разное. Попробуйте перевыбрать «Интерфейс редактора сообщений: Базовый редактор…».

Kazun
25-08-2014, 16:39
1)Как вариант можно обнулить значения из CSV файла, т.к "" -ne $null.

$prop = Write-Output Name Title Department
$usersold | Foreach {
$obj = $_
$prop | Foreach { if($obj.$_ -eq ""){$obj.$_ = $null}
}

2) если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv - Изменилось значение у группы,а состав остался, какой смысл высылать описание у группы владельцу?

Geliosvamp
26-08-2014, 11:42
Iska, у меня был выбран расширенный редактор. Выбрал базовый, но не помогло.

Kazun,
1) Спасибо! Помогло :) Использование в данному случае Write-Output для меня неожиданно, возьму на заметку.
2) Должности меняются довольно редко, поэтому особой проблемы нет. Если изменился человек на данной должности, то в целом можно было бы сделать доп. проверку, но я думаю, что новенькому сотруднику это не нужно, т.к. он ещё не влился в работу.

Добавил в скрипт возможность исключать из проверки некоторые группы.

В целом скрипт работает как надо, за что огромное спасибо тебе, Kazun!

Ещё хотелось бы:
1) body письма как-нибудь выудить из функции и задавать в начале скрипта.
2) в csv-файле, когда открываешь его в excel, все ширина столбцов стандартного размера, а хотелось бы, чтобы ширина подбиралась по содержимому ячеек.


Import-Module Activedirectory
cls
# задаем константы
$path = "OU=FS,OU=Groups,OU=Ulsk,DC=corp,DC=contoso,DC=loc" # ветка АД, где искать группы FS_*
$outcsvpath = "e:\FS_Script\" # путь, куда сохраняются файлы
$changefailpath = "$outcsvpath" + "comparison.csv" # путь сохранения файла изменений
$mailfrom = "gelios@mail.ru" # почтовый адрес, от имени которого осуществляется рассылка
$smtpserver = "mail.ru" # почтовый сервер

# список папок, которые исключаются из поиска
$exceptions =
@(
""
)

# функция создаёт файл "FS*" с инфой и обновляет файл comparison.csv
function sendinfo ($fss)
{
$massiveold = Import-Csv -Path $changefailpath -Encoding UTF8
foreach ($fs in $fss)
{
if ($fs -ne $NULL)
{
# получаем description группы fs
$desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
# если description содержит "Штат"
if ($desc -like "Штат*")
{
# получаем данные о пользователях папки fs
Get-ADGroupMember $fs -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department |
# записываем данные в соответствующий файл
export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
"Сохранен файл: " + "$outcsvpath" + "$fs" + ".csv"
# получаем почтовый адрес ответственного
$mailto = Get-ADGroupMember $desc | Get-ADUser -Properties mail | foreach {$_.mail}
Send-MailMessage -From "$mailfrom" -To "$mailto" -SmtpServer "$smtpserver" -Encoding UTF8 `
-Attachments ("$outcsvpath" + "$fs" + ".csv") -Subject "Отчёт о доступе к папке $fs" `
-Body "Добрый день! В доступе к подконтрольной Вам папке $fs произошли изменения. `n
Подробная информация о том, кто имеет к ней доступ, содержится во вложенном файле. `n

Ваш, департамент ИТ."
"Отправлено письмо по адресу: $mailto"
# получаем массив, содержащий имя группы и её description
if ($massiveold.name -notcontains $fs)
{
$massiveold += Get-ADGroup -Identity "$fs" -Properties description, name | select name, description
}
}

}
}
# сохраняем обновлённую информацию в comparison.csv
$massiveold | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Файл $changefailpath обновлён"
}


# функция для начального создания файлов csv с информацией о юзера в группах
function Get-FirstFiles
{
# получаем имена групп в OU $path
$fss = Get-ADGroup -Filter * -SearchBase "$path" -Properties name| foreach {$_.name}
$compfile = @()

foreach ($fs in $fss)
{
if ($fs -ne $NULL)
{
# получаем description группы fs
"fs= $fs"
$desc = Get-ADGroup -Identity "$fs" -Properties Description | Foreach {$_.Description}
# если description содержит "Штат"
if ($desc -like "Штат*")
{
# получаем данные о пользователях папки fs
$m = Get-ADGroupMember $fs -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department |
# записываем данные в соответствующий файл
export-csv -Path ("$outcsvpath" + "$fs" + ".csv") -Encoding UTF8 -NoTypeInformation -Delimiter ";"
"fs= $fs"
# получаем массив, содержащий имя группы и её description
$compfile += Get-ADGroup -Identity "$fs" -Properties description, name | select name, description
"Сохранен файл: $outcsvpath" + "$fs" + ".csv"+"`n"
}

}
}
# сохраняем информацию для проверки изменений в comparison.csv
$compfile | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Файлы для всех папок FS сохранены"
}

#Get-FirstFiles

# получаем массив новых данных о группах FS и отбираем только те, у которых в description вида "Штат*"
# так же отбрасываем исключения, содержащиеся в $exceptions
$massivenew = Get-ADGroup -Filter * -searchbase $path -Properties name, description -SearchScope Subtree |
select name, description | where {($_.description -like "Штат*") -and ($exceptions -notcontains $_.name)}

# получаем массив имён всех файлов с данными, которые записаны в comparison.csv
$massiveold = Import-Csv -Path $changefailpath -Encoding UTF8

# сравниваем новый массив со старым по имени групп
compare-Object -ReferenceObject $massivenew -DifferenceObject $massiveold -IncludeEqual -Property name | foreach {

"Проверяем $($_.name)"
# если папка есть в AD и её нет в файле, то создаём файл и отправляем информацию ответственному
if ($_.SideIndicator -eq "<=")
{
"Найдена новая папка в AD: $($_.name)"
sendinfo -fss "$($_ | foreach {$_.name})"

}
# если name не отличается от старого, то нужно проверить description
elseif ($_.SideIndicator -eq "==")
{
# получаем имя группы, у которой нужно проверить description
$name = $_.name
# получаем description группы с таким именем из нового массива
$massivenew | foreach {
if ($_.name -eq "$name")
{
$descnew = $_.description
}
}
# получаем description группы с таким именем из старого массива
$massiveold | foreach {
if ($_.name -eq "$name")
{
$descold = $_.description
}
}

# сравниваем description новый и старый
# если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv
if ($descnew -ne $descold)
{
$massive = @()
$i = ""
foreach ($i in $massiveold) {
if (($i.name) -ne $name)
{
$massive += $i
}
}

$massiveold = $massive
$massive | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Изменилось поле description: изменился ответственный"
sendinfo -fss $name

}
# если description не изменился, сравниваем все поля в файлах и, если находим хоть одно несоответствие,
# то отправляем письмо ответственному с новой информацией
else
{
$name = $_.name
$usersold = Import-Csv -Path ("$outcsvpath" + "$name" + ".csv") -Encoding UTF8 -Delimiter ";"
$prop = Write-Output Name Title Department
$usersold | Foreach {
$obj = $_
$prop | Foreach { if($obj.$_ -eq ""){$obj.$_ = $null}}
}
$usersnew = Get-ADGroupMember $name -Recursive | Get-ADUser -Properties Name,Title,Department | Select Name,Title,Department
Compare-Object -ReferenceObject $usersnew -DifferenceObject $usersold -Property Name,Title,Department | Sort-Object -Unique | foreach {
$tempname = $null
if ($_.SideIndicator -ne "==")
{
$tempname = $name
"В каталоге $tempname"
"изменилась строка: $_"
}
if ($tempname -ne $null)
{
sendinfo -fss $tempname
}
}
}
}
# если папка есть в старых данных, но её нет в AD, то надо её удалить из comparison.csv и удалить файл с именем этой папки
else
{
$name = $_.name
"Найдена устаревшая запись о папке: $name."
$massive = @()
$massiveold | foreach {
if ($_.name -notcontains "$name")
{
$massive += $_
}
}
$massive | export-csv -Path $changefailpath -Encoding UTF8 -NoTypeInformation
"Файл $changefailpath обновлён. Запись $name удалена"

dir $outcsvpath | where {$_.name -eq "$name.csv"} | Remove-Item
"Файл $outcsvpath" + "$name" + ".csv удален"
}
}
"Проверка завершена"




© OSzone.net 2001-2012