从UserPrincipal C#获取主组

时间:2019-07-11 16:58:34

标签: c# active-directory principalcontext

我想从下面的代码中找到主要组

我可以获取一个用户的所有网上论坛,但是哪个是主要网上论坛?

        string primaryGroupName = String.Empty;
        using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
        {
            using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "userName"))
            {
                foreach (Principal p in user.GetGroups())
                {
                    WriteLog("PrimaryGroup Name(s)???:");
                    WriteLog(p.Name);
                    primaryGroupName = p.Name;
                }
            }
        }

上面的代码返回的是...

  

域用户
  管理员
  架构管理员
  企业管理员
  域管理员
  ..还有更多

什么是主要组?

1 个答案:

答案 0 :(得分:0)

您有一个正确的想法:primaryGroupID保留作为主要组的组的RID(相对标识符)。 RID是SID中的最后一组数字。 SID的其余部分标识域。因此,您可以使用用户的SID和primaryGroupID来确定组的SID。

我写了几篇有关此的文章。一个叫做What makes a member a member?的部分,其中有一个描述主要组的部分。还有一篇名为Finding all of a user’s groups的文章,我在其中分享了一些代码来查找主要组。我发现直接使用DirectoryEntry总是比使用UserPrincipal / GroupPrincipal更快,这就是我的示例所使用的:

这是方法:

private static string GetUserPrimaryGroup(DirectoryEntry de) {
    de.RefreshCache(new[] {"primaryGroupID", "objectSid"});

    //Get the user's SID as a string
    var sid = new SecurityIdentifier((byte[])de.Properties["objectSid"].Value, 0).ToString();

    //Replace the RID portion of the user's SID with the primaryGroupId
    //so we're left with the group's SID
    sid = sid.Remove(sid.LastIndexOf("-", StringComparison.Ordinal) + 1);
    sid = sid + de.Properties["primaryGroupId"].Value;

    //Find the group by its SID
    var group = new DirectoryEntry($"LDAP://<SID={sid}>");
    group.RefreshCache(new [] {"cn"});

    return group.Properties["cn"].Value as string;
}

要在代码中使用该代码,请执行以下操作:

var primaryGroupName = GetUserPrimaryGroup((DirectoryEntry) user.GetUnderlyingObject());

该方法仅返回组名,但是您可以根据需要对其进行修改。

总而言之,513始终是内置的域用户组的RID。