Powershell: подсчет членов группы AD
Мой текущий вопрос заключается в том, как подсчитать количество членов в группе, а не распечатать всех членов группы (включая их идентификационные имена или имена компьютеров). Закомментированный код печатает каждый член. Я просто хочу их посчитать.
Я пробовал $ members.count, $ member.count и $ string.count в своем цикле foreach, но ничего не распечатывает. Пожалуйста помоги
Я сделал правку на основе комментария Алекса Маккензи. В первом примере, который вы мне дали, возникли проблемы. Я попытался внести в него некоторые изменения, но получаю сообщение об ошибке: Невозможно проверить аргумент для параметра «Identity». Аргумент нулевой или пустой. Укажите аргумент, который не является пустым или пустым, а затем попробуйте команду еще раз.
Ниже мой готовый код. Я просто создал отдельные файлы .txt для каждой нужной мне вещи и просто импортирую их в Excel по отдельности. ВОПРОС ИСПРАВЛЕН
Я добавляю счетчик в исходный скрипт, если хочу, чтобы он тоже подсчитывал
Get-AdGroupMember – Export AD Group Members to CSV
Get-AdGroupMember PowerShell cmdlet gets AD group members, members can be users, computers, or groups. Administrator often needs to export active directory group members to CSV file to know who are the users in the group or particular distribution list.
Windows PowerShell Active Directory module is one of the popular modules to manage the active directory domains, manage objects in the active directory, and get information about computers, and users.
Active Directory module consolidates a group of cmdlets which helps to manage different objects, get AD group members and export active directory group members.
Using Get-AdGroupMember cmdlet, you can easily get ad group members from the active directory and export ad group members to CSV or file.
In this article, we will discuss about Get-ADGroupMember examples, how to use the cmdlet to list group members in PowerShell, and how to get ad group members, and export members of the ad group to a CSV file.
Getting Started
To use Active Directory cmdlets, your system needs to have the following requirement
-
Active Directory module to be installed
- Users with administrator access or have enough access to read AD group information
Tip: To know which modules are available in the system, run the below command in PowerShell ISE
Get-ADGroupMember
PowerShell Get-ADGroupMember cmdlet get ad group members. Ad group members can be users, computers, or groups.
Get-AdGroupMember Syntax
Let’s understand the Get-ADGroupMember cmdlet key parameter as below:
–AuthType – It specifies the authentication method to use. AuthType parameter accepts either Basic (or 1) or Negotiate (or 0). It has Negotiate default authentication method.
SSL (Secure Socket Layer) connection is required to use the Basic Authentication method.
–Credential PSCredential – It specifies user credentials required to perform the Get-ADGroup search for the group. It default accepts the credentials of logged-on users.
To use the Credential parameter, use username as User1 or domain\User1 or you can create and use PSCredential object by using Get-Credential cmdlet.
-Identity – It specifies Active Directory group object search using the distinguished name, GUID, security identifier or SAMAccountName
-Partition – It specifies the distinguished name of an active directory partition.
-Recursive – It specifies getting all ad group members from a group that does not contain child objects.
Get-ADGroupMember Examples
Let’s understand using Get-AdGroupMember to list ad group members and export ad group members to the CSV file.
Get AD group by SAM account name
In the above PowerShell script, the Get-AdGroup cmdlet is used to retrieve information about the Active Directory group «Administrators» specified by the Identity parameter.
This command returns the SAM account name for the Administrators ad group.
Get-AdGroupMember of Group
Use the Get-ADGroupMember cmdlet in PowerShell to get a list of all members of the AD group. Members can be users, groups, or computers.
In PowerShell to list ad group members of a specific group, use the Identity parameter. You can identify Active Directory groups by displayname, SAM account name, GUID, distinguished name, or security identifier.
Get members of ad group
Use the Get-AdGroupMember cmdlet in PowerShell to get a list of all members in the Administrators ad group, and run the below script.
In the above PowerShell script, the Get-AdGroupMember gets a list of all members of AD group specified by the Identity parameter.
If you want to get members name only, use the Select command to select the ad group member name.
The output of the above PowerShell script to get an active directory group member name is:
PowerShell get ad group member name
Get AD group members Export to CSV file
PowerShell Get-AdGroupMember cmdlet get list of ad group members.
To get ad group members and export AD group members list to a CSV file, use the below command
In the above PowerShell script, the Get-AdGroupMember command gets group members of Administrators ad group specified by the Identity parameter.
It gets all members of the “Administrators” active directory group and uses the Export-CSV to export group members of ad group to a CSV file.
Export members of a group to a CSV file
Export Ad Group Member Email Address to Csv
Use Get-AdGroupMember to get ad group member email addresses and export group members to the CSV file, run the following script.
In the above PowerShell script, the Get-AdGroupMember cmdlet gets members of ad group and passes the output to the Get-AdUser cmdlet to get ad group member properties like Name and Email address and pass output to the third command.
Using the Export-Csv cmdlet in PowerShell, it exports ad group member email addresses to a CSV file.
Cool Tip: How to get adgroupmember count in PowerShell!
Export Ad Group Members from Specific OU
The Organizational Unit in Active Directory contains users, computers, and group objects. Use Get-AdGroupMember to list members of ad groups and export group members to a CSV file.
To export ad group members from specific OU to a CSV file with the group name and ad user name, run the below PowerShell script
In the above PowerShell script,
In the first command, we define Organizational Unit (OU) path
Using the Get-AdGroup cmdlet, it gets ad groups from specific OU.
In the next command, it uses foreach to iterate over ad groups recursively to get ad group members, group names, and user names belonging to the ad group in specific OU.
Using Export-Csv cmdlet in PowerShell, it exports members of ad group from specific OU to CSV file.
Cool Tip: How to get adgroupmember samaccountname in PowerShell!
Get members of Ad group including members of child groups
By default Get-AdGroupMember get list of all members from the active directory group. Use recursive the parameter to get members of a group and child groups.
Let’s consider if the Sales group contains user John Tigre and the group EUSalesLeader.
EUSalesLeader ad group contains user Smith Waugh.
Use Get-AdGroupMember with Recursive parameter to get John Tigre and Smith Waugh
The above PowerShell script uses the Get-AdGroupMember command uses the Identity parameter to get all the members of the Sales ad group including members of the child group using the Recursive parameter.
Get-ADGroupMember FAQ
To solve the above issue, the system must have an Active Directory module. You can check if the module is available or not using Get-Module -ListAvailable
If the Active Directory module is not available then import it using import-module activedirectory
If you are trying to list thousands of group members, you may come across a size limit for this request was exceed the issue with Get-AdGroupMember.
By default, the limit is 5000 objects. This limit is from Active Directory Web Service and applies to three cmdlets Get-ADGroupMember, Get-ADPrincipalGroupMembership, and Get-ADAccountAuthorizationGroup .
You can modify it in the config file. You will have to make sure to update the config file on each DC.
On Domain controller, open file at location C:\Windows\ADWS\Microsoft.ActiveDirectory.WebServices.exe.config and look for appSettings tag, add below tag
<add key=»MaxGroupOrMemberEntries» value />
Save the config file and restart the ADWS service on DC. Repeat the above step on each DC.
Use the below command to the get-aduser account name, email address
Get-ADGroupMember «Asia_Sales_Users» | Sort -Property Name | foreach< get-aduser $_ -Properties SamAccoutName| select Name, Surname, GivenName,
SamAccountname, EmailAddress | ft -AutoSize
If you want to get lists of users from one group and add them to another group
Get-ADGroupMember «a sia_sales » | Get-ADUser | Foreach-Object
Get-ADGroupMember -identity “Asia_Sales” | select name | Export-csv -path C:\PowerShell\adgroupmembers.csv -NoTypeInformation
This command list member of ad groups that belong to the Asia_Sales group and exports their information to the adgroupmembers.csv file using Export-csv
Conclusion
Hope you find and like the above article to get active directory group members using Get-AdGroupMembe r cmdlet is helpful and educational.
The PowerShell Active Directory module provides a powerful cmdlet to perform and export active directory members to CSV files.
You can find more topics about PowerShell Active Directory commands and PowerShell basics on the ShellGeek home page.
Строим отчет о членстве пользователей в группах AD: 4 проблемы в написании Powershell-скрипта
Билл Стюарт, scripting guru, в своей статье на WindowsITPro описывает те проблемы, с которыми ему пришлось столкнуться при написании Powershell-скрипта, который бы выводил членство пользователей в группах Active Directory. Пришлось проделать 4 усовершенствования, чтобы все заработало как надо. Узнать, как Билл реализовал таки вывод членства в группах, и скачать сам Powershell-скрипт Вы можете под катом.
Ссылка на окончательный вариант скрипта.
www.windowsitpro.com/content/content/141463/141463.zip
Я сбился со счету, сколько раз я уже встречал на форумах вопрос: “Кто-нибудь знает, как получить информацию обо всех пользователях и их членстве в группах в домене AD?”. Аудиторы и консультанты по информационной безопасности также задают подобный вопрос, когда осуществляют оценку инфраструктуры (среды) Active Directory в организации. Так как этот вопрос довольно насущный, я решил написать PowerShell скрипт, который бы позволял упростить эту задачу.
Сначала я думал, что написать подобный скрипт – пара пустяков, но на моем пути встретились 4 препятствия, которые усложнили мою работу. Я опишу эти проблемы, чуть позже, но сначала мне хотелось бы рассказать об основах использования Microsoft.NET в Powershell при поиске по AD.
Использование .NET для поиска по AD
Используя .NET для поиска по AD, Вы можете использовать type accelerator в PowerShell для поиска объектов. (Type accelerator – сокращенное имя для .NET класса). Например, введите следующую команду, чтобы вывести список всех пользователей в данном домене:
[ ADSISearcher] – это type accelerator для объекта .NET System.DirectoryServices.DirectorySearcher. Строка, идущая после данного type accelerator, задает свойства SearchFilter для данного объекта, чтобы найти все объекты пользователей, и метод FindAll начинает поиск. На выходе мы получаем список объектов System.DirectoryServices.SearchResult.
Затем мы хотим определить, в какой группе состоит пользователь. Чтобы узнать, мы можем использовать коллекцию свойств (Properties collection) из объекта SearchResult и извлечь такой атрибут объекта как memberof. Используя переменную $searcher из предыдущего примера, мы можем использовать метод FindOne (вместо FindAll), чтобы извлечь один результат и вывести членство пользователя в группах:
Первая команда находит первого пользователя, который удовлетворяет поисковому фильтру, а вторая команда выводит список в групп, в которых пользователь состоит.
Однако если внимательно посмотреть на этот список, то можно заметить отсутствие важной детали: основная группа (primary group) пользователя не включена в атрибут memberof. Хотелось бы получить полный список групп (включая основную группу), что приводит нас к первой проблеме.
Проблема #1: Как найти основную группу пользователя
- Связываемся (connect to) с объектом пользователя, используя WinNT provider (вместо LDAP provider).
- Извлекайте атрибут пользователя primaryGroupID .
- Извлекайте имена групп пользователя, используя WinNT provider, который включает основную группу.
- Осуществляйте поиск в AD этих групп, используях их sAMAccountName атрибуты.
- Находим группу, в которой атрибут primaryGroupToken совпадает с атрибутом пользователя primaryGroupID.
Проблема #2: Перевод из одного формата имени в другой
Объект NameTranslate является COM (ActiveX) объектом, который использует интерфейс IADsNameTranslate, осуществляющий перевод имен объектов AD в переменные (чередующиеся, alternate) форматы. Вы можете использовать объект NameTranslate, создав объект и затем вызвав его Init метод для инициализации. Например, список 1 показывает код VBScript скрипта, которые создает и инициализирует NameTranslate.
Список 1: Создание и инициализация объекта NameTranslate в VBScript
Однако объект NameTranslate не работает так, как ожидалось в PowerShell, что показано на рисунке 1.
Рис 1: Неожиданное поведения объекта NameTranslate в PowerShell
Проблема заключается в том, что в объекте NameTranslate отсутствует библиотека типов, которые .NET (а следовательно и PowerShell) использует для предоставление простого доступа к COM-объектам. Но к счастью и эту проблему можно обойти: метод .NET InvokeMember позволяет PowerShell получить или установить свойства или вызвать метод из COM-объекта, который отсутствует в библиотеке типов. Список 2 показывает Powershell эквивалент кода скрипта VBScript, приведенного в таблице 1
Список 2: Создание и инициализация объекта NameTranslate в PowerShell
Я хотел, чтобы скрипт решал другую проблему, связанную с именем. Атрибут memberof для пользователя AD содержит список различающихся имен, в которых пользователь состоит, но вместо этого я хотел получить атрибут samaccountname для каждой группы. Скрипт использует объект NameTranslate, чтобы справиться с этой проблемой.
Проблема #3: Что делать со специальными символами
Документация Microsoft относительно различающихся имен упоминает, что отдельные символы должны быть опущены (например, с префиксом “\”) для того, чтобы быть правильным образом интерпретированы (в этой статье написано подробнее). К счастью, COM-объект Pathname дает такую возможность. Скрипт использует объект Pathname, чтобы пропустить те различающиеся имена, которые содержат специальные символы. Объект Pathname также требует .NET метод InvokeMember потому что, также как и объект NameTranslate, у этого объекта отсутствует библиотека типов.
Проблема #4: Повышаем производительность
Если оглянуться на Проблему #1 (Как найти основную группу пользователя), можно заметить, что обходное решение требует поиск групп пользователя. Проделав эту процедуру для нескольких учетных записей, Вы поймете, насколько она неоптимальна. Извлечение атрибута samaccountname для каждой группы в атрибуте memberof, о котором я упомянул, рассматривая Проблему #2 (Перевод из одного формата имени в другой) также неоптимально и отнимает много времени. Чтобы решить эту проблему скрипт использует две глобальные хеш-таблицы (global hash tables), которые производят хеширование результатов для повышения произодительности.
Get-UsersAndGroups.ps1
Get-UsersAndGroups.ps1 — это готовый Powershell-скрипт, который выводит список пользователей и их членства в группах. Синтаксис командной строки скрипта следующий:
Параметр -SearchLocation представляет собой одно или несколько различающихся имен для учетных записей пользователей. Потому что различающееся имя содержит запятые (,), их необходимо помещать в скобки (одинарные или двойные) каждое различающееся имя, чтобы PowerShell не интерпретировал их как массив. Имя параметра -SearchLocation опционально. Скрипт также принимает конвейерный ввод (pipeline input); каждое значение из конвейера должно являться различающимся именем, которое необходимо искать.
Значение -SearchScope обозначает возможный масштаб поиска по AD. Это значение должно быть одним из трех: Base – Поиск ограничивается базовым объектом, не используется; OneLevel – поиск ближайших дочерних объектов базового объекта и Subtree – поиск по подветке. Если это значение не уточнено, то по умолчанию используется Subtree. Используйте -SearchScope OneLevel, если Вы хотите определенное подразделение (OU), но ни одна из OU не вложена в него. Скрипт выводит объекты, которые содержат свойства, перечисленные в таблице 1.
Преодолевая 4 проблемы
- Проблема #1: Как найти основную группу пользователя: Функция get-primarygroupname возвращает имя основной группы пользователя.
- Проблема #2: Перевод из одного формата имени в другой: Скрипт использует COM-объект NameTranslate, чтобы осуществить перевод из одного формата имени в другое.
- Проблема #3: Что делать со специальными символами: Скрипт использует функцию get-escaped, которая использует объект Pathname, чтобы возвратить различающиеся имена с вставленными пропущенными символами (там, где это необходимо).
- Проблема #4: Повышаем производительность: Скрипт использует хэш-таблицы $PrimaryGroups и $Groups. Ключи в хеш-таблице $PrimaryGroups являютяются идентификаторами основной группы и их значения – атрибутами samaccountname основной группы.
Упрощаем аудит групп и пользователей
Написание скрипта Get-UsersAndGroups.ps1 оказалось не таким уж и простым, как мне казалось с первого взгляда, но проще сделать нельзя. Простейшее приложение скрипта –следующая команда:
Она создает .csv файл, который содержит полный список пользователей и групп для данного домена. Имя в своем арсенале такой скрипт, мы можете быстро и без проблем создать отчет по группам и пользователям.
Command line to list users in a Windows Active Directory group?
Is there a command line way to list all the users in a particular Active Directory group?
I can see who is in the group by going to Manage Computer —> Local User / Groups —> Groups and double clicking the group.
I just need a command line way to retrieve the data, so I can do some other automated tasks.
9 Answers 9
Here’s another way from the command prompt, not sure how automatable though since you would have to parse the output:
If group is «global security group»:
If you are looking for «domain local security group»:
Here’s a version of the ds command I found more typically useful, especially if you have a complex OU structure and don’t necessarily know the full distinguished name of the group.
or if you know the CN of the group, usually the same as the SAM ID, quoted in case there are spaces in the name:
As stated in the comments, by default the ds* commands (dsquery, dsget, dsadd, dsrm) are only available on a Domain Controller. However, you can install the Admin Tools pack from the Support Tools on the Windows Server installation media or download it from the Microsoft Download site.
You can also perform these queries using PowerShell. PowerShell is already available as an installable feature for Server 2008, 2008 R2, and Windows 7, but you’ll need to download the WinRM Framework to install it on XP or Vista.
To get access to any AD-specific cmdlets in PowerShell you will ALSO need to perform at least one of the following installs: