问:
您好,脚本专家!如何计算某个域中的计算机数?
-- TN
答:
您好,TN。为您讲一个真实的故事。大约 5 年前,有一个脚本专家刚来 Microsoft 时,他所在的小组(可能不是公司内技术最精湛的小组)需要计算公司内所有计算机的数目。他们是如何完成上述任务的呢?嗯,与您设想的完全一致:他们将软盘分发给每个人。在这张软盘上有一个批处理文件,该文件可获取计算机名称并将其写入到该磁盘中。告诉大家将该磁盘放到他们各自所用计算机的软盘驱动器中,然后运行批处理文件。在那周的晚些时候,IT 部的人又来了一次,拿走了所有磁盘,大概还整理了获取计算机台数所需的所有信息。
如前所述,我们的小组可能不是公司内技术最精湛的小组。或者在别的地方也是如此。
不可否认,这种行为难以效仿。虽然我们不敢声称已经想出了像将软盘分发给您的所有用户这样的极具创造力的想法,但下面的脚本(可能看起来很普通并缺乏想象力)可为您计算出域内所有计算机(或者,至少是所有计算机帐户)的数量:
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 objectCategory='computer'" Set objRecordSet = objCommand.Execute Wscript.Echo objRecordSet.RecordCount
什么?是的,这是一个可搜索 Active Directory 的脚本。是的,这的确意味着,今天我们将不对脚本的详细内容做出解释;如果您需要了解有关搜索 Active Directory 的一些背景信息,我们建议您查阅由两部分组成的脚本的故事系列文章伙计,我的打印机在哪里?。是的,这也就意味着 - 请稍等一下:到底谁在写这个专栏?
注意:坦白地讲,我们愿意让您来编写本专栏。但如果我们不来编写本专栏,Microsoft 将不得不找一些其他事情让我们做,我们不希望往返于各个办公室之间来收集软盘! |
正如您可能要指出的那样,尽管这是一个 Active Directory 搜索脚本,不过,它实际上比大多数类似的脚本要简单些。例如,我们的 SQL 命令是相当简练的:我们仅编写一个查询,该查询可返回其 objectCategory 等于 computer 的所有对象的集合:
objCommand.CommandText = _ "SELECT Name FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer'"
定义完该查询后,我们调用 Execute 方法,该方法可返回由在域内找到的所有计算机帐户组成的记录集。此时,我们通常会构建一个 Do 循环以遍历集合中的所有项目(即,域内的所有计算机)并回显在我们的查询中指定的所有属性。但是,对于此脚本,我们完全不必这么做。为什么不必呢?是这样,我们需要的只是计算机的台数。事实上,ADO(ActiveX 数据对象)记录集都有一个名为 RecordCount 的属性,该属性可为您指出集合中的项目数。想知道记录集中有多少条记录(进一步说,就是为您指出域内有多少台计算机)?您要做的所有事情就是回显 RecordCount 属性的值:
Wscript.Echo objRecordSet.RecordCount
就是这样。正如我们前面所说的那样,它有点乏味。不过,它的确为您节省了不少钱,但不是在车辆保险方面。而是在软盘方面。Sheesh。