Я пытаюсь получить список пользователей Active Directory (AD) (и соответствующую информацию), используя VBscript. Проблема в том, что я не знаю, как получить полный список полученных столбцов.
Я пытался посмотреть (с помощью отладчика Visual Studio 2017), что находится внутри ответа (объект "objUser"), но отладчик показал только точки.
Основной набор:
Set objCommand = CreateObject("ADODB.Command")
strQuery = "<LDAP://" + strDNSDomain + ">;(&(&(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://" & strDN)
If (Not IsNull(objUser.SAMAccountName)) Then
strLine = CStr(objUser.SAMAccountName)
End If
objRecordSet.MoveNext
Loop
Я хочу понять, какие еще столбцы есть в «objUser», кроме «SAMAccountName».
Единственный предмет коллекции objRecordSet.Fields
это objectGUID
Важно отметить, что вы делаете дополнительный сетевой запрос там, где вам это не нужно. Сначала я расскажу о поиске.
Все имена полей, которые вы получаете в результате поиска, находятся в objRecordSet.Fields
. Вы видите только objectGUID
, потому что это все, что вы просили.
;objectGUID;
в вашем запросе вы перечисляете (через запятую) атрибуты, которые хотите вернуть.
Дополнительный сетевой запрос происходит после этого:
Set objUser = GetObject("LDAP://" & strDN)
Вы привязываетесь к объекту напрямую, только для чтения атрибутов. В частности, как только вы получаете доступ к свойству (objUser.SAMAccountName
), оно переходит в AD и загружает атрибуты. И здесь применяется тот же принцип: если вы специально не укажете, какие атрибуты вам нужны, он загрузит значение каждого атрибута. Это замедлит ваш цикл, и вам не нужно этого делать, так как вы можете прочитать все, что вам нужно, из вашего поиска.
Вместо этого заставьте поиск возвращать все, что вам нужно. Если вам тоже нужен sAMAccountName
, добавьте его: ;objectGUID,sAMAccountName;
.
Единственная причина для прямой привязки к объекту после поиска — это необходимость его обновления.
Но чтобы конкретно ответить на заданный вами вопрос, вот как вы можете увидеть, какие атрибуты имеет объект после прямой привязки к нему с помощью GetObject()
:
Set objUser = GetObject("LDAP://" & 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
Спасибо за ваши ответы! Я попробовал оба варианта: когда я изменил ;objectGUID;
на ;;
в strQuery
, я получил ошибку :( ; когда я попытался увидеть атрибуты, я получил список и заметил странную вещь - в списке не было некоторых атрибутов, которые я запросил ранее, Department
, для пример.
Что говорит ошибка? Кроме того, он будет возвращать только атрибуты со значениями. Имеет ли department
значение для объекта, на который вы смотрите?
Я пробую это сам. Очевидно, использование ;;
не работает. Я посмотрю, смогу ли я понять это. Прошло некоторое время с тех пор, как я использовал VBScript для этого. На любом другом языке вы просто не говорите ему, какие атрибуты вам нужны, и он вернет все. В идеале вы должны сказать ему, какие атрибуты вам нужны, так как это всегда будет быстрее.
Ошибка 80040E14
с текстом One or more errors occurred during processing of command.
происходит в строке Set objRecordSet = objCommand.Execute
. Я думаю, вы правы, и объект первый в списке, который я тестирую с помощью своего кода, вероятно, не имеет department
. Позже я могу проверить каждый атрибут для каждого объекта и собрать полный список атрибутов.
Да, я не могу найти способ получить все атрибуты в VBScript. Странный. Вы можете сделать это везде: PowerShell, .NET и т. д. Я удалил эту часть своего ответа.
Посмотрите на коллекцию
objRecordSet.Fields
, используйте циклFor
, чтобы пройти и вернуть имена полей.