Iska, спасибо!
Правда у меня нет такого выбора при редактировании. Использовал написание тега вручную.
PowerShell - [решено] Скрипт - оповещение об изменении в группе AD
-
Geliosvamp
Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD
Посмотрите в
Профиль
, Настройки форума, Разное. Попробуйте перевыбрать «Интерфейс редактора сообщений: Базовый редактор…».-
Kazun
Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD
1)Как вариант можно обнулить значения из CSV файла, т.к "" -ne $null.
Код:
2) если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv - Изменилось значение у группы,а состав остался, какой смысл высылать описание у группы владельцу?
Код:
Код: Выделить всё
$prop = Write-Output Name Title Department
$usersold | Foreach {
$obj = $_
$prop | Foreach { if($obj.$_ -eq ""){$obj.$_ = $null}
}2) если description изменился, то нужно отослать новые данные ответственному и обновить файл comparison.csv - Изменилось значение у группы,а состав остался, какой смысл высылать описание у группы владельцу?
-
Geliosvamp
Re: PowerShell - [решено] Скрипт - оповещение об изменении в группе AD
Iska, у меня был выбран расширенный редактор. Выбрал базовый, но не помогло.
Kazun,
1) Спасибо! Помогло
Использование в данному случае Write-Output для меня неожиданно, возьму на заметку.
2) Должности меняются довольно редко, поэтому особой проблемы нет. Если изменился человек на данной должности, то в целом можно было бы сделать доп. проверку, но я думаю, что новенькому сотруднику это не нужно, т.к. он ещё не влился в работу.
Добавил в скрипт возможность исключать из проверки некоторые группы.
В целом скрипт работает как надо, за что огромное спасибо тебе, Kazun!
Ещё хотелось бы:
1) body письма как-нибудь выудить из функции и задавать в начале скрипта.
2) в csv-файле, когда открываешь его в excel, все ширина столбцов стандартного размера, а хотелось бы, чтобы ширина подбиралась по содержимому ячеек.
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 удален"
}
}
"Проверка завершена"