您好,SA。您知道,身为脚本专家最大的一个好处就是我们不必知道自己在谈论什么;因此无论您向我们询问什么,只要我们能编写出相应的脚本就皆大欢喜了。例如:检索拥有备选接收方的所有用户的列表。坦白地讲,我们对备选接收方也仅有个模糊的概念,认为它是表示转发 Microsoft Exchange 电子邮件地址的备选位置。我们知道的就这些,并且我们也说过,就这些我们甚至都不敢保证是正确的。但是不要紧;毕竟,只要我们所展示的脚本能够返回拥有备选接收方的所有用户的列表,就不会有人计较我们在这方面的知识匮乏。
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, altRecipient FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _
"AND altRecipient='*'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value, objRecordSet.Fields("altRecipient").Value
objRecordSet.MoveNext
Loop
和您看到的一样,此脚本仅搜索 Active Directory,查找拥有备选接收方的所有用户。同往常一样,我们不会讨论搜索 Active Directory 的细节;因为那超出了本专栏所涵盖的范围。不过别担心:我们决不会让您对 Active Directory 搜索脚本的工作方式疑惑不解。如果您需要(或想要)有关 Active Directory 搜索脚本潜在原则的详细信息,请查看由两部分组成的脚本的故事系列文章伙计:我的打印机在哪里?
不,谢谢您。不管怎么说,是您免去了我们撰写一篇专栏文章的工作,因为如果您确实想知道其中的原委,只要去查一下某个相关的专栏就可以了,根本没有再写类似一篇专栏文章的必要!(编辑附注:这段话暗示您在这个问题上还可以选择。如果您感到奇怪 - 不必这样。也是,如果您连这都感到奇怪,那脚本编辑今天可就有事情做了。)
今天我们所要关注的是返回拥有备选接收方的所有用户的列表的实际查询。正如 SA 所说,备选接收方的 Active Directory 属性名为 altRecipient;要获取拥有备选接收方的用户列表,我们需要对已设置了 altRecipient 属性的所有用户帐户进行搜索。执行该操作的查询如下所示:
objCommand.CommandText = _ "SELECT Name, altRecipient FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user' " & _ "AND altRecipient='*'"
此处我们所做的就是从 fabrikam.com 域中检索两个属性值 - Name 和 altRecipient。更为重要的是,我们仅检索以下两个条件均满足的 Active Directory 对象的值:
| • |
objectCategory 等于 user。这确保我们只得到拥有备选接收方的用户帐户。其他的对象会拥有备选接收方吗?我们不太确定,因此我们决定还是稳妥为好,从而不会得到除用户帐户之外的任何其他东西。 |
| • |
altRecipient 具有值。为此,我们使用通配符语法:altRecipient=’*’。和您猜的一样,搜索 Active Directory 时,星号表示任意字符或字符集。通过使用星号,我们可以要求脚本返回 altRecipient 具有任意值的所有用户帐户;值是什么没关系,只要有就行。 |
您知道,有个问题非常好。如果星号意味着“为我们显示 altRecipient 具有值的所有用户帐户”,难道这不意味着我们会得到所有用户帐户,甚至那些没有备选接收方的用户帐户吗?正如脚本专家以前多次对您讲过的那样,仅仅是因为值为空并不意味着没有值而已。
实话告诉您吧,我们告诉过人们很多事情;您总不能指望我们记得我们说过的每一件事,对吧?但您说对了:如果用户的 altRecipient 属性值为空,则在搜索中将显示该用户。很有可能您的用户之中没有任何一位的 altRecipient 属性为空;不过,没有备选接收方的用户其 altRecipient 值应为 Null(该值恰好为默认值)。与空格或空字符串 ("") 不同,Null 值才确实意味着没有任何值;altRecipient 值为 Null 的用户将不会显示在搜索结果中。
|
注意:我们也不会对此处您所产生的疑惑置之不理。关于设置 Active Directory 属性值为 Null 的详细信息,请查阅这个备受爱戴的您好,脚本专家!专栏。
说得好:所有的您好,脚本专家!专栏都是备受爱戴的,是吗? |
执行查询之后,我们得到了包含拥有备选接收方的所有用户的记录集。然后我们需要做的就是编写一个 Do Until 循环来遍历此集合,并回显 Name 和 altRecipient 属性值:
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("Name").Value, objRecordSet.Fields("altRecipient").Value
objRecordSet.MoveNext
Loop
就这么简单。(设想一下,如果我们真的知道自己在做什么,我们脚本专家为您展示的东西该有多酷!)