我有一个用户帐户的SID,我想要它所属的组的SID

时间:2010-03-22 19:44:46

标签: c# wmi wql

这必须从远程机器获得。以下查询不适用于SID,但适用于组和帐户名称。

"SELECT GroupComponent FROM Win32_GroupUser WHERE PartComponent = \"Win32_UserAccount.Domain='" + accountDomain + "',Name='" + accountName + "'\""

它返回的Win32_Group对象以字符串的形式出现,它们只有域名和名称(即使Win32_Group具有SID属性)。

我有这种沉闷的感觉,我将不得不:

  1. 通过查询Win32_SID,将SID转换为帐户名称;
  2. 执行上述查询;
  3. 通过查询Win32_Group,将结果组名称的每个转换为SID。

2 个答案:

答案 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)

是的,但有些方法取决于拥有域名。

  1. 有关如何转换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();

  2. 如果你有AD和 然后使用the DirectorySearcher method或帐户管理API查找组中的用户ID。 否则使用中列出的方法 获得本地的this文章 组。

  3. 现在使用@tvanfosson建议的API迭代组并获取SID。或者按照以下信息进行操作。
  4. 在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;