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

Я пытаюсь получить список пользователей 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, используйте цикл For, чтобы пройти и вернуть имена полей.

user692942 08.04.2019 14:30

Единственный предмет коллекции objRecordSet.Fields это objectGUID

fasborn 08.04.2019 15:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Важно отметить, что вы делаете дополнительный сетевой запрос там, где вам это не нужно. Сначала я расскажу о поиске.

Все имена полей, которые вы получаете в результате поиска, находятся в 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, для пример.

fasborn 08.04.2019 16:27

Что говорит ошибка? Кроме того, он будет возвращать только атрибуты со значениями. Имеет ли department значение для объекта, на который вы смотрите?

Gabriel Luci 08.04.2019 16:38

Я пробую это сам. Очевидно, использование ;; не работает. Я посмотрю, смогу ли я понять это. Прошло некоторое время с тех пор, как я использовал VBScript для этого. На любом другом языке вы просто не говорите ему, какие атрибуты вам нужны, и он вернет все. В идеале вы должны сказать ему, какие атрибуты вам нужны, так как это всегда будет быстрее.

Gabriel Luci 08.04.2019 16:49

Ошибка 80040E14 с текстом One or more errors occurred during processing of command. происходит в строке Set objRecordSet = objCommand.Execute. Я думаю, вы правы, и объект первый в списке, который я тестирую с помощью своего кода, вероятно, не имеет department. Позже я могу проверить каждый атрибут для каждого объекта и собрать полный список атрибутов.

fasborn 08.04.2019 16:56

Да, я не могу найти способ получить все атрибуты в VBScript. Странный. Вы можете сделать это везде: PowerShell, .NET и т. д. Я удалил эту часть своего ответа.

Gabriel Luci 08.04.2019 17:00

Другие вопросы по теме