AD上的LDAP查询可以在使用全局目录时为单个帐户提供NetBIOS域名吗?

我正在使用ADSI Edit查看AD中单个用户帐户的LDAP属性。 我看到属性,如userPrincipalName,但我没有看到完全限定的域名(FQDN)或netbios域名。

我们将设置全局编录(GC),使我们能够访问多个域的LDAP,并通过应用程序中的configuration将LDAP属性映射到应用程序中的用户configuration文件属性。 对于典型的AD,FQDN和netbios域名对于所有用户都是相同的,但是涉及GC时,我们需要这些附加信息。 我们真的只需要netbios域名(FQDN不够好)。

也许有一个LDAP查询可以完成从AD中更多的顶级对象请求这些信息?

我想我明白了。 使用ADSI编辑,您可以查看对象(例如,用户)的属性,但是默认情况下,它正在筛选出“已构build”的属性。 使用属性屏幕右下方的“filter”button,我可以显示这些附加属性。

“msDS-PrincipalName”似乎具有“[netbios domain name] \ [sAMAccountName]”作为其值。

如果我进入AD用户和计算机并将“用户login名”从“[email protected]”更改为“[email protected]”,则会影响“userPrincipalName”属性,而不会影响“msDS- PrincipalName“属性。 这对我来说很好,因为我的其他系统(SharePoint)也不能识别这个变化。

如果我进入AD用户和计算机并从“KIRKDEV \ gwashington”更改“用户login名称(Windows 2000之前)”到“KIRKDEV \ g2washington”(注意,我不能更改第一部分),这不会影响“userPrincipalName”属性,但影响“msDS-PrincipalName”属性。 这正是我想要的,因为我的其他系统(SharePoint)确实认识到这一变化。

注意:我说SharePoint确实认识到这种变化,但是这只有在用户从未login过该SharePoint网站集之前。 用户login到SharePoint网站集后,UserInfo表中的tp_Login字段将设置为“msDS-PrincipalName”值,但似乎没有更改。 所以,我可能必须find一种方法来强制改变或者只是说这种情况不被支持。

要回答最后一个问题,您应该可以手动validationNetBios名称,方法是选中“configuration”部分,然后选中ADSIEdit中的“目录分区”:

CN=MYNETBIOSNAME,CN=Partitions,CN=Configuration,DC=mydomain,DC=internal 

这具有namenetBIOSName属性。 否则,我认为你必须像squillman暗示的那样从fqdn / DN中获得它。

对于应用程序? Microsoft在.NET中使这个相当简单。 这应该为您提供域Netbios名称的列表,您可以使用它们来创build具有域DN / DNS / Netbios名称或交叉引用字典的自定义对象的列表。

此外,确定全局编录中属性是否可用的是(另一个)属性,称为isMemberOfPartialAttributeSet。 使用Microsoft SysInternals AD Explorer,可以search域中的架构容器,然后search任何具有isMemberOfPartialAttributeSet = true的对象,以查看可用于GC查询的所有属性。

 using System.DirectoryServices; using System.DirectoryServices.ActiveDirectory; private void GetNetbiosNamesTest() { DomainCollection domains = Forest.GetCurrentForest().Domains; foreach (Domain domain in domains) { Console.WriteLine("Domain Netbios name: {0}", this.GetDomainNetBiosName(domain)); } } private string GetDomainNetBiosName(Domain domain) { ForestRootDirectoryEntry = Forest.GetCurrentForest().RootDomain.GetDirectoryEntry(); string forestConfigurationBindPath = String.Format("LDAP://CN=Partitions,CN=Configuration,{0}", ForestRootDirectoryEntry.Properties["distinguishedName"].Value); ForestRootConfigurationDirectoryEntry = new DirectoryEntry(forestConfigurationBindPath); string netBiosName = String.Empty; using (DirectorySearcher directorySearcher = new DirectorySearcher(ForestRootConfigurationDirectoryEntry)) { directorySearcher.Filter = String.Format("(&(nETBIOSName=*)(dnsRoot={0}))", domain.Name); directorySearcher.PropertiesToLoad.AddRange(new String[] { "dnsRoot", "nETBIOSName" }); var result = directorySearcher.FindOne(); if ((result != null) && (result.Properties.Contains("nETBIOSName"))) netBiosName = result.Properties["nETBIOSName"][0].ToString(); } return netBiosName; } 

您必须从dn (distinguishedName)或AdsDSPath属性中parsing出来。 在这些属性中,域名实体的前缀是"DC=" 。 最左边的DC=将包含您的netbios域名。

例如: cn=myuser,ou=users,dc=mydomain,dc=mycompany,dc=com

mydomain是netbios域名。

编辑:
正如Brian Desmond指出的那样,这不一定是查找实际NetBIOS名称的权威方式,它们通常是相互关联的。 以权威的方式查看BoyMars的答案。

如果您有用户主体名称或DN,则可以使用ActiveDS COM库来转换这些值。 以下是将UserPrincipalName转换为NT4(NetBios)名称的示例。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ActiveDs; namespace Foo.Repository.AdUserProfile { public class ADUserProfileValueTranslate { public static string ConvertUserPrincipalNameToNetBiosName(string userPrincipleName) { NameTranslate nameTranslate = new NameTranslate(); nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_USER_PRINCIPAL_NAME, userPrincipleName); return nameTranslate.Get((int) ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4); } } }