Вот что не пока работают;
(& (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))
Для этого типа запроса необходимо учитывать несколько моментов:
Вы всегда должны включать "(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