Мне не известен документированный механизм изменения суффикса UPN по умолчанию, который выбирают пользователи и компьютеры Active Directory. Я полагаю, что этот инструмент жестко привязан к первой части атрибута «canonicalName», определенной в объекте «crossRef» для домена, указанного в «CN = Partitions, CN = Configuration, ...» в вашем лесу.
Пользователи и компьютеры AD просто оказались зашитыми для этого. Если вы создаете учетные записи пользователей с помощью других средств (например, «NET USER ... / add»), то для учетной записи не будет назначен атрибут userPrincipalName. Суффикс UPN по умолчанию - это просто значение по умолчанию в AD Users and Computers, а не значение по умолчанию для самой службы каталогов.
Если вы столкнетесь со статьей Microsoft KB со скриптом, в котором показано, как программно получить суффикс UPN по умолчанию ( http://support.microsoft.com/default.aspx?scid=kb;en-us;Q269441 ), имейте в виду, что в скрипте есть пара синтаксических ошибок (строки 17 и 32 искажены, а srrNamingContext в строке 32 должен быть strNamingContext). Я включу исправленную версию с небольшим улучшением в конце этого поста (она показывает имена отдельных подразделений, в которых могут быть определены дополнительные суффиксы UPN).
Я бы хотел, чтобы кто-то более «в курсе» меня исправил, но я не вижу способа заставить пользователей 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