0

使用 .NET,我想以编程方式获取 Windows 用户所属的所有组以及代表登录用户的所有其他 SID(安全标识符)的列表。结果列表应包含:

  1. 用户本人。
  2. 他是直接成员的团体
  3. 他是间接用户的嵌套组
  4. 匹配的WellKnownSidType。例如:
    • 每个人
    • NT AUTHORITY\Authenticated Users
    • ...

第一项是微不足道的,我已经可以通过使用代表我的用户的属性来检索第 2 点和第 3 点,就像这个System.DirectoryServices例子一样tokenGroupsDirectoryEntry

有人可以找到一种(简单的)方法来做到这一点

4

1 回答 1

2

如果您想要一种简单的方法,我会说UserPrincipal.GetAuthorizationGroups真的很容易。唯一的问题是您只能在 .NET 3.5 或更高版本中找到它。

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
    using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "YourUser"))
    {
        foreach (Principal p in user.GetAuthorizationGroups())
        {
             Console.WriteLine(p.Name);
        }
    }
 }

GetAuthorizationGroups返回所有嵌套组,包括 Well known SID。它尝试检索嵌套组信息的不同方法。实际上,它使用的一种方法是用于DirectoryEntry访问tokenGroups属性。

更新

要检查当前用户是否在NT AUTHORITY\INTERACTIVEorLOCAL中,我们可以使用WindowsIdentity.Groups,它直接检索当前登录令牌。请注意,NT AUTHORITY\INTERACTIVE和的成员资格LOCAL是在运行时确定的。根据您现在登录该系统的事实,将用户分配到这些组。同样,在我的 Windows 7 上,我可以看到我当前的登录用户也是其中的成员,NT AUTHORITY\REMOTE INTERACTIVE LOGON因为我是通过远程桌面登录的。

 WindowsIdentity id = WindowsIdentity.GetCurrent();
 foreach (var group in id.Groups)
 {
     Console.WriteLine(((NTAccount)group.Translate(typeof(NTAccount))).Value);
 }

很抱歉,我不知道任何方法可以让任意用户获得会员资格NT AUTHORITY\INTERACTIVE。我怀疑没有这种方法,因为这种类型的组成员资格仅在该用户真正登录时在运行时确定。

于 2011-03-01T06:19:17.990 回答