Для управления группами в Active Directory не обязательно использовать графическую оснастку Active Directory Users and Computer (ADUC). Вы можете выполнять все действия по управлению группами в домене Active Directory из командной строки PowerShell. В этой статье мы рассмотрим, как с помощью PowerShell создать новую группу в AD, добавить в нее пользователей (или удалить), вывести/экспортировать список пользователей группы и другие полезные команды, которые часто используются при администрировании AD.
- New-ADGroup: создать новую группу в Active Directory
- Add-AdGroupMember: добавить пользователей в группу Active Directory
- Remove-ADGroupMember: удалить пользователей из группы
- Get-ADGroup: получить информацию о группе AD
- Get-ADGroupMember: вывести список пользователей в группе Active Directory
- Set-ADGroup: изменить атрибуты группы AD
- Remove-ADGroup: удалить группу AD
Для управления группами AD нужно использовать специальный модуль — Active Directory Module for Windows PowerShell. Модуль RSAT-AD-PowerShell доступен во всех версиях Windows Server (начиная с Windows Server 2008R2), а в десктопных Windows 10 и Windows 11 он устанавливается как компонент RSAT.
Проверьте, загружен ли модуль AD в текущую сессию PowerShell:
Get-Module -Listavailable
Как вы видите, модуль ActiveDirectory загружен. Если нет – импортируйте его командой:
Import-Module activedirectory
Выведем список командлетов PowerShell, позволяющих управлять группами AD:
Get-Command -Module ActiveDirectory -Name "*Group*"
Доступно 11 командлетов:
- Add-ADGroupMember
- Add-ADPrincipalGroupMembership
- Get-ADAccountAuthorizationGroup
- Get-ADGroup
- Get-ADGroupMember
- Get-ADPrincipalGroupMembership
- New-ADGroup
- Remove-ADGroup
- Remove-ADGroupMember
- Remove-ADPrincipalGroupMembership
- Set-ADGroup
New-ADGroup: создать новую группу в Active Directory
Создадим новую группу безопасности в указанном контейнере (OU) Active Directory с помощью команды New-ADGroup:
New-ADGroup "TestADGroup" -path 'OU=Groups,OU=Moscow,DC=corp,dc=winitpro,DC=ru' -GroupScope Global -PassThru –Verbose
С помощью атрибута Description можно задать описание группы, а с помощью DisplayName изменить отображаемое имя.
Параметром GroupScope можно задать один из следующих типов групп:
- 0 = DomainLocal
- 1 = Global
- 2 = Universal
Создать группу распространения можно так:
New-ADGroup "TestADGroup-Distr" -path 'OU=Groups,OU=Moscow,DC=corp,dc=winitpro,DC=ru' -GroupCategory Distribution -GroupScope Global -PassThru –Verbose
При создании группы AD можно сразу заполнить любые атрибуты. Проще всего задать значения различных атрибутов группы через HashTable:
$attrs = @{"mail"="mskadmins@winitpro.ru";"displayname"="ALL MSK Admins"}
New-ADGroup -Name MSKAdmins -GroupScope Global -OtherAttributes $attrs
Add-AdGroupMember: добавить пользователей в группу Active Directory
Добавить пользователей в группу Active Directory можно с помощью командлета Add-AdGroupMember. Добавим в новую группу двух пользователей:
Add-AdGroupMember -Identity TestADGroup -Members user1, user2
Если нужно добавить в группу сразу большое количество пользователей, вы можете сохранить список учетных записей в CSV файл, затем импортировать данный файл и добавить каждого пользователя в группу с помощью простого PowerShell скрипт.
В нашем примере используется следующий формат CSV файла (список пользователей по одному в строке, имя столбца – users)
Import-CSV .\users.csv -Header users | ForEach-Object {Add-AdGroupMember -Identity ‘TestADGroup’ -members $_.users}
Чтобы получить всех членов одной группы (groupA) и добавить их в другую группу (groupB), воспользуйтесь такой командой:
Get-ADGroupMember “GroupA” | Get-ADUser | ForEach-Object {Add-ADGroupMember -Identity “Group-B” -Members $_}
Если нужно скопировать в новую группу и членов всех вложенных групп (рекурсивно), нужно воспользоваться такой командой:
Get-ADGroupMember -Identity “GroupA” -Recursive | Get-ADUser | ForEach-Object {Add-ADGroupMember -Identity “GroupB” -Members $_}
В версии Active Directory, представленной в Windows Server 2016 можно использовать функцию временного членства в группах безопасности AD (Temporary/ Time Based Group Membership). Чтобы временно добавить пользователя в группу AD (например, на 2 часа), выполните команду:
$ttl = New-TimeSpan -Hours 2
Add-ADGroupMember -Identity "Domain Admins" -Members a.ivanov -MemberTimeToLive $ttl
Через 2 часа этот пользователь будет автоматически удален из данной группы.
Remove-ADGroupMember: удалить пользователей из группы
Для удаления пользователей из группы AD нужно использовать командлет Remove-ADGroupMember. Удалим из группы двух пользователей:
Remove-ADGroupMember -Identity TestADGroup -Members user1, user2
Подтвердите удаление пользователей, нажав Y -> Enter.
Если нужно удалить из группы пользователей по списку из CSV файла, воспользуйтесь такой командой:
Import-CSV .\users.csv -Header users | ForEach-Object {Remove-ADGroupMember -Identity ‘TestADGroup’ -members $_.users}
Get-ADGroup: получить информацию о группе AD
Для получения информации о группе домена AD используйте командлет Get-ADGroup:
Get-ADGroup 'TestADGroup'
Даная команда выводит информацию об основных атрибутах группы (DN, тип группы, имя, SID группы). Чтобы вывести значение всех атрибутов группы, выполните команду:
Get-ADGroup 'TestADGroup' -properties *
Как вы видите, теперь стали отображаться такие атрибуты, как время создания и модификации группы, описание и т.д.
Вы можете использовать командлет Get-ADGroup для поиска групп в AD по шаблону (маске). Например, следующие команды можно использовать чтобы найти все группы AD, в имени которых содержится фраза admins
Get-ADGroup -LDAPFilter “(name=*admins*)” | Format-Table
Или
Get-ADGroup -Filter {name -like "*admins*"} -Properties Description,info | Select Name,samaccountname,Description,info
(в первой команде используется LDAP фильтр, во второй фильтр по атрибуту AD):
С помощью Get-ADGroup можно получить список членов группы (хранится в атрибуте members):
Get-ADGroup -Identity "Domain Admins" -Properties members | Select-Object -ExpandProperty members
Однако для получения списка членов группы гораздо удобнее использовать другой командлет — Get-ADGroupMember.
Get-ADGroupMember: вывести список пользователей в группе Active Directory
Командлет Get-ADGroupMember позволяет получить членов группы AD. Это могут быть пользователи, компьютеры, другие группы или учетные записи служб (MSA/gMSA).
Вы можете вывести на экран список пользователей в доменной группе:
Get-ADGroupMember 'TestADGroup'
Чтобы оставить в результатах только имена пользователей, выполните:
Get-ADGroupMember 'TestADGroup'| ft name
Если в данную группу включены другие группы домена, чтобы вывести полный список членов, в том числе всех вложенных групп, воспользуйтесь параметром Recursive.
Get-ADGroupMember ‘server-admins' -recursive| ft name
Чтобы экспортировать список пользователей, состоящих в определённой группе в CSV файл (для дальнейшего использования в Excel), выполните команду:
Get-ADGroupMember ‘server-admins' -recursive| ft samaccountname| Out-File c:\ps\admins.csv
Вы можете экспортировать в текстовый файл и другие атрибуты пользователей AD. Для получения атрибутов пользователя используется командлет Get-ADUser. Например, кроме имени учетной записи, можно вывести UserPrincipalName, должность и телефон пользователя группы:
Get-ADGroupMember -Identity ’server-admins’ -recursive| foreach { Get-ADUser $_ -properties UserPrincipalName, title, OfficePhone|Select-Object title, OfficePhone }
Посчитать количество пользователей в группе можно так:
(Get-ADGroupMember -Identity 'domain admins').Count
Чтобы найти список пустых групп в определенном OU, воспользуйтесь такой командой:
Get-ADGroup -Filter * -Properties Members -searchbase “OU=Moscow,DC=corp,dc=winitpro,DC=ru” | where {-not $_.members} | select Name
С помощью командлета Get-ADGroupMember можно создать простой PowerShell скрипт для оповещения администратора, если кто-то добавил нового пользователя в определенную группу AD.
Set-ADGroup: изменить атрибуты группы AD
Командлет Set-ADGroup позволяет изменить свойства (атрибуты) любой группы Active Directory. Например, можно изменить описание и название группы:
Set-ADGroup -Identity MSKAdmins -Description “New Admin Group Description”
или так:
Get-ADGroup -Identity MSKAdmins | Set-ADGroup -Description “New Admin Group Description v2”
Скрыть определённую группу из адресной книги Exchange:
Set-ADGroup –id mskadmins -replace @{hideDLMembership=$true}
Можно изменить сразу несколько параметров группы. Список изменения удобно задать через HashTable:
Список атрибутов можно получить так или в консоли ADUC на вкладке редактора атрибутов
$attrs = @{"mail"="mskadmins@winitpro.ru";"displayname"="ALL MSK Admins"}
Set-ADGroup -Identity MSKAdmins –Add $attrs
Remove-ADGroup: удалить группу AD
Чтобы удалить групп в Active Directory используется командлет Remove-ADGroup:
Remove-ADGroup -Identity MskSales
При удалении группы появляется запрос подтверждения удаления. Чтобы отключить подтверждение удаления, добавьте параметр Confirm:
Remove-ADGroup -Identity MskSales –Confirm:$false
Get-ADObject -Filter {Deleted -eq $True -and ObjectClass -eq 'group' -and Name -like '*MskSales*' } –IncludeDeletedObjects| Restore-ADObject –verbose
Добрый день!
Подскажите, как можно выбрать учетные записи, не входящие ни в один OU.
Есть 7 групп в OU, надо отобрать учетки, невходящие ни в одну в эту группу
Спасибо.
Добрый! Не понял задачу. Давайте переформулируем: нужно выбрать из определенной OU пользователей, которые не входят в определенную группу. Так?
Все верно, есть OU «Учетные записи», находящиеся там учетки входят в одну из семи групп «Магазин1», «Магазин2″….. «Магазин7»
И есть необходимость отобрать пользователей, не входящих ни в одну из этих семи групп.
Вот пример скрипта. Скрипт выводит список пользователей из определенной OU, которые не входят в группу Domain Admins.
$group = "Domain Admins"
$members = Get-ADGroupMember -Identity $group -Recursive | Select -ExpandProperty Name
$users = Get-ADUser -SearchBase "ou=users,ou=msk,dc=corp,dc=ru" -filter *
ForEach ($user in $users) {
If (-Not ($members -contains $user)) {
Write-Host $user
}}
Так не работает(
Выводит все-равно учетки, которые находятся в определенной Ou, но не входят в группу.
Буду копать дальше, пока добавил в отбор только включенные учетки)
Скорее всего (ИМХО) непонятно по чему конкретно скрипт сравнивает, попробую пройтись по SID’у
Доброго времени суток.
Необходимо выгрузить все почтовые группы рассылки, в которые входят определённые сотрудники с определённой должностью. Подскажите какой командой или скриптом можно выполнить данный запрос?
получается:
1. Выгружаю список сотрудников, которые имеют определённую должность:
Get-ADUser -Filter {Title -like "*Директор*"} | Select-Object Name
2. Выгружаю список логинов, которые имеют соответствующую должность:
Get-ADUser -Filter {Title -like "*Директор*"} | Select-Object SamAccountName
3. Далее из полученного списка логинов выгрузить список почтовых групп рассылок, в которые они входят, т.е. у каждого логина свой список групп.
могу только по одному логину:
Get-ADPrincipalGroupMembership username | Select-Object Name
Но выгружает абсолютно все группы, а мне нужны именно почтовые группы, т.е. те, которые имеют email адрес.
Прошу помощи.
Вот как-то так:
$Users = Get-ADUser -Filter {Title -like "*Директор по региональному развитию*"}
foreach ($User in $Users)
{
$Groups = Get-ADPrincipalGroupMembership $User
(Get-ADUser $User).Name
foreach ($Group in $Groups)
{
If ((Get-ADGroup "$Group" -Properties mail).Mail -eq $null)
{
}
else
{
(Get-ADGroup "$Group" -Properties mail).Name
}
}
}
только как вывести в таблицу?
В общем-то все правильно. Немного модифицировал ваш скрипт. У меня получилось так. На выходе получаем табличку с именем учтной записи и имя группы с разделителем «;».
$Users = Get-ADUser -Filter {Title -like "*Директор по региональному развитию*"}
foreach ($User in $Users)
{
$Groups = (Get-ADuser -Identity $User -Properties memberof).memberof | Get-ADGroup
foreach ($Group in $Groups)
{
If ((Get-ADGroup "$Group" -Properties mail).Mail -eq $null)
{
}
else
{
Write-Host $User.sAMAccountName ";" (Get-ADGroup "$Group" -Properties mail).Name
}
}
}
А команда
Get-ADGroupMember ‘group_name’ -recursive| ft name
должна раскрывать любые вложенные группы или есть какие то ограничения?
Например у меня в группу «common_users» входит группа «Пользователи домена».
Если использовать
Get-ADGroupMember ‘Пользователи домена’ -recursive| ft name
то выдает большой список доменных пользователей.
Но если использовать
Get-ADGroupMember ‘common_users’ -recursive| ft name
то выводит только пользователей группы common_users, а группы Пользователи домена — нет.
Методом эксперимента установил, что из группы Пользователи домена отображаются те пользователи, для которых Пользователи домена НЕ основная группа.
Маша и Петя оба состоят в группах «Пользователи домена» и «Бухгалтеры»,
при этом для Маши основная группа Пользователи домена, а для Пети основная группа Бухгалтеры, то при выполнении
Get-ADGroupMember ‘common_users’ -recursive| ft name
Петя будет отображен, а Маша нет.
Это как то можно обойти? Чтоб показывались абсолютно все пользователи кто так или иначе входит в common_users.
Пользователи являются членами Domain Users через primaryGroupID.
Не знаю, что делать в вашем случае. Вероятно, не самое хорошее решение использовать группу Domain Users в качестве члена другой группы безопасности AD.
С пользователями домена — это частный случай. В общем получается, что если пользователь состоит только в одной группе (которая является его основной), то он не будет отображен при выполнении команды с рекурсией.
Добрый день.
Не подскажите как как получить список групп из родительской OU не получив при этом группы из дочерних OU.
Т.е. есть OU=1 в ней несколько групп и OU=1.1, OU=1.2 … со своими группами. Как получить группы только OU=1?
Get-ADGroup -SearchBase «OU=1,DC=mycompany,DC=lan» выводит все группы.
Чтобы искать только по группам первого уровня, а не по вложенным, можно использовать аргумент: -SearchScope OneLevel
Get-ADGroup -Filter * -SearchBase 'OU=1,DC=mycompany,DC=lan' -SearchScope OneLevel
Добрый день!
При добавлении юзеров в группу users.csv, получаю такую ошибку:
Add-ADGroupMember : Не удается обработать параметр, так как имя параметра «Member» неоднозначно. Возможные совпадения:
Покажите полный код ошибки. Там есть указания на имена пользователей? Может быть что команлет ругается на то, что у вас есть пользователи вида: aaivanov и aaivanov2.
Add-ADGroupMember : Parameter cannot be processed because the parameter name ‘Member’ is ambiguous. Possible matches include ???
Или попробуйте вместо Import-CSV использовать Get-Content:
Get-Content .\users.csv | % {Add-ADGroupMember "‘TestADGroup" -Members $_}
Подскажите могу ли я получить список всех групп куда входить пользователь?
Как раз вчера опубликовал стать. на эту тему: https://winitpro.ru/index.php/2020/03/24/skopirovat-gruppy-active-directory-drugomu-polzovatelyu/
Список групп пользователя:
Get-ADUser -Identity username-Properties memberof | Select-Object -ExpandProperty memberof
Большое спасибо
Здравствуйте. Во-первых, хочу выразить Вам благодарность за статью. Ваш труд облегчил многим людям работу.
Хотел спросить, возможно ли подсунуть в скрипт два csv файла, в одном из которых будет список юзеров, во втором список групп, чтобы по итогу все юзеры были добавлены во все указанные группы.
Спасибо.
Нужен совет. Есть AD всероссийской организации, в нём есть контейнеры федеральных округов, в округах области, в областях офисы, в офисах юзеры. И есть некая глобальная группа, в которую входят понемногу юзеры из всех областей.
Нужно выбрать юзеров одной области (всех офисов данной области), входящих в эту глобальную группу. Как это сделать? Напишите пожалуйста пример команды Get-ADGroupMember, не могу придумать сам.
Как-то так:
Get-ADGroupMember ruspb_proxy_users|where {$_.distinguishedName -like "*OU=Users,OU=SPB*"}
Отличные примеры!
Хотелось бы добавить, что выбор рекурсивно всех пользователей группы включая все подгруппы лучше выполнять вот таким образом, особенно когда понадобится выбрать дополнительне атрибуты пользователя.
$GroupToSearch = "TestADGroup";
$GroupDN = (Get-ADGroup $GroupToSearch).DistinguishedName;
Get-ADUser -Filter { MemberOf -RecursiveMatch $GroupDN};
Такое решение работает разва в полтора-два быстрее чем классический пример:
Get-ADGroupMember -Identity $GroupToSearch -Recursive | Get-ADUser
На большом количество пользователей существенное подспорье.
Для замера скорости исполнения:
(Measure-Command { Get-ADUser -Filter { MemberOf -RecursiveMatch $GroupDN}; }).TotalMilliseconds
(Measure-Command { Get-ADGroupMember $GroupDN -Recursive | Get-ADUser; }).TotalMilliseconds
Начет такой разницы в скорости быстродействия не знал. Спасибо за инфу!
Добрый день! Подскажите как группу добавить к другой группе в member и membersOf? Спасибо
Также как и пользователей, через Add-AdGroupMember:
The Add-ADGroupMember cmdlet adds one or more users, groups, service accounts, or computers as new members of an Active Directory group