Перейти к содержимому

Как с помощью PowerShell посчитать сколько пользователей входит в группу где много вложенных групп

Задача посчитать общее количество пользователей находящийся в группе с множество вложений групп

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

Как с помощью PowerShell посчитать сколько пользователей входит в группу где много вложенных групп

Similar Posts:

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика