Получить основную группу из UserPrincipal C # - PullRequest
0 голосов
/ 11 июля 2019

Я хочу найти Первичную группу из кода ниже

Я могу получить все группы для пользователя, но какая из них является основной?

        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 голосов
/ 16 июля 2019

У вас правильная идея: 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 встроенной группы пользователей домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...