PowerShell скрипт для получения списка уникальных логинов пользователей, являющихся членом определённых групп безопасности в Active Directory

В качестве исходного условия имеется список групп безопасности домена Active Directory в отдельном файле (имена групп могут повторяться). Нужно получить транзитивно (с учётом возможной вложенности групп) список логинов всех учётных записей пользователей, входящих в эти группы. Результирующий список нужно отсортировать по алфавиту и убрать дублирующие значения.

Пример PowerShell скрипта для решения поставленной задачи:

Get-UsersFromGroups.ps1
<#
.SYNOPSIS
    Gets unique user logins from AD groups with their group membership
.DESCRIPTION
    Processes security groups from input file, recursively expands all members,
    and exports users with their source groups
.PARAMETER InputFile
    Path to file containing group names (one per line)
.PARAMETER OutputFile
    Path to result file (default: Get-UsersFromGroups_Output.csv)
#>
param(
    [Parameter(Mandatory=$true)]
    [string]$InputFile,
 
    [string]$OutputFile = "Get-UsersFromGroups_Output.csv"
)
 
# Get unique groups from input file
$groups = Get-Content $InputFile | 
          Where-Object { $_ -match '\S' } | 
          Select-Object -Unique
 
# Initialize result storage: user -> groups
$results = @{}
 
foreach ($group in $groups) {
    try {
        # Get AD group object
        $adGroup = Get-ADGroup -Identity $group -ErrorAction Stop
 
        # Recursively get all user members
        $users = Get-ADGroupMember -Identity $adGroup -Recursive -ErrorAction Stop | 
                 Where-Object { $_.objectClass -eq 'user' }
 
        # Add group to each user's membership list
        foreach ($user in $users) {
            $login = $user.SamAccountName
            if (-not $results.ContainsKey($login)) {
                $results[$login] = [System.Collections.Generic.List[string]]::new()
            }
            $results[$login].Add($group)
        }
    }
    catch {
        Write-Warning "Error processing group '$group': $_"
    }
}
 
# Convert to sorted object array
$output = $results.GetEnumerator() | 
          ForEach-Object {
              [PSCustomObject]@{
                  User  = $_.Key
                  Groups = ($_.Value -join "; ")
              }
          } | 
          Sort-Object User
 
# Export to CSV
$output | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8
 
# Console output
$output | Format-Table -AutoSize

Инструкция по использованию:

  1. Скопируйте скрипт в файл с расширением .ps1 (например, Get-UsersFromGroups.ps1) в кодировке UTF-8
  2. Запустите PowerShell от имени администратора
  3. Выполните скрипт, указав, как минимум, имя файла со списком групп (по одной группе в каждой строке, значения могут повторяться):
.\Get-UsersFromGroups.ps1 -InputFile "C:\groups.txt" -OutputFile "result.csv"

Особенности скрипта:


Проверено на следующих конфигурациях:

Версия ОС Версия Powershell
Microsoft Windows 11 Pro 24H2 10.0.26100 PowerShell 5.1.26100.2161

Автор первичной редакции:
Алексей Максимов
Время публикации: 22.05.2025 15:21