Answers:
我没有任何已知的机制可以更改由Active Directory用户和计算机选择的默认UPN后缀。我认为该工具很难将森林中“ CN = Partitions,CN = Configuration,...”中指定的域用于“ crossRef”对象上定义的“ canonicalName”属性的第一部分。
AD用户和计算机只是碰巧要这样做。如果使用其他方式(例如“ NET USER ... / add”)创建用户帐户,则不会将userPrincipalName属性分配给该帐户。默认的UPN后缀实际上只是AD用户和计算机中的默认名称,而不是目录服务本身的默认名称。
您是否应该在Microsoft KB文章中运行脚本,该脚本向您展示如何以编程方式获取默认的UPN后缀(http://support.microsoft.com/default.aspx?scid=kb;en-us;Q269441),请注意,脚本中存在一些语法错误(第17和32行格式错误,第32行的srrNamingContext应该为strNamingContext)。我将在本文结尾处提供一个固定的版本,并对其进行较小的改进(它向您显示了可能定义了附加UPN后缀的各个OU的名称)。
我希望得到比我更能“了解”的人来加以纠正,但是我没有看到任何使AD用户和计算机采取不同行动的方法。
' --- Get the naming contexts ----
Set RootDSE = GetObject("LDAP://RootDSE")
strNamingContext = RootDSE.Get("defaultNamingContext")
strConfigContext = RootDSE.Get("configurationNamingContext")
' -- Get the current domain name --
Set oDomain = GetObject("LDAP://" + strNamingContext)
strDomainName = oDomain.Get("name")
Set oPartition = GetObject("LDAP://CN=Partitions," & strConfigContext)
'-- Get the DNS name of the domain --
oDomain.GetInfoEx Array("canonicalName"), 0
strCanonical = oDomain.Get("canonicalName")
strDNSName = Left(strCanonical, Len(strCanonical) - 1) 'clip off "/"
'-- Display the default UPN suffix
wscript.echo strDNSName
'-- Get the defined upnSuffixes --
suffixes = oPartition.GetEx("UPNSuffixes")
For Each upnSuffix In suffixes
wscript.echo upnSuffix
Next
Set RootDSE = Nothing
Set oDomain =Nothing
Set oPartition = Nothing
' -- Get the upnsuffixes defined on organizational units --
Set ADOconn = CreateObject("ADODB.Connection")
Set ADOcom = CreateObject("ADODB.Command")
ADOconn.Provider = "ADsDSOObject"
bstrADOQueryString = "<LDAP://" + strNamingContext + ">;(objectcategory=organizationalUnit);upnsuffixes,ADsPath;subtree"
wscript.echo bstrADOQueryString
ADOconn.Open
ADOcom.ActiveConnection = ADOconn
ADOcom.CommandText = bstrADOQueryString
ADOcom.Properties("Page Size") = 99
Set objRS = ADOcom.Execute
While Not objRS.EOF
If Not IsNull(objRS.Fields("upnSuffixes")) Then
upnsuffixes = objRS.Fields("upnSuffixes")
For Each upnsuffix In upnsuffixes
wscript.echo objRS.Fields("adsPath") & " - Suffix: " & upnsuffix
Next
End If
objRS.MoveNext
Wend
Set objRS = Nothing
Set ADOcom = Nothing
Set ADOconn = Nothing
据我所知,这是无法做到的(四年后,埃文的答案仍然是正确的)。
也就是说,我编写了一个脚本,该脚本每隔几个小时在任务调度程序中在一个以上的客户端上运行。它搜索一个特定的后缀(大多数情况下是默认值)并将其切换为另一个。该脚本在我的博客上,但我也会在此处发布它:)
Import-Module ActiveDirectory
Get-ADUser -Filter {UserPrincipalName -like "*@ad.example.com"} -SearchBase "OU=SomeUserOu,DC=ad,DC=example,DC=com" |
ForEach-Object {
$UPN = $_.UserPrincipalName.Replace("ad.example.com","example.com")
Set-ADUser $_ -UserPrincipalName $UPN
}
在这种情况下,使用ad.example.com
UPN后缀创建的用户将使用example.com
后缀进行更新。
您可以通过进入ADSIEDIT.MSC设置允许的UPN后缀,插入到OU结构,右键单击OU(在默认配置中),然后编辑OU属性。要编辑的OU属性是UPNSuffixes。但是,这不会影响分配给在该OU中创建的用户的默认UPN。将所需的UPN后缀添加到此列表。接下来,创建要复制的模板用户。右键单击该OU,创建一个新用户用作模板,分配正确的UPN后缀,然后右键单击该用户(一旦创建)并禁用帐户。要创建新用户,请右键单击模板用户,然后复制..填写所选字段,然后将使用正确的UPN创建新用户。为不同的UPNS创建多个模板用户。或者,如果有疑问,请切换到Powershell。
实际上,您可以在Powershell的Active Directory模块中运行:Set-ADOrganizationalUnit“ OU = XXX,DC = Domain,DC = com”-添加@ {upnsuffixes =“ @ UPNSuffix.com”。
或者,您可以使用带有-Filter开关的“ Get-adorganizationalUnit”,并将其通过管道传递给“ Set-ADOrganizationalUnit -Add @ {upnsuffixes =“ @ UPNSuffix.com”“
我在寻找了很长一段时间后才发现这个问题,因此希望对任何人有帮助。
此technet文章介绍了如何在您的域中添加或删除UPN后缀:
http://technet.microsoft.com/zh-cn/library/cc756018(WS.10).aspx
这里也有讨论:
http://technet.microsoft.com/zh-cn/library/cc739093(WS.10).aspx
我无法亲自为此做担保,因为我从来不需要这样做,但是想到的一件事确实如此。如果要执行此操作,则需要记住,尽管AD可以正常运行,但对于您拥有的任何第三方软件,情况可能并非如此,这可以假定UPN后缀始终是标准的。换句话说,在进行更改之前,请仔细考虑后果。