ASP: чтение Scripting.Dictionary с результатом ADODB.Command

Я пытаюсь запросить userAccountControl из Active Directory и сопоставить его со словарем, который я настроил в своем скрипте.

Прежде всего я настраиваю свой словарный объект и заполняю его:

dim uac
Set uac=Server.CreateObject("Scripting.Dictionary")
uac.add "512", "Enabled Account"
uac.add "514", "Disabled Account"
uac.add "544", "Enabled, Password Not Required"
uac.add "546", "Disabled, Password Not Required"
uac.add "66048", "Enabled, Password Doesn't Expire"
uac.add "66050", "Disabled, Password Doesn't Expire"
uac.add "66080", "Enabled, Password Doesn't Expire & Not Required"
uac.add "66082", "Disabled, Password Doesn't Expire & Not Required"
uac.add "262656", "Enabled, Smartcard Required"
uac.add "262658", "Disabled, Smartcard Required"
uac.add "262688", "Enabled, Smartcard Required, Password Not Required"
uac.add "262690", "Disabled, Smartcard Required, Password Not Required"
uac.add "328192", "Enabled, Smartcard Required, Password Doesn't Expire"
uac.add "328194", "Disabled, Smartcard Required, Password Doesn't Expire"
uac.add "328224", "Enabled, Smartcard Required, Password Doesn't Expire & Not Required"
uac.add "328226", "Disabled, Smartcard Required, Password Doesn't Expire & Not Required"

Затем я подключаюсь к своему Active Directory, чтобы запросить его:

Set objDomain = GetObject ("GC://RootDSE")
objADsPath = objDomain.Get("defaultNamingContext")
Set objDomain = Nothing
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.provider ="ADsDSOObject"
objConn.Properties("User ID") = "domain\administrator"
objConn.Properties("Password") = "password"
objConn.Properties("Encrypt Password") = True
objConn.open "Active Directory Provider"
Set objCom = CreateObject("ADODB.Command")
Set objCom.ActiveConnection = objConn
objCom.CommandText ="select name,userAccountControl FROM 'GC://"+objADsPath+"' where sAMAccountname='*' and objectCategory='user' and objectCategory='person' ORDER by sAMAccountname"

Затем я перебираю результаты примерно так:

Set objRS = objCom.Execute
Do While Not objRS.EOF Or objRS.BOF
Response.Write objRS("name")
set uacResult = objRS("userAccountControl")
objRS.MoveNext
Response.Flush
Loop
objRS.Close
objConn.Close
Set objRS = Nothing
Set objConn = Nothing
Set objCom = Nothing
Set objADsPath = Nothing
Set objDomain = Nothing

Это все работает абсолютно нормально. Что я хочу сделать сейчас, это запросить словарь UAC, который я создал, используя результат из objRS("userAccountControl"). Когда я пытаюсь сделать это, он возвращает пустое значение?

set uacResult = objRS("userAccountControl")
Response.Write uac.Item(uacResult)
Response.Write " (" & uacResult & ")"

Я в тупике - значение objRS возвращается в виде строки?? Это работает, если я делаю Response.Write uac.Item("512"), но не если я делаю Response.Write uac.Item(uacResult)

Есть идеи?

2 ответа

Решение

Вы уже нашли правильное решение, но я хочу объяснить, что здесь происходит.

Ключи Dictionary Объект может быть любого типа, кроме массивов (см. документы). Так как вы использовали Set оператор, переменная uacResult является ссылкой на объект (подробнее об этом позже). Когда вы звоните Item метод на Dictionary, он на самом деле ищет ключ, который соответствует ссылке на объект, а не ищет строку, как вы ожидали. CStr() исправляет это путем явного преобразования ссылки на объект в строку.

Так как вы использовали Set Ключевое слово в своем назначении, uacResult в конечном итоге содержит ссылку на Field объект, так как свойство по умолчанию Recordset объект является Fields коллекция. Когда вы звоните CStr(uacResult) это преобразование объекта в строку путем вызова свойства по умолчанию Field объект, который является Value имущество. Вы можете достичь того же эффекта несколькими разными способами:

' method 1 - from accepted answer (https://stackru.com/a/17786308/249624)
set uacResult = objRS("userAccountControl")
Response.Write uac.Item(CStr(uacResult))

' method 2 - explicitly using the Value property
set uacResult = objRS("userAccountControl")
Response.Write uac.Item(uacResult.Value)

' method 3 - make uacResult a string instead of a Field object
uacResult = objRS("userAccountControl")
Response.Write uac.Item(uacResult)

' method 4 - same as method 3, but explicitly use the Value property
uacResult = objRS("userAccountControl").Value
Response.Write uac.Item(uacResult)

Нашел это!!

Мне нужно было преобразовать objRS("userAccountControl") в строку с помощью CStr().

Это работает:

set uacResult = objRS("userAccountControl")
Response.Write uac.Item(CStr(uacResult))
Response.Write " (" & uacResult & ")"
Другие вопросы по тегам