您好,CW。您要知道,这个问题提得非常好。实际上,我们本应该将其用于 Winter Scripting Games(英文)中。啊,不过,经过再三考虑,也许我们不使用它反倒是一件好事。为什么?嗯,因为所有“脚本编写比赛”选手都可以在这里找到答案:
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
strUser = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUser)
strDN = objUser.distinguishedName
arrDN = Split(strDN, ",")
For i = 0 to UBound(arrDN)
intLength = Len(arrDN(i))
intCounter = intLength - 3
arrDN(i) = Right(arrDn(i), intCounter)
Next
For i = 1 to UBound(arrDN) - 1
strNewName = strNewName & arrDN(i) & "."
Next
intLastItem = UBound(arrDN)
strNewName = strNewName & arrDN(intLastItem) & "/" & arrDN(0)
Wscript.Echo strNewName
是的,没错:它有点复杂。但实际上,它没有第一次看起来那么糟糕,这一点您自己很快就可以发现。
首先,CW,您的示例中看来引用了 OU,它具有如下所示的 DN(区别名):
ou=Users,ou=finance,dc=fabrikam,dc=com
我们认为应当指出的是,我们正在使用用户帐户来作为示例。但是,这没什么关系:此方法对于任何 DN 均有效,无论使用的是哪个基本对象类型。我们使用用户帐户的原因只是在于它能够保证我们提供的示例脚本任何人都可以原封不动地使用,从而不必更改任何内容。
请别客气。
脚本首先创建 ADSystemInfo 对象的一个实例;这是一个用于返回登录用户相关信息的 ADSI 对象。我们获取 UserName 属性的值,并将其存储在一个名为 strUser 的变量中,然后使用该值绑定到 Active Directory 中的实际用户帐户上。这只需要两行代码:
strUser = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUser)
在连接到用户帐户后,可以获取 distinguishedName 属性的值,将其存储在一个名为 strDN 的变量中。该 DN 将如下显示:
cn=KenMyer,ou=finance,dc=fabrikam,dc=com
是的,这部分很简单。但是,现在我们做什么呢?
以下就是我们要做的。首先,我们发出下面的命令:
arrDN = Split(strDN, ",")
这个命令是将我们的 DN 拆分成一个名为 arrDN 的数组。通过在逗号处拆分 DN,我们得到了一个如下所示的数组:
cn=KenMyer
ou=finance
dc=fabrikam
dc=com
接下来是下面这个代码块:
For i = 0 to UBound(arrDN)
intLength = Len(arrDN(i))
intCounter = intLength - 3
arrDN(i) = Right(arrDn(i), intCounter)
Next
此刻,arrDN 包含构建新名称格式所需的所有项。不过,有一个问题:这些元素(例如,cn=KenMyer)中每个元素的前三个字符是新名称中所不需要的字符。(换句话说,我们想要删去 cn=KenMyer 中的 cn=)。这就是前面代码块的作用。对于数组中的每一项,我们:
| • |
使用 Length 函数来确定该项的长度(即,字符串中的字符数)。 |
| • |
从该长度中减去 3。为什么是 3?因为这就是我们想要去掉的字符数。 |
| • |
使用 Right 函数提取出字符串中的所有字母,前三个字母除外。也就是从后往前执行,我们提取字符 KenMyer,但不提取字符 cn=。然后,将这个截断后的值分配给数组项的值。 |
当您看到我们的数组现在是如下这种形式时,这个代码块就更有意义了:
KenMyer
finance
fabrikam
com
正如您所看到的那样,我们越来越接近目标了。
接下来,我们提取数组的中间两项(不包括第一项和最后一项),构建一个如下所示的字符串:
finance.fabrikam.
下面是构造该字符串的方法:
For i = 1 to UBound(arrDN) - 1
strNewName = strNewName & arrDN(i) & "."
Next
请注意,在这个 For Next 循环中,我们从数组的第二项开始(请记住,数组的第一项始终为项 0,第二项为项 2)。在该循环中,我们构造了一个名为 strNewName 的字符串值,它是由每个数组项的值以及附加在结尾的句点组成的。另请注意,我们并没有使用所有数组项:除了从项 2 开始以外,我们还会在到达最后一项之前停止。为什么?嗯,我们不想为最后一项附加一个句点。处理所有项,但不处理最后一项,从而轻松地避免了将句点加在最后一项的末尾上。运行这个代码块之后,我们将得到一个如下所示的字符串:
finance.fabrikam.
我们马上就能品尝到胜利果实的味道了。为了完成这项任务,我们必须要做的就是在字符串的末尾添加三项内容:
| • |
数组的最后一项(通过使用 UBound 函数,我们可以很容易地确定最后一项的项号)。 |
| • |
/ 字符。 |
| • |
用户的 CN(这正好是我们数组的第一项)。 |
听起来很难,是不是?然而,仅需以下两行代码就可以实现所有的零碎工作:
intLastItem = UBound(arrDN)
strNewName = strNewName & arrDN(intLastItem) & "/" & arrDN(0)
然后,我们只需回显新名称,结束今天的工作:
finance.fabrikam.com/KenMyer
哈,很酷吧?