当前位置:  开发笔记 > 编程语言 > 正文

如何在S#中将SID转换为帐户名称?

如何解决《如何在S#中将SID转换为帐户名称?》经验,为你挑选了3个好方法。

我有一个C#应用程序,它扫描目录并收集一些信息.我想显示每个文件的帐户名称.我可以通过获取FileInfo对象的SID在本地系统上执行此操作,然后执行以下操作:

string GetNameFromSID( SecurityIdentifier sid )
{
    NTAccount ntAccount = (NTAccount)sid.Translate( typeof( NTAccount ) );
    return ntAccount.ToString();
}

但是,这不适用于网络上的文件,可能是因为Translate()函数仅适用于本地用户帐户.我想也许我可以在SID上进行LDAP查找,所以我尝试了以下方法:

string GetNameFromSID( SecurityIdentifier sid )
{
    string str = "LDAP://";
    DirectoryEntry dirEntry = new DirectoryEntry( str );
    return dirEntry.Name;
}

这似乎可以工作,因为对"dirEntry.Name"的访问会挂起几秒钟,好像它正在关闭并查询网络,但它会抛出一个System.Runtime.InteropServices.COMException

有谁知道如何获得任意文件或SID的帐户名称?我对网络或LDAP或其他任何东西都不太了解.有一个名为DirectorySearcher的类,我可能会使用它,但它想要一个域名,我不知道如何得到它 - 我所拥有的只是我正在扫描的目录的路径.

提前致谢.



1> Chris..:

在这里看到一个很好的答案:

通过SID解析显示用户名的最佳方法是什么?

它的要点是这一点:

string sid="S-1-5-21-789336058-507921405-854245398-9938";
string account = new System.Security.Principal.SecurityIdentifier(sid).Translate(typeof(System.Security.Principal.NTAccount)).ToString();

这种方法适用于活动目录上的非本地SID.



2> Stephen Mart..:

SecurityReference对象的Translate方法适用于非本地SID,但仅适用于域帐户.对于其他计算机本地帐户或非域设置,您需要PInvoke函数LookupAccountSid,指定需要执行查找的特定计算机名称.


我刚刚开始编写一些代码来做类似的事情,发现这是正确的.P /调用LookupAccountSid比使用SecurityIdentifier.Translate()更好.我在一个拥有6万多用户的多林/域环境中工作.

3> Bakanekobrai..:

System.DirectoryServices.AccountManagement.UserPrincipal类(msdn link)具有一个静态函数FindByIdentity,用于将SID转换为User对象.它应该能够对本地计算机或LDAP/Active Directory服务器起作用.我只在活动目录中使用它.

这是我在IIS中使用的一个示例:

// Set the search context to a specific domain in active directory
var searchContext = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=SomeOU,DC=YourCompany,DC=com");
// get the currently logged in user from IIS
MembershipUser aspUser = Membership.GetUser();
// get the SID of the user (stored in the SecurityIdentifier class)
var sid = aspUser.ProviderUserKey as System.Security.Principal.SecurityIdentifier;
// get the ActiveDirectory user object using the SID (sid.Value returns the SID in string form)
var adUser = UserPrincipal.FindByIdentity(searchContext, IdentityType.Sid, sid.Value);
// do stuff to user, look up group membership, etc.


这是查询外部域的正确方法.P/Invoke不是必需的.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有