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 & ")"