В этой статье мы рассмотрим несколько примеров использования PowerShell для получения списка пользователей в различных группах Active Directory. Данная статья должна научить вас получать список учетных записей определенной группы AD и экспортировать полученный список пользователей с различными атрибутами в CSV файл, с которым удобно работать в Excel.
Ранее для построения списка пользователей в группах Active Directory приходилось использовать скрипты VBScript, или утилиты командной строки DSQuery или CSVDE, недостаточно гибкие и удобные.
Для взаимодействия с AD Microsoft разработала специальный модуль Active Directory Module для Windows PowerShell. Впервые данный модуль появился в Windows Server 2008 R2 и для его использования нужно сначала его загрузить в вашу сессию PowerShell командой:
Import-Module ActiveDirectory
В Windows Server 2012 / R2 / Windows Server 2016 этот модуль автоматически устанавливается и загружается при установке на сервере роли ADDS (Active Directory Domain Services), т.е. при повышении сервера до контроллера домена.
В настольных пользовательских операционных системах (Windows 10 / 8 / 7) модуль Active Directory для Windows PowerShell входит в состав RSAT, который нужно скачать, устанавливать и активировать модуль для работы с AD отдельно.
Обратите внимание, что для использования в сессии PowerShell модуля ActiveDirectory не обязательно иметь права администратора домена. Получить информацию о пользователях и группах из AD может любой аутентифицированный пользователь домена.
Для получения информации об учетных записях, которые входят в группу безопасности Active Directory используется командлет Get-ADGroupMember.
Например, чтобы вывести на экран список членов группы Domain Admins, нужно выполнить команду:
Get-ADGroupMember 'Domain Admins'
В том случае, если вы не знаете точного имени группы, можно вывести список всех групп в AD с помощью команды:
Get-ADGroup -filter * | sort name | select Name
Чтобы отобразить только имена пользователей в группе:
Get-ADGroupMember -Identity 'Domain Admins'| ft name
Если в указанной группе содержатся другие группы AD, для вывода членов группы с учетом вложенных групп нужно использовать параметр Recursive .
Get-ADGroupMember -Identity ‘Domain Admins’ -Recursive | ft name
Переключатель –recursive предписывает команде get-adgroupmember получать список пользователей из каждой вложенной группы и выводить только объекты, не являющиеся контейнерами (пользователей или компьютеры). Т.е. данная команда отобразит даже тех пользователей, которые напрямую не входят в группу.
Можно вывести более подробную информацию об учетных записях в данной группе таким образом:
Get-ADGroupMember -Identity ‘Domain Admins’ | foreach { Get-ADUser $_ -Properties * }
Рассмотрим более сложную конструкцию PowerShell, которая позволяет вывести всех членов определённой доменной группы безопасности с информацией о компании, подразделении и должности с последующей сортировкой и разбивкой на блоки с зависимости от конкретного аттрибута (допустим нам нужно сгруппировать пользователей по полю Компания — company ):
Get-ADGroupMember -Recursive ‘Domain Admins’ | ForEach {Get-ADUser -filter {samaccountname -eq $_.SamAccountName} -Properties displayName, company, title, department} | Sort-Object company,displayName | Format-Table displayName,company,department,title -GroupBy company -AutoSize
Для выгрузки полученного списка в текстовый файл в конце предыдущей команды нужно добавить конвейер:
| Out-File -Width 4000 "C:\TxT\GetUsersADGroupByCompany.txt"
Для выгрузки списка пользователей группы в CSV файл нужно добавить такой конвейер:
| Export-Csv -NoTypeInformation .\GetUsersADGroupByCompany.csv -Encoding Unicode
Можно посчитать общее количество пользователей в группе:
(Get-ADGroupMember -Identity 'Domain Admins').Count
Еще один полезный пример. Попробуем найти все группы AD содержащие в имени шаблон *Manager*, и выведем пользователей, которые входят в эти группы. Чтобы выводить только уникальные объекты, воспользуемся аргументом -uniq.
Get-ADGroup -filter 'SamAccountName -like "*Manager*"' | Get-ADGroupMember -recursive|Select-Object -uniq
Если при выполнении команды Get-ADGroupMember появится ошибка:
Get-ADGroupMember : The specified directory service attribute or value does not exist
Значит в состав группы входят пользователи из других лесов. Командлет Get-ADGroupMember не поддерживает работу с пользователями из разных лесов AD.
Для добавления пользователей в группы AD нужно использовать командлет Add-ADGroupMember.
7 комментариев
Get-ADGgroup -filter * | sort name | select Name
тут ошибка, ADGg (две g) поправьте пожалуйста
+
Спасибо, вы очень помогли
Добрый день, подскажите, при выполнении команды происходит задержка секунд на 30 и затем выдает:
Get-ADGroupMember -Identity ‘Юридический отдел’
Get-ADGroupMember : При обработке данной операции службой Active Directory произошла ошибка.
строка:1 знак:1
+ Get-ADGroupMember -Identity ‘Юридический отдел’
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Юридический отдел:ADGroup) [Get-ADGroupMember], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.GetADGroupMember
И такая ошибка происходит со всеми группами, где есть хотя бы 1 пользователь. Если группа пустая, то ошибки не выдается. Что делаю не так?
Везде, где Вы используете в коде имя группы Domain Admin», его надо поправить на «Domain Admins» .
Группы «Domain Admin» на контроллерах WIndows по умолчанию не существует.
Исправлено )
Здравствуйте а как тут Get-ADGroup -filter * | sort name | select Name пропустить русские названия? Get-ADGroup -filter * | sort name | select Name | where {$_.Name -match «[A-Za-z]\b[^\S]\b»} пробовал что то такое не получилось. вернее русские пропускаются но если есть английские буквы то все равно попадаются. хотел сделать если есть пробел то пропустить такие группы