Есть ли какой-либо способ получить список столбцов из ответа на запрос команды ADO?

#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; на ;; in strQuery , я получил ошибку 🙁 ; когда я попытался просмотреть атрибуты, я получил список и заметил странную вещь — список не содержал некоторых атрибутов, которые я запрашивал ранее 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 и т.д. Я удалил эту часть своего ответа.