您好,AA。您知道,所有这些出色的建议专栏(“Dear Abby”、“Ann Landers”、“嗨,Scripting Guy!”)有一个共同特征,那就是随着时间的推移,这些专栏似乎在反复给出相同建议。不管给“Dear Abby”写过多少封信抱怨邻居的问题,您知道她也永远不会建议您烧了那家伙的房子。“Ann Landers”和“嗨,Scripting Guy!”也一样。
问题是我们经常对读者的问题给出相同的建议,今天也不例外。即:这实际上是一个两部分的问题,因此让我们分别分析这两个部分。哦,是这样的:其中一个部分涉及搜索 Active Directory。是的,我们知道:您听说过多少次了?但似乎就是这样工作的。
正如您可能领会的,如果其中一个部分涉及搜索 Active Directory,那另一个部分必定涉及将计算机帐户从一个 OU 移动到另一个。这很简单,因此让我们先解决这个问题。以下的示例脚本将计算机 atl-ws-01 从 Finance OU 移动到 Research OU:
Set objOU = GetObject("LDAP://OU=Research,DC=fabrikam,DC=com") intReturn = objOU.MoveHere _ ("LDAP://CN=atl-ws-01,OU=Finance,DC=fabrikam,DC=com", vbNullString)
这就行了,仅仅两行代码。我们绑定到新 OU(我们想将计算机移动到的那个 OU)。绑定到该 OU 后,我们调用 MoveHere 方法,传递给它两个参数:我们想移动的计算机的 AdsPath 以及 vbNullString(等于 Null 的 VBScript 常量)。传递 Null 作为第二个参数告诉 MoveHere 方法我们想要对象保留其当前 CN (atl-ws-01)。如果传递不同的 CN,计算机不仅被移动,它还将被重新命名。
顺便说一句,实际上不用包括 Null 参数,如果没有第二个参数,MoveHere 将假定第二个参数为 Null。我们在这里显示它,只是为了让您了解 MoveHere 接受两个参数。
特别奉送脚本:假设您的确想要重新命名 Active Directory 帐户。好,那么绑定到该帐户当前所在的 OU,调用 MoveHere 方法,然后赋予该帐户其他不同的 CN。例如,此脚本重新命名了计算机 atl-ws-01,为其指定新名称 finance-ws-01:
Set objOU = GetObject("LDAP://OU=Finance,DC=fabrikam,DC=com") intReturn = objOU.MoveHere _ ("LDAP://CN=atl-ws-01,OU=Finance,DC=fabrikam,DC=com", “cn=finance-ws-01”)
现在我们知道对如何移动计算机帐户我们所需做的全部就是解决如何“查找”该计算机帐户。以下我们将使用 Active Directory 搜索脚本。该脚本搜索名为 atl-ws-01 的计算机的 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 ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer' " & _ "AND name='atl-ws-01'" Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst Do Until objRecordSet.EOF Wscript.Echo objRecordSet.Fields("ADsPath").Value objRecordSet.MoveNext Loop
前面的脚本只是回显计算机的 AdsPath。这很好,只要我们有 AdsPath,我们就能继续下一步,将计算机帐户移动到不同的 OU。(记住,除非我们重新命名计算机,否则 AdsPath 是我们需要传递给 MoveHere 方法的唯一参数。)以下是修改过的脚本,它搜索到计算机 atl-ws-01,然后将其从 Finance OU 移动到 Research OU:
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 ADsPath FROM 'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='computer' " & _ "AND name='atl-ws-01'" Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst Do Until objRecordSet.EOF strADsPath = objRecordSet.Fields("ADsPath").Value Set objOU = GetObject("LDAP://OU=Research,DC=fabrikam,DC=com") intReturn = objOU.MoveHere(strADsPath, vbNullString) objRecordSet.MoveNext Loop
顺便提一句,我们知道我们没有解释 Active Directory 搜索部分如何工作,更多有关使用脚本搜索 Active Directory 的信息,请查阅此脚本专家 网络广播。
不,等等,千万别烧别人的房子,我们只是开个玩笑。也许我们从现在起就坚持不懈地提供脚本编写建议。…