这必须从远程机器获得。以下查询不适用于SID,但适用于组和帐户名称。
"SELECT GroupComponent FROM Win32_GroupUser WHERE PartComponent = \"Win32_UserAccount.Domain='" + accountDomain + "',Name='" + accountName + "'\""
它返回的Win32_Group对象以字符串的形式出现,它们只有域名和名称(即使Win32_Group具有SID属性)。
我有这种沉闷的感觉,我将不得不:
答案 0 :(得分:3)
您可以使用System.DirectoryServices.AccountManagement命名空间类吗?
using (var context = new PrincipalContext( ContextType.Domain ))
{
using (var user = UserPrincipal.FindByIdentity( context, accountName ))
{
var groups = user.GetAuthorizationGroups();
...iterate through groups and find SIDs for each one
}
}
它应该与ContextType.Machine一起使用,但您需要指定机器名称并具有适当的权限。
using (var context = new PrincipalContext( ContextType.Machine,
"MyComputer",
userid,
password ))
{
...
}
使用新的.NET 3.5帐户管理命名空间时,有一个很好的MSDN article(虽然很长)。
答案 1 :(得分:3)
是的,但有些方法取决于拥有域名。
有关如何转换SID,请参阅此page 使用P / Invoke和Windows API,或使用.NET 2.0+而没有P / Invoke的用户ID。
使用System.Security.Principal;
//将用户sid转换为域\名称 string account = new SecurityIdentifier(stringSid).Translate(typeof(NTAccount))。ToString();
如果你有AD和 然后使用the DirectorySearcher method或帐户管理API查找组中的用户ID。 否则使用中列出的方法 获得本地的this文章 组。
在ASP.NET应用程序中,可以使用此类代码访问组信息,前提是用户通过Windows进行身份验证,而不是表单身份验证。在这个例子中,我留下了一个关于在该环境中引发的异常的有趣说明,但它可能适用于其他用户:
public List<string> GetGroupsFromLogonUserIdentity()
{
List<string> groups = new List<string>();
HttpRequest request = HttpContext.Current.Request;
if (request.LogonUserIdentity.Groups != null)
{
foreach (IdentityReference group in request.LogonUserIdentity.Groups)
{
try
{
groups.Add(group.Translate(typeof(NTAccount)).ToString());
}
catch (IdentityNotMappedException)
{
// Swallow these exceptions without throwing an error. They are
// the result of dead objects in AD which are associated with
// user accounts. In this application users may have a group
// name associated with their AD profile which cannot be
// resolved in the Active Directory.
}
}
}
return groups;
}
LogonUserIdentity基于WindowsIdentity类。您可以修改我的代码示例以在非Web应用程序中使用WindowsIdentity和函数。一旦你遍历一个组,你应该能够做这样的事情来获得SecurityIdentifier:
SecurityIdentifier secid = group as SecurityIdentifier;