有没有办法设置用于创建新用户 Active Directory 的默认 UPN 后缀?
例如,如果我将 corp.mydomain.com 作为我的 AD 域,并且我在域和信任下添加了备用 UPN 后缀,即 mydomain.com,那么在创建新用户时是否有办法将该域作为默认域?
我知道我可以创建一个模板用户,然后当我复制它时,它将具有正确的默认后缀,但只是好奇是否有一个隐藏的设置可以控制它。
答案1
据我所知,没有记录任何机制可以更改 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
答案2
据我所知,这是无法做到的(四年后埃文的回答仍然正确)。
话虽如此,我编写了一个脚本,每隔几个小时在多个客户端的任务计划程序中运行一次。它会搜索特定后缀(大多数情况下是默认后缀)并将其切换到另一个后缀。该脚本是在我的博客上但我也会在这里发布:)
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
。
答案3
您可以通过进入 ADSIEDIT.MSC、插入 OU 结构、右键单击 OU(在默认配置中)并编辑 OU 属性来设置允许的 UPN 后缀。要编辑的 OU 属性是 UPNSuffixes。但是,这不会影响分配给在该 OU 内创建的用户的默认 UPN。将所需的 UPN 后缀添加到此列表。接下来,创建一个要复制的模板用户。右键单击 OU,创建一个新用户用作模板,分配正确的 UPN 后缀,然后在创建后右键单击该用户并禁用帐户。要创建新用户,请右键单击模板用户并复制...填写选定的字段,然后将使用正确的 UPN 创建新用户。为不同的 UPNS 创建多个模板用户。或者,如果有疑问,请切换到 powershell。
答案4
此 Technet 文章介绍了如何在域中添加或删除 UPN 后缀:
http://technet.microsoft.com/en-us/library/cc756018(WS.10).aspx
这里也有对此的讨论:
http://technet.microsoft.com/en-us/library/cc739093(WS.10).aspx
我个人无法保证这一点,因为我从未这样做过,但有一件事确实浮现在我的脑海。如果你要这样做,你需要记住,虽然 AD 可以正常工作,但你拥有的任何第三方软件可能并非如此,它们可能认为 UPN 后缀始终是标准后缀。换句话说,在进行更改之前,请仔细考虑后果。