我想从下面的代码中找到主要组
我可以获取一个用户的所有网上论坛,但是哪个是主要网上论坛?
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;
}
}
}
上面的代码返回的是...
域用户
管理员
架构管理员
企业管理员
域管理员
..还有更多
什么是主要组?
答案 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。