3

当我们在工作中登录到我们的 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");

我已经挖掘了域控制器对象和用户对象,并看到了很多这样的东西:

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

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

对象检查器截图

4

3 回答 3

1

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

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

但您真正的问题是如何获取“CORP\username”字符串。正如您所发现的,这很容易从System.Security.Principal.WindowsIdentity.GetCurrent().Name. 您也可以获取SecurityIdentifer对象,并调用该类型的Translate方法NTAccount并从 Value 方法中获取它。这很可能是包装LookupAccountNameorDsCrackNames函数。最后,可以使用构造的属性 msDS-PrincipalName 从 Active Directory 中检索此字符串。

于 2013-05-10T14:58:46.913 回答
0

不幸的是,获得这个值并非易事。您想要的属性nETBIOSName是存储在crossRef配置 NC 中表示域的对象上。

假设您知道域的 DN(例如 fabrikam.com 是 DC=fabrikam,DC=com),您可以搜索配置命名上下文(&(objectClass=crossRef)(nCName=DC=fabrikam,DC=com))并从中获取nETBIOSName

于 2012-04-21T18:02:18.293 回答
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 的直接方法将会很有趣

于 2012-04-21T06:55:28.983 回答