#vbscript #active-directory #ldap #ado
#vbscript #active-directory #ldap #ado
Вопрос:
Я пытаюсь получить список пользователей Active Directory (AD) (и связанную с ними информацию) с помощью VBScript. Проблема в том, что я не знаю, как получить полный список полученных столбцов.
Я попытался посмотреть (с помощью отладчика Visual Studio 2017), что находится внутри ответа (объект «objUser»), но отладчик показывал только точки.
Основной набор:
Set objCommand = CreateObject("ADODB.Command")
strQuery = "<LDAP://" strDNSDomain ">;(amp;(amp;(objectCategory=person)(objectSid=*)(!samAccountType:1.2.840.113556.1.4.804:=3)));objectGUID;subtree"
objCommand.CommandText = strQuery
Set objRecordSet = objCommand.Execute
обрабатывается в цикле
Do Until objRecordSet.EOF
strLine = ""
arrbytGuid = objRecordSet.Fields("objectGUID")
strDN = "<GUID=" OctetToHexStr(arrbytGuid) ">"
Set objUser = GetObject("LDAP://" amp; strDN)
If (Not IsNull(objUser.SAMAccountName)) Then
strLine = CStr(objUser.SAMAccountName)
End If
objRecordSet.MoveNext
Loop
Я хочу понять, какие еще столбцы есть в «objUser», кроме «sAMAccountName».
Комментарии:
1. Посмотрите на
objRecordSet.Fields
коллекцию, используйтеFor
цикл для просмотра и возврата имен полей.2. Единственным элементом
objRecordSet.Fields
коллекции являетсяobjectGUID
Ответ №1:
Важно отметить, что вы делаете дополнительный сетевой запрос, в котором нет необходимости. Сначала я расскажу о поиске.
Все имена полей, которые вы получаете при поиске, находятся в objRecordSet.Fields
. Вы видите только objectGUID
потому, что это все, что вы просили.
;objectGUID;
В вашем запросе вы перечисляете (через запятую) атрибуты, которые вы хотите вернуть.
После этого происходит дополнительный сетевой запрос:
Set objUser = GetObject("LDAP://" amp; strDN)
Вы привязываетесь к объекту напрямую, только с целью чтения атрибутов. Более конкретно, как только вы получаете доступ к свойству ( objUser.SAMAccountName
), оно переходит в AD и загружает атрибуты. И здесь применяется тот же принцип: если вы специально не укажете, какие атрибуты вам понадобятся, он загрузит каждый атрибут со значением. Это замедлит ваш цикл, и вам не нужно этого делать, поскольку вы можете прочитать все, что вам нужно, из вашего поиска.
Вместо этого заставьте поиск вернуть все, что вам нужно. Если вам sAMAccountName
тоже нужно, добавьте его : ;objectGUID,sAMAccountName;
.
Единственная причина привязки непосредственно к объекту после поиска — это если вам нужно его обновить.
Но чтобы конкретно ответить на заданный вами вопрос, вот как вы можете увидеть, какие атрибуты имеет объект после привязки непосредственно к нему с помощью GetObject()
:
Set objUser = GetObject("LDAP://" amp; strDN)
objUser.GetInfo() 'Retrieve all attributes with a value
For I = 0 To objUser.PropertyCount - 1
Set pEntry = objUser.Item(I)
Wscript.Echo pEntry.Name
Next
Комментарии:
1. Спасибо за ваши ответы! Я попробовал оба варианта: когда я изменил
;objectGUID;
на;;
instrQuery
, я получил ошибку 🙁 ; когда я попытался просмотреть атрибуты, я получил список и заметил странную вещь — список не содержал некоторых атрибутов, которые я запрашивал ранееDepartment
, например.2. Что говорит ошибка? Кроме того, он будет возвращать только атрибуты со значениями. Есть ли
department
значение для объекта, на который вы смотрите?3. Я пробую это сам. По-видимому, использование
;;
не работает. Я посмотрю, смогу ли я это выяснить. Прошло некоторое время с тех пор, как я использовал VBScript для этого. На любом другом языке вы просто не указываете, какие атрибуты вам нужны, и он вернет все. В идеале, вы должны указать ему, какие атрибуты вы хотите в любом случае, поскольку это всегда будет быстрее.4. Ошибка
80040E14
с текстомOne or more errors occurred during processing of command.
возникает в строкеSet objRecordSet = objCommand.Execute
. Я думаю, вы правы, и первый объект в списке, который я тестирую с помощью своего кода, вероятно, не имеетdepartment
. Позже я могу проверить каждый атрибут для каждого объекта и собрать полный список атрибутов.5. Да, я не могу найти способ получить все атрибуты в VBScript. Странно. Вы можете сделать это везде: PowerShell, .NET и т.д. Я удалил эту часть своего ответа.