Print Friendly
Отправить в сообщении

PowerShell – мониторинг состава групп

powershellХороший знакомый попросим меня «по быстрому» набросать скрипт для мониторинга изменения участников групп в Active Directory.

Получилось кривовато, но вполне работоспособно. Логика работы скрипта проста:

  • Создаем текстовые файлы по именам групп при первом запуске.
  • При следующих запусках сравниваем текущее состояние с тем что есть в старых файлах.
  • При необходимости пишем в файл отчета.
  • Удаляем старый файл, создаем новый и записываем в него состав группы.

На всякий случай текст скрипта в текстовом формате – скачать.

Примечание: По мере «шлифовки» будут вносится правки.

# добавляем снапин от Quest
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 Google Plus вКонтакте Twitter
Если Вам понравилась статья, то вы можете подписаться на RSS. А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.
Получать обновления на email

Вы можете оставить комментарий.

2 Комментариев »

 
  • 1# Kazun (76 комм.):

    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

    И сделать проверку,что группа пустая.

      Цитировать

    • 2# Сергей Мариничев (565 комм.):

      1. Логично.
      2. Слегка туманно, но сначала планировалось в нее пихать результаты из имеющегося файла.
      3. Хм. Согласен.
      4. Удаление это костыль для append. За совет спасибо.
      5. принято.
      6. Согласен. Туманно. Первоидея была отображать процесс формирования начальных файлов, но для компактности кода от него можно отказаться.

      Пустые группы пишутся в выводе, сохраняются в файл, на экран выводится информация что группа пустая.

        Цитировать

 

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>