Задача посчитать общее количество пользователей находящийся в группе с множество вложений групп
Import-Module ActiveDirectory $mainGroup = "G-Terminal" $global:allResults = @() # Используем глобальную переменную $groupCache = @{} function Get-GroupInfo { param ( [string]$groupName, [string]$parentGroup = "", [int]$level = 0 ) # Проверяем кэш if ($groupCache.ContainsKey($groupName)) { return $groupCache[$groupName] } try { $group = Get-ADGroup -Identity $groupName -Properties Member $members = @(Get-ADGroupMember -Identity $groupName -ErrorAction Stop) $userCount = 0 $nestedGroups = @() $totalUsers = 0 # Считаем пользователей и вложенные группы foreach ($member in $members) { if ($member.objectClass -eq 'user') { $userCount++ } elseif ($member.objectClass -eq 'group') { $nestedGroups += $member } } # Обрабатываем вложенные группы $nestedUsers = 0 $nestedResults = @() foreach ($nestedGroup in $nestedGroups) { $nestedInfo = Get-GroupInfo -groupName $nestedGroup.Name -parentGroup $group.Name -level ($level + 1) $nestedUsers += $nestedInfo.TotalUsers $nestedResults += $nestedInfo.Result } $totalUsers = $userCount + $nestedUsers # Формируем результат $result = [PSCustomObject]@{ "Уровень" = $level "Родительская группа" = if ($parentGroup) { $parentGroup } else { "Корневая" } "Группа" = $group.Name "Пользователей в группе" = $userCount "Пользователей во вложенных" = $nestedUsers "Всего пользователей" = $totalUsers "Вложенных групп" = $nestedGroups.Count "DN" = $group.DistinguishedName } # Добавляем в глобальный массив $global:allResults += $result # Кэшируем и возвращаем $groupCache[$groupName] = @{ UserCount = $userCount TotalUsers = $totalUsers Result = $result NestedResults = $nestedResults } return $groupCache[$groupName] } catch { Write-Warning "Ошибка при обработке группы $groupName : $_" return @{ UserCount = 0 TotalUsers = 0 Result = $null NestedResults = @() } } } # Очищаем предыдущие результаты $global:allResults = @() # Получаем данные $mainGroupInfo = Get-GroupInfo -groupName $mainGroup # Добавляем результаты вложенных групп function Add-NestedResults { param($groupInfo) foreach ($nested in $groupInfo.NestedResults) { if ($nested) { $global:allResults += $nested.Result Add-NestedResults -groupInfo $nested } } } Add-NestedResults -groupInfo $mainGroupInfo # Фильтруем null-значения $allResults = $global:allResults | Where-Object { $_ -ne $null } # Выводим в консоль $allResults | Sort-Object "Уровень", "Группа" | Format-Table -AutoSize -Property "Уровень", "Родительская группа", "Группа", "Пользователей в группе", "Пользователей во вложенных", "Всего пользователей", "Вложенных групп" # Экспорт в CSV $csvPath = "$env:USERPROFILE\Desktop\Group_Analysis_Full_$(Get-Date -f 'yyyyMMdd_HHmmss').csv" $allResults | Sort-Object "Уровень", "Группа" | Export-Csv -Path $csvPath -Encoding UTF8 -NoTypeInformation -Delimiter ";" -Force Write-Host "`nПолный отчет сохранен: $csvPath" -ForegroundColor Green Write-Host "Всего групп проанализировано: $($allResults.Count)" -ForegroundColor Cyan
Similar Posts:
- Как вывести всех пользователей которые состоят в определённых группах и отпаривать уведомление email и обойти ограничение Get-ADGroupMember : The size limit for this request was exceeded
- Как делегировать права для группы на ou для создание пользователей через powershell.
- Как вывести пользователей которые состоят в административных группах domain admin, enterprise admin, schema admin
- Как мониторить dfs replication.
- Как сделать отчет vm с тегами(tags) и записями блокнота(Note) с помощью Vmware powercli в одну строку.