Поиск по сайту:

Как экспортировать участников группы AD с помощью PowerShell


Получение всех участников вашей группы AD может быть сложной задачей. Вам нужно будет открыть группы и пролистать список пользователей. Лучший вариант - экспортировать участников группы AD с помощью PowerShell.

С помощью PowerShell мы можем легко выбрать или найти все группы и экспортировать участников в файл CSV или просмотреть их непосредственно в консоли.

В этой статье мы собираемся экспортировать участников групп AD с помощью PowerShell. В конце статьи вы найдете бесплатный скрипт, который экспортирует все или выбранные группы и их участников.

Требования

Чтобы экспортировать участников группы Active Directory, мы будем использовать командлет Get-ADGroupMember. Вам нужно убедиться, что вы установили модуль Active Directory для PowerShell перед тем, как продолжить. Этот модуль установлен по умолчанию на контроллерах домена. Вы можете установить его с помощью следующей команды PowerShell на Windows 10/11:

Add-WindowsCapability -online -Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0”

Экспортировать участников группы AD

Для экспорта членов группы Active Directory нам нужно хотя бы знать имя группы. Если у вас есть имя группы, вы можете просто экспортировать всех членов группы в файл CSV с помощью команды Export-CSV следующим образом:

Export all members of the group SG_M365_E3
Get-ADGroupMember -Identity 'SG_M365_E3' | Export-Csv -path c:\temp\groupmembers.csv -Notypeinformation

Это экспортирует стандартные атрибуты пользователей в CSV файл:

  • выдающееся имя
  • Имя
  • классОбъекта
  • objectGUID
  • Имя учетной записи Sam
  • СИД

Как вы видите, это часто не та информация, которая вам нужна. Мы могли бы использовать оператор Select, чтобы выбрать только имена пользователей, но вы можете также захотеть узнать, например, их должность или отдел.

Другой проблемой являются вложенные группы. Как видно из приведенного ниже примера, группа управления также является членом выбранной группы. Вы, вероятно, также захотите включить участников из вложенных групп в ваши результаты.

Чтобы получить участников вложенных групп, мы можем использовать параметр -recursive. С этим параметром cmdlet также покажет участников объектов AD вложенной группы в результатах.

Чтобы получить данные пользователя, нам нужно будет использовать командлет Get-ADUser вместе с этим. Это позволит нам выбрать и включить больше свойств пользователя в наш экспорт.

Используя cmdlet Get-ADUser

Приведенные выше примеры отлично подходят для небольших или средних окружений и только для просмотра пользователей из определенной группы. Но для больших окружений, с более чем 1000 пользователями в группе, существует лучший (быстрее) метод.

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

В таких случаях лучшим вариантом будет использование команды Get-ADUser и фильтрация по атрибуту memberOf. Для этого нам нужно знать служебное имя групп, и мы проведем рекурсивное сопоставление.

$dn = (Get-ADGroup -Identity 'SG_M365_E3').distinguishedName
Get-ADUser -Filter "$filter memberOf -recursivematch '$($dn)'"

Преимуществом этого метода является то, что вы также получаете всех пользователей из вложенных групп. Как упоминалось, мы можем использовать дополнительные фильтры для команды Get-ADUser, например, выбирать только активных пользователей.

Скрипт экспорта участников рекламной группы

Я создал универсальный скрипт для экспорта членов группы AD в файл CSV. Скрипт позволяет экспортировать участников из нескольких групп одновременно. Результаты хранятся в файле CSV для каждой группы. Я кратко расскажу о скрипте ниже. Вы можете скачать полный скрипт здесь из моего репозитория на GitHub.

В скрипте я добавил три варианта для выбора группы(групп), из которых нужно экспортировать пользователей:

  • названиеГруппы – Вы можете ввести название группы или несколько названий групп, разделяя их запятой.
  • searchBase – Это позволяет вам экспортировать участников из всех групп в определённом OU. Вы также можете указать несколько OU, разделяя их запятой.
  • Все группы – Если вы не укажете название группы или базу поиска, то будут экспортированы все группы.

Я также добавил фильтр, который позволяет вам включать только активные или отключенные учетные записи пользователей. По умолчанию он экспортирует обе.

Результат скрипта экспорта участников группы AD

В скрипте вы найдёте несколько функций. Функция Get-Users соберёт пользователей из групп. Я добавил несколько свойств для получения, вы можете изменить список в соответствии с вашими потребностями.

<#
.SYNOPSIS
  Get all AD members from an AD Group
.DESCRIPTION
  This script collects all Active Directory users from a specific group or multiple groups and exports
  the users with some attributes to a CSV file per AD Group.
.OUTPUTS
  CSV or console with Active Directory Users
.NOTES
  Version:        1.0
  Author:         R. Mens
  Creation Date:  25 jan 2024
  Purpose/Change: Init
#>

