2014-11-27 3 views
0

У меня есть макрос в Excel, который я периодически использую, чтобы вытащить детали членов группы в Active Directory. Он отлично работает для каждой группы, которую я пробовал, но я столкнулся с одной группой, на которой я просто не могу получить данные.Запрос LDAP не может найти определенную группу в Active Directory

Соответствующий бит сценария ниже:

Set rootDSE = GetObject("LDAP://[MyDomain.co.uk]/RootDSE") 
DomainContainer = rootDSE.Get("defaultNamingContext") 

Set conn = CreateObject("ADODB.Connection") 
conn.Provider = "ADSDSOObject" 
conn.Open "ADs Provider" 


Set command = CreateObject("ADODB.Command") 
Set command.ActiveConnection = conn 
command.Properties("Page size") = 200 

groupDistinguisedName = "CN=[Group Name],OU=xxx,OU=xxx,DC=MyDomain,DC=co,DC=uk" 
command.CommandText = "<LDAP://" & DomainContainer & ">;(distinguishedName=" & groupDistinguisedName & ");member;subtree" 

Set rs = command.Execute 

On Error Resume Next 
dataVal = rs.Fields("member").Value 

Я попытался запустить скрипт с именем группы, что не существует и сценарий ведет себя по-другому - dataVal устанавливается в Пусто, если группа не существует, но установлена ​​в Null для группы У меня проблемы с, так что, похоже, что она нашла группу, но каким-то образом не может получить членов группы.

Я пробовал вырезать и вставлять отличительное имя непосредственно из Active Directory в командную строку LDAP, поэтому я знаю, что это не опечатка имени. Эта группа - большая группа с большим количеством участников, но я тоже пробовал другие большие группы. Я просто не вижу, что может вызвать проблему. Есть идеи?

ответ

1

Атрибут «член» не включает членов для первичного членства в группах.
, например. Группа «Пользователи домена» может иметь много членов, но ее атрибут «член» может быть пустым.

Для проверки принадлежности к первичной группе используйте primaryGroupToken (группу) и атрибут primaryGroupId (user).

  • Получить значение атрибута primaryGroupToken из группы
    (Обратите внимание, что primaryGroupToken является построенный атрибут)
  • Поиск в ЖЕ DOMAIN для всех пользователей, имеет то же значение в primaryGroupId

например Группа «Пользователи домена» имеет значение 513 в primaryGroupToken. Это означает, что любые объекты-пользователи в в том же домене, чьи primaryGroupId = 513 являются членами этой группы «Пользователи домена».

Другие комментарии:

  • Вы уже знаете DN и сервер. Почему бы не позвонить по телефону GetObject("LDAP://[MyDomain.co.uk]/" & groupDistinguisedName), чтобы получить группу? Значок отличительного имени не индексируется. Запрос может быть медленным в большом env.
  • Если в атрибуте «член» есть> 1500 (настраиваемых) элементов, вам необходимо использовать поиск диапазона. В противном случае вы получите только 1500.
+0

Мой VBScript не так уж хорош, поэтому макрос, который я использую, с тех пор связан с различными источниками из разных источников. Атрибут primaryGroupToken не полезен в моем случае, так как мне нужно перечислить членов любой группы, а не только основную группу. Я хотел бы посмотреть, как использовать GetObject, как было предложено, если бы вы могли предоставить мне более подробную информацию (хотя производительность пока не была проблемой). Поиск диапазона - это именно та проблема, с которой я столкнулся - атрибут * members * был нулевым, потому что было более 1500 членов. Спасибо! – paulH

+0

Пожалуйста, проверьте это [ссылка] (http://msdn.microsoft.com/en-us/library/aa746518 (v = vs.85) .aspx) для того, как выполнять поиск Range в VB. – baldpate

+0

Кроме того, теоретически, чтобы показать всех членов группы, вам нужно будет проверить как основную группу, так и «нормальную» группу. Это означает, что вы не можете получить первичные члены группы из атрибута «member» или наоборот. Но в большинстве случаев только некоторые специальные группы (например, пользователи домена) имеют первичный член группы. Вы можете обрабатывать оба или опустить членство в первичной группе на основе вашего варианта использования. – baldpate

Смежные вопросы