从SID获取user @ domain而不是domain \ user

时间:2011-09-22 16:09:32

标签: c# .net active-directory

这有点模糊不清:我需要获取用户/组的用户@域形式,但我不想要域\用户表单。我遇到一个问题,一个长的Windows 2003+名称,其中两个不一样,因为域\用户长度限制,因为新的表单没有限制。

我在C#之下,虽然我可以做以下事情:

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

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

这是一个TechNet代码段,它使用DirectorySearcher通过UPN搜索用户 http://gallery.technet.microsoft.com/ScriptCenter/de2cb677-f930-40a5-867d-ea0326ccbcdb/

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

答案 2 :(得分:0)

我已为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();