param(
  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter the group name or multiple separated with a comma"
    )]
  [string[]]$groupName,

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter the searchbase between quotes or multiple separated with a comma"
    )]
  [string[]]$searchBase,

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Get accounts that are enabled, disabled or both"
  )]
    [ValidateSet("true", "false", "both")]
  [string]$enabled = "both",

  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter path to save the CSV file"
  )]
  [string]$CSVpath
)

Function Get-Users{
  param(
    [Parameter(Mandatory = $true)]
    $dn
  )
  # Set the properties to retrieve
  $properties = @(
    'name',
    'userprincipalname',
    'mail',
    'title',
    'enabled',
    'department',
    'lastlogondate'
  )

  # Get enabled, disabled or both users
  switch ($enabled) {
    "true" {$filter = "enabled -eq 'true' -and"}
    "false" {$filter = "enabled -eq 'false' -and"}
    "both" {$filter = ""}
  }

  # Return the users from the group
  Get-ADUser -Filter "$filter memberOf -recursivematch '$($dn)'" -Properties $properties | Select-Object $properties
}

Function Get-CSVFile {
  # Creates the CSV File per group with the group members
  param(
    [Parameter(Mandatory = $true)]
    $group,

    [Parameter(Mandatory = $true)]
    $users
  )

  # Create CSV File path with Groupname and datetime
  $CSVFilePath = $CSVPath + "\" + $group + "-" + (Get-Date -Format "yyMMdd-hhmm") + ".csv"
  
  # Export users to CSV File per Group
  $users | Sort-Object Name | Export-CSV -Path $CSVFilePath -NoTypeInformation -Encoding UTF8

  if ((Get-Item $CSVFilePath).Length -gt 0) {
    Write-Host "- Report finished and saved in $CSVFilePath" -ForegroundColor Green
  } else {
    Write-Host "- Failed to create report" -ForegroundColor Red
  }
}

Function Get-GroupMembers {
  # Get the group members from the specified group
  # and export the results to CSV or console
  param(
    [Parameter(Mandatory = $true)]
    $group
  )
  
  Write-Host "- Getting users for $($group.name)" -ForegroundColor Cyan
  $users = Get-Users -dn $group.distinguishedName

  if ($null -eq $users){
    Write-Host "- No users found in $($group.name)" -ForegroundColor Yellow
    return
  }

  If ($CSVpath) {
    Get-CSVFile -group $group.name -users $users
  } else {
    $users | Sort-Object Name | ft
  }
}

Function Get-Groups {
  # Get the groups, either from the parameter,
  # or lookup all the groups in specified OU
  if ($groupName) {
    foreach ($group in $groupName) {
      Write-Host "- Getting group details for $group" -ForegroundColor Cyan
      $ADGroup = Get-ADGroup -Identity $group
    
      if ($null -eq $ADGroup) {
        Write-host "- Group $group not found" -ForegroundColor Red
        continue
      }
      Get-GroupMembers -group $ADGroup
    }
  }
  elseif ($searchBase) {
    # Get the requested users
    foreach ($dn in $searchBase) {
      Write-Host "- Collecting groups in $dn" -ForegroundColor Cyan
      Get-ADGroup -Filter * -SearchBase $dn | ForEach-Object { Get-GroupMembers -group $_ }
    }
  }
  else{
    # Get distinguishedName of the domain
    $dn = Get-ADDomain | Select-Object -ExpandProperty DistinguishedName
    Write-Host "- Collecting all groups in $dn" -ForegroundColor Cyan
    Get-ADGroup -Filter * -SearchBase $dn | ForEach-Object { Get-GroupMembers -group $_ }
  }
}

Collect the group members
Get-Groups

Примеры

Чтобы получить все включенные учетные записи пользователей из двух групп Active Directory, вы можете использовать команду ниже. По завершении она создаст два файла CSV в папке c:\temp.

Get-ADGroupMembers.ps1 -groupName 'SG_M365_PowerBi','SG_M365_E3' -enabled true-CSVpath 'c:\temp'

Если вы хотите получить участников из всех групп в определённом OU, вам нужно будет использовать параметр searchBase. Для этого вам нужно знать полное имя OU. Вы можете найти полное имя в редакторе атрибутов OU:

  1. Откройте свойства организационного подразделения ( щелкните правой кнопкой мыши > свойства)
  2. Откройте вкладку Редактор атрибутов
  3. Скопируйте distinguishedName значение

Вы можете затем запустить скрипт следующим образом:

Get-ADGroupMembers.ps1 -searchBase 'OU=Groups,OU=Amsterdam,OU=Sites,DC=a-d,DC=nl' -CSVpath 'c:\temp'

Заключение

Экспортировать участников группы Active Directory можно легко с помощью командлета Get-ADGroupMember в комбинации с командлетом Export-CSV. Но когда у вас большая среда, вы хотите экспортировать несколько групп или включить больше деталей о пользователях, этот сценарий будет хорошим вариантом.

Надеюсь, вам понравилась эта статья и сценарий. Если у вас есть вопросы или предложения, просто оставьте комментарий ниже.