嗨,CH。UPN(或称“用户主体名称”)提供了另外一种登录到域上的方法。通常,您使用以下方法登录到域上:按 Ctrl-Alt-Del 组合键,键入用户名、域名及密码,然后按 Enter 键。通过使用 UPN,您不必分别输入用户和名称,而是输入类似下面的用户名:
kenmyer@fabrikam.com
我们不会花费时间阐述 UPN 的基本原理,而仅说明它具备的功能之一:即使“登录到”下拉列表中没有显示您的域名,您也可以登录到计算机上。
那么,如何更改域中所有用户的 UPN 呢?这一过程包含两个步骤:首先,需要获取域中所有用户的列表,然后,需要更改每个用户的 UPN。我们先执行第一步,这也是最关键的一步。
到目前为止,获取域中所有用户的列表的最佳方法是执行 Active Directory 搜索。过去,我们曾讨论过 Active Directory 搜索的运行机制,因此,我们现在只为您提供一个示例脚本;如果您想了解有关 Active Directory 搜索的详细信息,请收听“Scripting Guys 网络广播”。现在,我们为您提供了以下脚本,它可以返回 fabrikam.com 域中所有用户的 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='user'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
Wscript.Echo objRecordSet.Fields("ADsPath").Value
objRecordSet.MoveNext
Loop
当然了,Active Directory 路径提供了 Active Directory 中用户帐户的路径;例如,用户 Ken Myer 的 Active Directory 路径可能类似于以下内容:
LDAP://CN=Ken Myer,OU=Finance,DC=fabrikam,DC=com
获取 Active Directory 路径的原因是,我们需要绑定到每个用户帐户以更改其 UPN;Active Directory 路径提供了直接访问帐户的方法,“并且”我们只需要使用一行代码就能绑定到帐户上,而不必进行任何复杂的字符串处理。
绑定到用户帐户后,接下来要做什么?此时,我们需要完成两个操作:首先为用户分配新的 UPN,然后调用“SetInfo”方法,它的实际作用是将新 UPN 写入 Active Directory 用户帐户。如果用伪代码来表示,此过程类似于以下内容:
objUser.userPrincipalName = New UPN we’re assigning the user
objUser.SetInfo
如果用真代码来表示以下过程:获取 Active Directory 中所有用户帐户,分别绑定到每个帐户,然后为每个帐户分配新的 UPN,则此过程类似于以下内容:
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,samAccountName,userPrincipalName FROM " & _
"'LDAP://dc=fabrikam,dc=com' WHERE objectCategory='user'"
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
strUser = objRecordSet.Fields("ADsPath").Value
strNewUPN = objRecordSet.Fields("samAccountName").Value & "@" & "contoso.com"
Set objUser = GetObject(strUser)
objUser.userPrincipalName = strNewUPN
objUser.SetInfo
objRecordSet.MoveNext
Loop
在获取用户帐户集合后,所有主要操作都要靠 Do Until 循环来实现。在该循环中,我们先将用户 1 的 Active Directory 路径分配给变量 strUser。然后,为该用户构建新的 UPN。通常,UPN 由用户的登录名 (samAccountName) 和其后的域名组成。因为 CH 的问题所涉及的是更改现有 UPN,所以,要在此处略加改动。我们假定贵公司与另一个组织进行了合并,您现在希望用户在其 UPN 中使用新的名称 (contoso.com)。例如:
kenmyer@contoso.com
因此,我们将构建一个由“samAccountName”、“@”符号以及“contoso.com”组成的新 UPN,然后将新 UPN 存储在名为 strNewUPN 的变量中。这就是下面这行代码所完成的操作:
strNewUPN = objRecordSet.Fields("samAccountName").Value & "@" & "contoso.com"
到目前为止,一切顺利。接下来,我们绑定到一个用户帐户,并为该用户分配新的 UPN。只需使用下面两行代码,即可完成上述操作:
Set objUser = GetObject(strUser)
objUser.userPrincipalName = strNewUPN
我们调用 SetInfo 并执行以上代码,第一个用户便可拥有新的 UPN。然后再执行一次循环,为集合中的下一位用户分配新的 UPN。这一过程自动继续执行,直至所有用户都拥有了全新的 UPN。
我们不知道您每隔多长时间需要更改一次域中所有用户的 UPN,但是,您可以使用此脚本的基本思路来实现很多其他目的。例如,您可能需要更改所有用户的公司名,也可能想要求所有用户下次登录时更改其密码。只需对今天介绍的脚本稍加修改,就可以完成任何涉及对域中所有用户帐户进行修改的任务。