从SID获取user@domain而不是域用户
本文关键字:用户 SID 获取 user@domain | 更新日期: 2023-09-27 18:09:17
这是一个有点晦涩的:我需要获得用户/组的user@domain形式,但我不想要域'用户形式。我曾经遇到过一个问题,长windows 2003+名称,其中两个是不一样的,因为域'用户长度限制,因为新的形式没有限制。
我在c#下,虽然我可以做以下操作:
string GetUserName(SecurityIdentifier SID)
{
NTAccount account = SID.Translate(typeof(NTAccount));
string [] splits = string.Split("''", account.Value);
return splits[1] + @"@" + splits[0];
}
这并不总是正确的,正如我在介绍中所说的,username@domain不一定与旧的windows NT形式的用户名相同。如果你不相信我的话,可以进入2k3+机器上的AD用户和计算机,看看旧的NT用户名和新的NT用户名有什么不同的字段。
那么我如何保证从SID获得正确的username@domain呢?除此之外,我还需要这种类型的东西为本地用户/组工作
获取此信息的Windows API称为DsCrackNames
- http://msdn.microsoft.com/en-us/library/ms675970。它将根据您提供的标志提供任意数量的格式输出。
您不能使用System.DirectoryServices.AccountManagement.Principal和UPN(您的name@domain.com)来查找Sid(也是主体的属性)吗?
http://msdn.microsoft.com/en-us/library/bb340707.aspx
下面是一个使用DirectorySearcher按UPN
搜索用户的TechNet代码片段http://gallery.technet.microsoft.com/scriptcenter/de2cb677 f930 - 40 - a5 - 867 d - ea0326ccbcdb/
获取主体后,您应该能够获得Sid属性。
我已经发布了一些用于从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();