当我们在工作时登录我们的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”的字段,其中包含我想要的内容(下面的屏幕截图)。这些是什么意思,以及我如何通过公共界面访问它们?
答案 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方法获取它。这很可能包含LookupAccountName
或DsCrackNames
函数。最后,可以使用构造的属性msDS-PrincipalName。
答案 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
离开那里。