您好,PT。不知对此有何高见?本专栏的忠实读者(双方)都知道,我们通常喜欢解答涉及搜索 Active Directory 的问题。为什么呢?很简单:因为我们并非真正回答这些问题。而仅仅是挖空心思弄出一个脚本,然后并不解释该脚本的工作原理,而是告诉人们,要获取详细信息,请阅读由两部分组成的系列文章 Dude, Where’s My Printer?(英文)。如您所见,这样在办公室里度过一天将是多么美好而又轻松!
但是您的问题却不同:这对我们来说真是太不幸了,在我们关于搜索 Active Directory 的系列文章中,并未在任何地方提到过指定替代凭据。这意味着我们将不得不真正地回答这个问题了。真叫不公平:我们不仅得来工作,而且现在还要求我们呆在这里实际做点什么!
相信我们:这不是美国人的行事方式。
那我们就要和您做个交易:我们将回答您的问题,但仅仅集中于指定替代凭据的脚本部分。如果您需要有关代码其余部分的详细信息,或者需要有关搜索 Active Directory 的详细信息,请参阅由两部分组成的系列文章 Dude,我的打印机在哪儿?(英文)
伙计,要是每次我们说到这个的时候能得到一美元该多好啊。
下面的脚本将使用替代凭据来搜索 Active Directory:
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Properties("User ID") = "fabrikam/kenmyer"
objConnection.Properties("Password") = "A2sXrco1Fq1#om!"
objConnection.Properties("Encrypt Password") = TRUE
objConnection.Properties("ADSI Flag") = 3
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
objCommand.CommandText = _
"SELECT Name FROM 'LDAP://DC=fabrikam,DC=com' WHERE " _
& "objectCategory='user'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
如我们所说,今天我们将集中讨论下面这四行代码,就是用于指定替代凭据的那四行代码:
objConnection.Properties("User ID") = "fabrikam/kenmyer"
objConnection.Properties("Password") = "A2sXrco1Fq1#om!"
objConnection.Properties("Encrypt Password") = TRUE
objConnection.Properties("ADSI Flag") = 3
请注意,仅当要以替代凭据进行搜索时才需要这四行代码;也就是说,仅当要使用登录到 Windows 时所使用的用户帐户以外的帐户绑定到 Active Directory 时才需要。如果要使用当前的登录凭据进行搜索,则您只需删除这四行代码,该脚本便可以正确运行。
正如您可能会提到的那样(对象引用 objConnection 是个该死的泄密者),这四行代码涉及 ADO(ActiveX 数据对象)Connection 对象的四个属性。属性 User ID 和 Password 应该是不言而喻的:它们只不过是绑定到 Active Directory 时所要使用帐户的用户名和密码。本例中,我们已使用 domain/user name 语法指定了 User ID。不过,我们还可将用户名指定为登录名本身(例如,kenmyer),或者指定为用户的 UPN(通用主体名称):kenmyer@fabrikam.com。这完全取决于您。
至于密码,出于教学目的,我们采用硬编码方式将该密码写入到脚本中。不过,不用说,这并非我们建议您采取的方式。相反,您可能应使该脚本在每次运行时提示您输入密码。如果不确定该怎么做,那么好吧,别担心:按照我们的老习惯,我们将仅指点您到别处去找答案。(就此而言,是指以前的一个关于提示输入密码以及屏蔽密码的“您好,脚本专家!”专栏。)
这样我们就只剩下两个属性要处理了。将 Encrypt Password 设置为 True 只不过是告诉脚本,在网络上发送密码时要对其进行加密;默认情况下,此值设置为 False。同时,ADSI Flag 属性是一个用于指定验证选项的 bitmask 属性。值 3 实际上是一个由两个单独属性组成的 bitmask 值:
|
常量 |
值 |
说明 |
|
ADS_SECURE_AUTHENTICATION |
1 |
请求安全验证。设置此标志后,Active Directory 将使用 Kerberos,也可能是 NTLM,来验证客户端。 |
|
ADS_USE_ENCRYPTION |
2 |
要求 ADSI 对网络上的数据交换使用加密。 |
可在 ADSI SDK 中找到有关 ADSI Flag 属性的详细信息。
这就是您需要做的一切:为这 4 个属性配置适当的值便可以了。
现在,如果您不介意,我们需要休息一下。归根结底,我今天工作时最不愿意做而又不得不做的还是工作!