1

Я пытаюсь запросить userAccountControl из Active Directory и сопоставить его со словарем, который я установил в своем скрипте.ASP: Чтение Scripting.Dictionary с ADODB.Command Результат

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

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" 

Тогда I цикл по результатам, как так :

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

I'm stumped - значение objRS, возвращаемое как строка ?? Он работает, если я выполняю Response.Write uac.Item («512»), но нет, если я выполняю Response.Write uac.Item (uacResult)

Любые идеи?

ответ

1

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

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

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

' method 1 - from accepted answer (https://stackoverflow.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) 
+0

Спасибо - очень понятно и кратким :) –

1

Обнаружено это!

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

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

set uacResult = objRS("userAccountControl") 
Response.Write uac.Item(CStr(uacResult)) 
Response.Write " (" & uacResult & ")" 
Смежные вопросы