
大多数情况下,我们从来不会将计算机误认为用户,也不会将用户误认为计算机。(嗯,Mary Ellen 也许是在会计部工作。不过事实并非如此,而且永远也不会那样。)
但遗憾的是,我们的脚本似乎相当不易于辨别:看起来脚本认为用户和计算机之间没有区别。我们是如何知道这些的呢?嗯,当我们最终开始从 Windows NT 4.0 转换为 Windows Server 2003 时,我们建立了一个 Active Directory 测试域。作为测试流程的一部分,我们创建了一些用户帐户和一些计算机帐户;特别是,我们创建了下面的帐户:
帐户名 | 帐户类型 |
atl-ws-01 | Computer |
atl-ws-02 | Computer |
Ken Myer | User |
Pilar Ackerman | User |
至此不会有什么问题。因为脚本专家曾告诉我们脚本是管理 Active Directory 的非常有用的工具,因此我们坐下来写些脚本试一试我们的测试域。我们假定其中一个脚本非常有用;此脚本可返回域中的所有用户帐户列表:
On Error Resume Next
Const ADS_SCOPE_SUBTREE = 2
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
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 objectClass='user'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value
objRecordSet.MoveNext
Loop
正如我们所说的那样,我们假定此脚本非常有用;遗憾的是,结果却并非确实如此。为什么?嗯,下面是我们运行脚本后所返回的项目,它是一个用于返回域中所有用户帐户列表的脚本(我们提醒您):
atl-ws-01 atl-ws-02 Ken Myer Pilar Ackerman
如您所见,我们确实返回了所有用户帐户列表;但是,我们也返回了所有计算机帐户列表。我们曾认为这样没问题;显然 Active Directory 只是无法区分用户帐户和计算机帐户。这确实是高见;但却是完全错误的。我们修改了脚本使它只返回计算机帐户,然后将其重新运行。重新运行后我们返回 … 只有计算机帐户:
atl-ws-01 atl-ws-02
显然,计算机就是用户,而用户却不是计算机。这看起来并不公平(尤其是对 Mary Ellen 而言);而且,它看起来也不正确。
这个脚本的问题到底出在哪儿?