У вас правильная идея: primaryGroupID
содержит RID (относительный идентификатор) группы, которая является основной группой. RID - это последний набор номеров в SID. Остальная часть SID идентифицирует домен. Таким образом, вы можете определить SID группы, используя SID пользователя и primaryGroupID
.
Я написал пару статей об этом. Один называется Что делает участника членом? , с разделом, описывающим основную группу. Но также статья под названием Поиск всех групп пользователей , где я поделился некоторым кодом, чтобы найти основную группу. Я обнаружил, что использование 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 встроенной группы пользователей домена.