Назад | Перейти на главную страницу

Каков синтаксис запроса AD для перечисления всех пользователей определенной группы?

Вот что не пока работают;

(& (objectCategory = Человек) (objectClass = Группа) (CN = group_in_question))

(& (objectClass = Группа) (objectCategory = Группа) (member = CN = group_in_question))

(& (samAccountName =% USERNAME%) (memberof = CN = group_in_question))

(& (objectCategory = person) (objectClass = user) (memberOf = cn = group_in_question, ou = Groups, dc = mydomain, dc = com))

Для этого типа запроса необходимо учитывать несколько моментов:

  1. Сколько объектов может вернуть этот запрос?
  2. Вы хотите расширить группы, которые являются членами групп?
  3. Приходится ли вам работать с «большими» группами (более 1500 членов)?

Вы всегда должны включать "(ObjectCategory = person)", если ваш запрос будет искать в большой базе данных пользователей. Есть несколько причин, по которым вы хотите это сделать. ObjectCategory - это индексированный атрибут, в отличие от objectClass, что значительно повысит скорость выполнения запросов в больших базах данных AD. Кроме того, использование атрибутов objectCategory и objectClass предотвратит возврат «контактных» объектов в ваш запрос.

Если ваш набор результатов будет возвращать более 1000 результатов, вам необходимо знать о проблемах с производительностью. В графическом интерфейсе пользователя ADUC существует ограничение в 2000 элементов, которое вы можете изменить в диалоговом окне «Параметры», увеличение может значительно замедлить выполнение вашего запроса. Если вы собираетесь использовать VBScript и выполнять перечисление по результатам GetObject, это также будет ОЧЕНЬ ОЧЕНЬ медленно для больших групп. Для командлетов Quest Powershell необходимо включить параметр -sizelimit, чтобы переопределить ограничение в 1000 элементов:

get-qadgroupmember somegroup -sizelimit 0

Если вы используете код (VBScript, JScript, .Net) для создания объекта подключения и добавления к нему запроса LDAP, вам нужно будет установить свойство ".pageSize" в объекте подключения, чтобы получить результат с разбивкой на страницы, поскольку по умолчанию чтобы не возвращать постраничный результат, а ограничить его 1000 элементами. Я обычно устанавливаю .pageSize равным 1000, так как это максимум.

Сложнее всего расширить вложенные группы. Самый простой способ получить информацию о вложенной группе - использовать командлеты Quest Powershell:

get-qadgroupmember somegroup -indirect -sizelimit 0

Из сценария VBscript / JScript вы можете использовать «GetObject» и выполнять перечисление по коллекции участников, тестировать каждого члена на предмет «пользователя или группы», а затем рекурсивно переходить во вложенные группы. Это медленно, и вам не следует этого делать, кроме как в качестве упражнения в программировании на VBScript.

