Как использовать Get-ADGroup в PowerShell
Вам нужно получить все группы в вашем Active Directory или вам нужно просто найти местоположение одной группы, которая где-то прячется в организационной единице? В PowerShell мы можем использовать командлет Get-ADGroup, чтобы быстро извлечь всю информацию о наших группах из AD.
Группы в вашем Active Directory могут действительно помочь вам с организацией вашего AD. Это позволяет вам назначать разрешения или лицензии нескольким пользователям, которые являются членами одной группы. Например, когда руководству нужен доступ к PowerBi, вам необходимо будет назначить лицензию только группе PowerBi.
В этой статье мы рассмотрим, как использовать командлет Get-ADGroup в PowerShell. В конце статьи вы также найдете полный скрипт, который экспортирует все группы в вашем Active Directory в CSV.
Требования
Прежде чем мы сможем использовать командлет Get-ADGroup, вам необходимо установить модуль Active Directory в PowerShell. Он установлен по умолчанию на контроллере домена, но на Windows 10 или 11 его нужно будет установить.
Запустите следующую команду в PowerShell, чтобы установить модуль:
Add-WindowsCapability -online -Name “Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0”Поиск групп с помощью Get ADGroup в PowerShell
Команда Get-ADGroup позволяет нам находить все объекты групп в Active Directory и извлекать из них информацию. Преимущество этой команды заключается в том, что мы можем использовать различные параметры для поиска групп в нашем AD.
Мы можем использовать следующие параметры, когда речь идет о нахождении групп:
- Идентичность – Найдите группу по названию группы. Это вернет только одну группу.
- Фильтр – Получить несколько групп на основе запроса фильтра
- LDAPFilter — использование строки запроса LDAP для фильтрации объектов группы
- SearchBase – Укажите путь Active Directory (OU) для поиска
- SearchScope – Укажите, насколько глубоко вы хотите производить поиск (базовый уровень, один уровень или полное поддерево)
Самый распространенный способ получить группу - это использовать параметр идентичности. Но для этого вам нужно знать название группы. Это вернет одну группу с наиболее важными свойствами:
Get-ADGroup -identity SG_M365_E5Как вы можете видеть, только основные свойства возвращаются из группы. Мы можем использовать параметр -properties, чтобы получить все свойства группы. Я объясню больше о получении различных свойств позже, но если вы хотите увидеть всю информацию из группы, используйте следующую команду:
Get-ADGroup -identity SG_M365_E5 -properties *Использование параметра фильтра
Когда вы ищете определённую группу и не знаете её точное название, вы можете воспользоваться параметром фильтра. Это позволяет нам искать среди всех групп по части названия или другой характеристики.
Параметр фильтра также можно использовать для получения нескольких групп или всех групп из Active Directory.
Давайте рассмотрим несколько широко используемых примеров, чтобы найти группы:
Чтобы найти группу по части имени, вы можете использовать фильтр -like:
Get-ADGroup -Filter "Name -like 'SG_*'" | ftЭто вернет все группы, имена которых начинаются с SG_.
Чтобы получить все группы безопасности, мы можем отфильтровать группы по значению категории группы:
Get-ADGroup -Filter "GroupCategory -eq 'Security'" | ftЕсли вы выполните приведённую выше команду, вы заметите, что она также возвращает все встроенные группы. Чаще всего они вам не нужны в ваших экспортных данных. Поэтому давайте исключим их:
Get-ADGroup -Filter "GroupCategory -eq 'Security' -and GroupScope -ne 'Domainlocal'" | ftТеперь у вас все еще есть несколько встроенных групп. Эти группы расположены в контейнере по умолчанию Users OU в вашей Active Directory. Есть два варианта, чтобы также их отфильтровать: вы можете указать базу поиска, смотрите следующую главу, или отфильтровать все результаты, где DistinguishedName заканчивается на OU=Users,DC=Domain,DC=local.
Replace DC=Domain,DC=Local with your AD domain name
Get-ADGroup -Filter "GroupCategory -eq 'Security' -and GroupScope -ne 'Domainlocal'" | Where-Object { $_.DistinguishedName -notlike "*,CN=user,DC=Domain,DC=local" } | ftВы также можете использовать следующий cmdlet, чтобы получить путь DN вашего домена:
Get-ADDomain | Select -ExpandProperty DistinguishedNameПолучить SearchBase ADGroup
Когда вы хотите извлечь несколько групп из вашей Active Directory, вам может понадобиться сузить поиск. Как упоминалось в предыдущей главе, когда вы перечисляете все группы, также перечисляются все встроенные группы. Чаще всего ваши группы организованы в отдельном OU, поэтому мы можем использовать параметр SearchBase (distinguishedName), чтобы указать OU, в котором мы хотим производить поиск.
distinguishedName - это полный путь OU, который мы расписываем от OU вверх по дереву до имени домена AD.
Возьмите следующую структуру AD, мы хотим получить все компьютеры из амстердамского сайта:
Базовая строка поиска в данном случае будет следующей:
1 2 3 4 5
"OU=Computers,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL"
Чтобы получить, например, все группы из OU Amsterdam, мы можем использовать следующий путь SearchBase:
Get-ADGroup -Filter * -SearchBase "OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL" | ftИспользование области поиска
Параметр -SearchBase вернет все компьютеры из указанного и вложенных OU. Используя параметр -SearchScope, мы можем указать, насколько глубоко или не глубоко мы хотим искать в дереве Active Directory.
Например, мы хотим получить все группы с сайта Амстердам, кроме тестовых групп:
Чтобы получить все группы из Амстердама, кроме групп в подподразделении “test”, мы можем ограничить searchBase только текущим уровнем, используя параметр searchScope:
$searchBase = "OU=Groups,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=NL"
Get-ADGroup -Filter * -SearchBase $searchBase -SearchScope OneLevelПолучить менеджера группы
Группы Active Directory могут управляться пользователями. Таким образом, пользователь может добавлять или удалять участников группы, что очень полезно для распределительных групп или когда у вас много изменений в группе.
Чтобы получить менеджера группы, мы можем использовать командлет Get-ADGroup и свойство managedBy:
You can also use a filter or searchbase to get the manager of multiple groups
Get-ADGroup -Identity management -Properties managedby | select name, managedBy | ftКак видно на скриншоте выше, свойство managedBy возвращает отличительное имя пользователя. Если вам нужно только имя, вы можете использовать командлет Get-ADUser после него:
Get-ADGroup -Identity management -Properties ManagedBy | % {Get-ADUser -Identity $_.managedBy} | select nameПолучить членство в группах
Группы также могут быть членами других групп, что особенно полезно, когда вы хотите назначать лицензии или другие разрешения на основе членства в группе. Например, всем менеджерам следует иметь доступ к PowerBi. Теперь вы можете добавить каждого менеджера по отдельности в группу SG_M365_PowerBi, но вы также можете сделать группу Управление членом группы SG_M365_PowerBi.
Чтобы перечислить все группы, членом которых является данная группа, вы можете использовать свойство memberOf:
Get-ADGroup -Identity management -Properties memberOf | select name,memberOfНо, как вы можете видеть на скриншоте выше, это не совсем читаемое имя. Точно так же, как с менеджером группы, нам нужно будет пройтись по каждой группе, чтобы узнать имя.
К счастью, есть еще один вариант, мы можем использовать командлет Get-ADPrincipalGroupMembership, чтобы получить только имя группы, членом которой является данная группа:
Get-ADPrincipalGroupMembership -identity management | ftЭкспортируйте все группы AD в CSV с помощью PowerShell
Если вы хотите получить обзор всех групп в вашей Active Directory, то экспорт в CSV является хорошим методом. Это позволяет вам просмотреть все группы в Excel и, например, перечислить всех менеджеров групп или членов групп.
Я написал полный справочник по команде Export-CSV, но я также хочу привести вам пару полезных примеров работы с командой Get-ADGroup.
Чтобы просто экспортировать все объекты групп AD, мы можем использовать следующую команду:
Get-ADGroup -filter * | Export-csv c:\temp\adgroups.csv -NoTypeInformationЭто перечислит все группы, включая встроенные, с только базовыми свойствами. Чаще всего это не та информация, которая вам нужна.
Скрипт для экспорта групп AD в CSV
Я создал скрипт PowerShell, который экспортирует все группы AD в CSV для вас с наиболее часто необходимыми свойствами.
Когда вы запускаете скрипт, вы указываете несколько параметров:
- Укажите базу поиска (OU), по умолчанию - весь Active Directory
- Включить или исключить встроенные группы (по умолчанию исключить)
- Экспортный путь CSV файла (по умолчанию отсутствует, вывод в консоль)
Скрипт получит все группы из Active Directory, если вы не укажете searchBase (OU). Также возможно указать несколько OU:
.\Get-ADGroups.ps1 -searchBase "OU=groups,OU=Amsterdam,DC=LazyAdmin,DC=Local","OU=groups,OU=Oslo,DC=LazyAdmin,DC=Local" -csvpath c:\temp\computers.csvСледуйте этим шагам, чтобы экспортировать группы AD с помощью скрипта PowerShell:
- Скачайте полный скрипт Export AD Groups из моего Github
- Откройте PowerShell и перейдите к скрипту
- Запустите скрипт экспорта: Get-ADGroups.ps1
Когда скрипт завершит выполнение, он автоматически откроет Excel для вас.
param(
[Parameter(
Mandatory = $false,
HelpMessage = "Enter the searchbase between quotes or multiple separated with a comma"
)]
[string[]]$searchBase,
[Parameter(
Mandatory = $false,
HelpMessage = "Include built-in groups or exclude"
)]
[ValidateSet("include", "exclude")]
[string]$builtin = "exclude",
[Parameter(
Mandatory = $false,
HelpMessage = "Enter path to save the CSV file"
)]
[string]$CSVpath
)
Function Get-Groups{
<#
.SYNOPSIS
Get groups from the requested DN
#>
param(
[Parameter(
Mandatory = $true
)]
$dn
)
process{
# Set the properties to retrieve
$properties = @(
'Name',
'CanonicalName',
'GroupCategory',
'GroupScope',
'ManagedBy',
'MemberOf',
'created',
'whenChanged',
'mail',
'info',
'description'
)
# Get all groups, or exclude the builtin groups
# Get the computers
switch ($builtin)
{
"include" {
Get-ADGroup -filter * -searchBase $dn -Properties $properties | select $properties
}
"exclude" {
$builtinUsers = "CN=users,$dn"
$filter = "GroupScope -ne 'Domainlocal'"
Get-ADGroup -filter $filter -searchBase $dn -Properties $properties | Where-Object { $_.DistinguishedName -notlike "*,$builtinUsers" } | select $properties
}
}
}
}
Function Get-ADGroups {
<#
.SYNOPSIS
Get all AD Groups
#>
process {
Write-Host "Collecting groups" -ForegroundColor Cyan
$groups = @()
# Collect groups
if ($searchBase) {
# Get the requested groups
foreach ($dn in $searchBase) {
Write-Host "- Get groups in $dn" -ForegroundColor Cyan
$groups += Get-Groups -dn $dn
}
}else{
# Get distinguishedName of the domain
$dn = Get-ADDomain | Select -ExpandProperty DistinguishedName
Write-Host "- Get groups in $dn" -ForegroundColor Cyan
$groups += Get-Groups -dn $dn
}
# Loop through all computers
$groups | ForEach {
$managedBy = ''
$memberOf = ''
# If the group is managed, get the users name
if ($null -ne $_.ManagedBy) {
$managedBy = Get-ADUser -Identity $_.ManagedBy | select -ExpandProperty name
}
# If the group is member of other groups, get the group names
if ($_.MemberOf.count -gt 0) {
$memberOf = Get-ADPrincipalGroupMembership $_.name | select -ExpandProperty name
}
[pscustomobject]@{
"Name" = $_.Name
"CanonicalName" = $_.CanonicalName
"GroupCategory" = $_.GroupCategory
"GroupScope" = $_.GroupScope
"Mail" = $_.Mail
"Description" = $_.Description
"Info" = $_.info
"ManagedBy" = $managedBy
"MemberOf" = ($memberOf | out-string).Trim()
"Date created" = $_.created
"Date changed" = $_.whenChanged
}
}
}
}
If ($CSVpath) {
# Get mailbox status
Get-ADGroups | Export-CSV -Path $CSVpath -NoTypeInformation -Encoding UTF8
if ((Get-Item $CSVpath).Length -gt 0) {
Write-Host "Report finished and saved in $CSVpath" -ForegroundColor Green
Invoke-Item $CSVpath
}
else {
Write-Host "Failed to create report" -ForegroundColor Red
}
}
Else {
Get-ADGroups
}Завершение
Команда Get-ADGroup отлична, когда вам нужно получить все группы из вашей Active Directory. С помощью фильтров и/или параметра searchbase вы можете быстро выбрать только те группы, которые вам нужны.
Если у вас есть вопросы, просто оставьте комментарий ниже.






