PowerShell – мониторинг состава групп
Хороший знакомый попросим меня «по быстрому» набросать скрипт для мониторинга изменения участников групп в Active Directory.
Получилось кривовато, но вполне работоспособно. Логика работы скрипта проста:
- Создаем текстовые файлы по именам групп при первом запуске.
- При следующих запусках сравниваем текущее состояние с тем что есть в старых файлах.
- При необходимости пишем в файл отчета.
- Удаляем старый файл, создаем новый и записываем в него состав группы.
На всякий случай текст скрипта в текстовом формате – скачать.
Примечание: По мере «шлифовки» будут вносится правки.
Add-PSSnapin Quest.ActiveRoles.ADManagement
# задаем формат даты
$currentDate = Get-Date -format M.d.yyyy
# указываем нужные пути и файл отчета
$reportFolder = "D:\Scripts\Powershell\GroupCheck\"
$report = "D:\Scripts\Powershell\$($currentDate)_report.txt"
# собираем данные о группах
$groups = Get-QADGroup -SizeLimit 0
$PreviousDay = @{}
# функция сравнения
function CompareResults ($query, $group) {
foreach ($result in $query) {
# пользователь добавлен в группу
if ($result.SideIndicator -eq "=>") {
Write-Output "User added – $($result.InputObject.NTAccountName)"
"Group $($group). add user – $($result.InputObject.NTAccountName)" | Out-File -Append $report
}
# пользователь удален из группы
if ($result.SideIndicator -eq "<=" ) {
Write-Output "User removed – $($result.InputObject)"
"Group $($group). remove user – $($result.InputObject)" | Out-File -Append $report
}
}
}
foreach ($group in $Groups) {
$fileName = $reportFolder + $group + ".txt"
if (!(Test-Path $fileName)) {
New-Item $fileName -ItemType file -Force
}
$PreviousDay[$group] = Get-Content $fileName
$MemberList = Get-QADGroupMember $group -SizeLimit 0
$PreviousList = Get-Content $fileName
if (($MemberList -ne $null) -and ($PreviousList -eq $null)) {
foreach ($user in $MemberList) {
Write-Output "$($group): Add user – $($user.NTAccountName)"
}
} elseif (($MemberList -eq $null) -and ($PreviousList -ne $null)) {
foreach ($user in $PreviousList) {
Write-Output "$($group): Remove user – $user"
}
} elseif (($MemberList -ne $null) -and ($PreviousList -ne $null)) {
# анализ группы
Write-Output "Check group – $($group)"
$DiffResult = diff -ReferenceObject $PreviousList -DifferenceObject $MemberList
CompareResults $DiffResult $group
} else {
# пустая группа
Write-Output "Group $group – has no members"
}
$MemberList | Select-Object -Expand NTAccountName | Out-File $fileName
}
Похожие статьи
Информация об авторе
|
|
Сергей Мариничев. Вы можете присоединиться ко мне в Facebook или в Twitter. |
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Вы можете оставить комментарий.

1) Т.к скрипт не использует возможностей Quest AD,можно использовать adsisearcher,что избавит от установки дополнительного ПО.
2) $PreviousDay – смысл переменной не понятен
3)
$PreviousDay[$group] = Get-Content $fileName
$GroupIdentity = $group – собственно тоже не нужно,легкость чтения не улучшает
4)
Remove-Item $fileName – Зачем удалять?
foreach ($user in $MemberList) {
$user.NTAccountName | Out-File -Append $fileName
} – Почему бы один не за раз все записать?
$MemberList | Select-Object -Expand NTAccountName | Out-File $fileName
5) Write-Output «Ures removed – $($result.InputObject)» – написанно Ures
6) Немного не ясно,какую функцию несет первый if и заним следующий elseif,когда тоже самое ,но с другой формулировкой и записью результатов в файл делает функция CompareResults. Лично по мне так убрать все if и elseif из скрипта,а оставить только часть:
$DiffResult = diff -ReferenceObject $PreviousList -DifferenceObject $MemberList
CompareResults $DiffResult $group
И сделать проверку,что группа пустая.
KazunЦитировать
1. Логично.
2. Слегка туманно, но сначала планировалось в нее пихать результаты из имеющегося файла.
3. Хм. Согласен.
4. Удаление это костыль для append. За совет спасибо.
5. принято.
6. Согласен. Туманно. Первоидея была отображать процесс формирования начальных файлов, но для компактности кода от него можно отказаться.
Пустые группы пишутся в выводе, сохраняются в файл, на экран выводится информация что группа пустая.
Сергей МариничевЦитировать
новый листинг в студию!
DavidЦитировать