В конечном итоге вы, вероятно, захотите научиться делать это с помощью прямого запроса LDAP. Это достигается через LDAP_MATCHING_RULE_IN_CHAIN оператор. Этот оператор может быть трудным в использовании и может быть ОЧЕНЬ ДОРОГО на DC, если у вас есть глубокая структура вложенности для ваших групп. Бонус для этого метода заключается в том, что для очень больших групп (по умолчанию более 1500 членов) вы сможете выполнять запросы для пользователей, которые являются членами группы (даже косвенно), вместо того, чтобы извлекать группу и пытаться прочитать атрибут члена (который должен быть обрабатывается специальным методом для «больших» групп. то есть вы получаете отчет об объектах пользователя, который превосходит отдельный объект группы, в котором вы пытаетесь прочитать большой массив attrbiute.

(&(objectCategory=person)(objectClass=user)(memberof:1.2.840.113556.1.4.1941:=(cn=Group1,OU=groupsOU,DC=x)))

Если у вас проблемы с «большими» группами, вы также можете увеличить лимит, который AD использует при ограничении доступа к атрибуту .member.

Третий синтаксис отлично работает в LDP.EXE для одного из моих доменов. Я обычно не помещаю туда (objectCategory = person), но он тоже отлично работает с ним.

Какого рода ошибку вы получаете, когда пытаетесь использовать это?

Я думал, что вопрос в том, чтобы найти ВСЕХ пользователей группы А, а не выяснить, является ли пользователь частью группы А?

если вы хотите найти всех членов группы, используйте

dsquery group -name "MyGroup" | dsget group -member

И если вы хотите найти вложенные члены, также используйте

dsquery group -name "MyGroup" | dsget group -member -expand

Если членов больше 1000 или 1500, dsquery может не дать результатов, в этом случае используйте adfind.exe из joeware.net

ADFIND -f "&(objectcategory=group)(cn=MyGroup)" member 

Работал в течение нескольких дней, пытаясь создать сценарий, который извлекал бы из файла, содержащего список пользовательских DN, и анализировал их атрибуты. Зашел на ваш сайт с ответом JFV, и у вас случился сердечный приступ. Вот сценарий, который я создал из ответа JFV. В принципе, зачем читать из файла, когда вы можете извлекать его напрямую из группы (пока нет перехвата ошибок) ... Этот сценарий позволяет мне вытаскивать текстовый файл в Excel или другое приложение для работы с электронными таблицами и разграничивать каналы. На этом этапе я могу выполнять все, что захочу. Просто думал, что другие могут выиграть от моей потери. :-(

Dim objGroup

Dim objUser

on error resume next

'Create a file and write headers
Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.CreateTextFile ("lastpassword.txt")

f.WriteLine "firstName|initials|lastName|userPrincipalName|physicalDeliveryOfficeName|sAMAccountName|mail|cn|description|mobile|telephoneNumber|physicalDeliveryOfficeName|department|facsimileTelephoneNumber|pager"

'Search for a group name in AD and parse information to a file in pipe delimination

   Set objGroup = Getobject ("LDAP: //CN=groupname,OU=GROUPS,DC=FQDN,DC=FQDN,DC=FQDN")

   For Each objUser In objGroup.Members

      f.WriteLine objUser.firstName & "|" & _

            objUser.initials & ".|" & _

            objUser.lastName & "|" & _

            objUser.userPrincipalName & "|" & _

            objUser.physicalDeliveryOfficeName & "|" & _

            objUser.sAMAccountName & "|" & _

            objUser.mail & "|" & _

            objUser.cn & "|" & _

            objUser.description & "|" & _

            objuser.mobile & "|" & _

            objuser.telephoneNumber & "|" & _

            objuser.physicalDeliveryOfficeName & "|" & _

            objuser.department & "|" & _

            objuser.facsimileTelephoneNumber & "|" & _

            objuser.userAccountControl & "|" & _

            objUser.PasswordLastChanged

   Next

f.close

Вот что я использовал через VBScript:

Перечисление пользователей

   Dim objGroup
   Dim x 

   Set objGroup = Getobject ("LDAP: //CN=LocalGrp,OU=Staff, DC=net, DC=dom")
   For Each x In objGroup.Members
      WScript.Echo x.Class
      WScript.Echo x.Name
      WScript.Echo x.ADsPath
      WScript.Echo x.distinguishedName + vbCrLf
   Next

Проще всего это сделать в PowerShell с помощью командлетов Quest AD -

get-QADGroupMember [groupname]

Затем фильтруйте и сортируйте!

get-QADGroupMember [groupname] | where {$_.[Property] -like [criteria]} | sort-object

KAPes, вы отвечаете на вопрос, который меня интересует, перечислите всех членов группы A. Однако ваш пример команды не работает, так как "member" должно быть во множественном числе, -members. Чтобы перечислить всех членов группы Active Directory в красиво отформатированной таблице имени входа, отображаемого имени и адреса электронной почты (все в одной строке):

dsget group "CN=Group A,OU=DepartmentB,OU=Users and Groups,DC=my,DC=domain,DC=com" -members | dsget user -samid -display -email

Больше информации: http://technet.microsoft.com/en-us/library/cc755876%28WS.10%29.aspx#BKMK_group