【问题标题】:From SID get user@domain not domain\user从 SID 获取用户@域而不是域\用户
【发布时间】:2011-09-22 16:09:32
【问题描述】:

这有点晦涩:我需要获取用户/组的 user@domain 形式,但我不想要 domain\user 形式。我曾经遇到过长 windows 2003+ 名称的问题,由于域\用户长度限制,两者不一样,因为新表单没有限制。

我在 C# 下,虽然我可以做到以下几点:

string GetUserName(SecurityIdentifier SID)
{
    NTAccount account = SID.Translate(typeof(NTAccount));
    string [] splits = string.Split("\\", account.Value);
    return splits[1] + @"@" + splits[0];
}

这并不总是正确的,正如我在介绍中所说,用户名@域不一定与旧的 Windows NT 形式的用户名相同。如果您不相信我,请进入 2k3+ 机器上的 AD 用户和计算机,看看旧 NT 用户名与新用户名的不同字段。

那么我如何保证从 SID 获得正确的用户名@域?除此之外,我还需要这种类型的东西来为本地用户/组工作。

【问题讨论】:

    标签: c# .net active-directory


    【解决方案1】:

    获取此信息的 Windows API 称为 DsCrackNames - http://msdn.microsoft.com/en-us/library/ms675970。它将根据您提供的标志以任意数量的格式为您提供输出。

    【讨论】:

    • 这是一个 C++ api。我(不幸的是)在仅限托管的环境中工作。
    • 你可以通过互操作调用它here
    【解决方案2】:

    您不能使用 System.DirectoryServices.AccountManagement.Principal 和 UPN(您的 name@domain.com)来查找 Sid(也是主体上的属性)吗?
    http://msdn.microsoft.com/en-us/library/bb340707.aspx

    这是一个使用 DirectorySearcher 通过 UPN 搜索用户的 TechNet sn-p
    http://gallery.technet.microsoft.com/ScriptCenter/de2cb677-f930-40a5-867d-ea0326ccbcdb/

    获取主体后,您应该能够获取 Sid 属性。

    【讨论】:

    • 我已经有了 SID(通过其他方式,由代码的其他部分给出)。我需要确定的 user@domain。
    • 您也可以使用 DirectorySearcher 进行 SID 搜索,并查找 UserPrincipal 并获取 UPN 属性。 social.msdn.microsoft.com/Forums/en/netfxbcl/thread/…
    • 这是最接近我所做的,它让我走上了正确的轨道。请参阅此其他 SO 帖子以更接近最终发生的情况:stackoverflow.com/questions/1101938/… 所以基本上,一旦我有用户在那里,只有它的 UPN 属性,然后我可以访问它,我可以使用 SID 获取它。跨度>
    • 只是为了确保:UPN 不必是 samAccount@domain。如果需要,您应该分别读取这两个值。
    【解决方案3】:

    我已经为retreiving user data from SID 发布了一些 C# 代码,这里同样适用于您的问题:

    /* Retreiving object from SID 
      */ 
    string SidLDAPURLForm = "LDAP://WM2008R2ENT:389/<SID={0}>"; 
    System.Security.Principal.SecurityIdentifier sidToFind = new System.Security.Principal.SecurityIdentifier("S-1-5-21-3115856885-816991240-3296679909-1106"); 
    
    DirectoryEntry userEntry = new DirectoryEntry(string.Format(SidLDAPURLForm, sidToFind.Value)); 
    string name = userEntry.Properties["userPrincipalName"].Value.ToString(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多