Как посмотреть состав группы ad

от admin

Windows admin blog

Полезные команды cmd, powershell, администрирование, фичи и решения проблем на win/winserver

AD: узнать в каких группах состоит пользователь / прямое и косвенное членство

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

Также, через GUI вы не определите ПОЛНЫЙ список членства (т.н. косвенное членство), когда одни группы могут быть вложены в другие.

Если группа, в которой состоит пользователь, является вложенной группой другой группы — пользователь наделяется полномочиями, заданными конечной группе, хотя и не является ее членом напрямую. Эту группу вы не увидите на вкладке пользователя «Член групп» (Member of)

Рассмотрим в рамках этой статьи следующие инструменты:

  • whoami /groups — членство в группах текущего пользователя
  • dsget user — покажет прямое и косвенное членство
  • Get-ADUser (Powershell)

1) Whoami /groups

Если нам необходимо узнать, в каких группах состоит текущий пользователь , под которым мы залогинены, можно воспользоваться командой:

Правда вывод не очень удобен для восприятия. Будут отображены все группы с прямым и косвенным членством

2) Утилита dsget

Вывести список групп, в которых состоит пользователь:

(в данном примере выводим список групп, в которых состоит пользователь Peter Parker, находящийся в OU «IT department\Support team»)

Следующая команда отобразит расширенный список групп, в т.ч. в которых косвенно состоит пользователь (ключ -expand)

Утилита dsget доступна только на контроллерах домена

3) Get-ADUser

Для выполнения командлета Get-ADUser требуется установить Powershell модуль Active-Directory.

Чтобы вывести список групп требуемого пользователя в удобном формате, необходимо выполнить следующий конвейер команд в powershell:

Примечание: данная команда выведет прямое членство (по сути, содержимое закладки пользователя «Член групп» (Member of)

Как посмотреть состав группы ad

> Get-ADUser -filter * | Select Name, SamAccountName

> Get-ADUser dmosk -Properties *

> Get-ADUser -filter * -Properties title | where | Select Name

> Get-ADUser -filter * | Where

Выгрузка пользователей в CSV (для просмотра в текстовом формате или Excel)

Get-ADUser -filter * -Properties * | Export-csv -path C:\Temp\ADUsers.csv

Get-ADUser -filter * -SearchBase «OU=Пользователи,DC=dmosk,DC=local» -Properties mobile, mail | Select Name, mobile, mail | Export-csv -Encoding UTF8 -Delimiter «;» -path C:\Temp\UserPhoneAndEmail.csv

Get-AdUser dmosk -Properties memberof | Select memberof -expandproperty memberof

Строим отчет о членстве пользователей в группах 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: Как найти основную группу пользователя
  1. Связываемся (connect to) с объектом пользователя, используя WinNT provider (вместо LDAP provider).
  2. Извлекайте атрибут пользователя primaryGroupID .
  3. Извлекайте имена групп пользователя, используя WinNT provider, который включает основную группу.
  4. Осуществляйте поиск в AD этих групп, используях их sAMAccountName атрибуты.
  5. Находим группу, в которой атрибут primaryGroupToken совпадает с атрибутом пользователя primaryGroupID.
Проблема #2: Перевод из одного формата имени в другой

Объект NameTranslate является COM (ActiveX) объектом, который использует интерфейс IADsNameTranslate, осуществляющий перевод имен объектов AD в переменные (чередующиеся, alternate) форматы. Вы можете использовать объект NameTranslate, создав объект и затем вызвав его Init метод для инициализации. Например, список 1 показывает код VBScript скрипта, которые создает и инициализирует NameTranslate.

Список 1: Создание и инициализация объекта NameTranslate в VBScript

Однако объект NameTranslate не работает так, как ожидалось в PowerShell, что показано на рисунке 1.


Рис 1: Неожиданное поведения объекта NameTranslate в PowerShell

Читать:
Почему vs code не видит библиотеку python

Проблема заключается в том, что в объекте 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:

Похожие статьи