如何获得" flat" .NET 3.5+中用户的域名

时间:2012-04-20 19:24:23

标签: c# .net active-directory dns directoryservices

当我们在工作时登录我们的Windows机器时,我们使用“CORP \ username”。

鉴于用户的SID和他们登录的域控制器,如何派生该字符串?我正在使用.NET 3.5中添加的DirectoryServices API,如下所示:

PrincipalContext domaincontroller = new PrincipalContext(ContextType.Domain, "192.168.30.115");
UserPrincipal user = UserPrincipal.FindByIdentity(domaincontroller, IdentityType.Sid, "S-1-5-21-293182769-1777760488-2957165303-1798");

我挖掘了domaincontroller对象和用户对象,看到很多这样的东西:

user.Name:              john smith
user.DisplayName:       john smith
user.UserPrincipalName: john.smith@corp.mycompany.com
user.SamAccountName:    john.smith

如果我深入挖掘UserPrinciple对象的私有内容,我会发现两个标记为“domainFlatName”和“FlatDomainName”的字段,其中包含我想要的内容(下面的屏幕截图)。这些是什么意思,以及我如何通过公共界面访问它们?

Object Inspector Screenshot

3 个答案:

答案 0 :(得分:1)

所以这里有几个问题。 Brian Desmond已告诉您“domainFlatName / FlatDomainName”成员对应于域的NETBIOS名称(并且NETBIOS名称不必与DNS名称匹配)。

那你怎么得到它? Brian为您提供了存储在Active Directory中的位置。您也可以使用带有DS_RETURN_FLAT_NAME标志的DsGetDcName函数来获取它。在.NET中可能有这个函数的包装器,但我不知道它是什么。

但你真正的问题是如何获得“CORP \ username”字符串。如您所知,可以从System.Security.Principal.WindowsIdentity.GetCurrent().Name轻松访问。您也可以使用SecurityIdentifer对象,并将Translate方法调用为NTAccount类型,并从Value方法获取它。这很可能包含LookupAccountNameDsCrackNames函数。最后,可以使用构造的属性msDS-PrincipalName。

从Active Directory中检索此字符串

答案 1 :(得分:0)

我再次尝试使用自己的网络。我能达到的最近的是使用UserPrincipal.Current的SamAccountName属性

然后使用DirectorySearcher的SearchRoot.Name属性给了我“DC = CORP”的结果

   string sFilter = String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))", u.SamAccountName);
                DirectoryEntry de = new DirectoryEntry(adPath);
                DirectorySearcher ds = new DirectorySearcher(de, sFilter, new string[] { "distinguishedName" });
string dcName = ds.SearchRoot.Name;

从DC = CORP中提取CORP并将其与u.SamAccountName相结合是我能找到的最佳方式

知道是否仍然存在获得flatdomainname

的直接方法将会很有趣

答案 2 :(得分:0)

遗憾的是,获取此值非常重要。您想要的属性是nETBIOSName,它存储在表示配置NC中的域的crossRef对象上。

如果你知道域的DN(例如fabrikam.com是DC = fabrikam,DC = com),你可以搜索(&(objectClass=crossRef)(nCName=DC=fabrikam,DC=com))的配置命名上下文并抓住nETBIOSName离开那里。