Проверка членства в группе - PullRequest
0 голосов
/ 15 июня 2011

Я использую UserPrincipal.FindByIdentity(ctx, "SomeAdminAccountName").GetGroups() для авторизации пользователя по группе в активном каталоге. Он отлично работает для простых групп, но не для вложенных групп. Допустим, я получил следующую структуру:

Administrators members:
  SomeAdminAccountName

Users members
  Administrators
  SomeUserAccountName

Группа пользователей содержит группу администраторов (поскольку все администраторы должны иметь возможность делать то, что могут пользователи). Проблема в том, что UserPrincipal.FindByIdentity(ctx, "SomeAdminAccountName").GetGroups() не включает группу Users.

Если я использую GroupPrincipal.FindByIdentity(ctx, groupName).Members, я вижу, что группа Administrator является ее частью, но учетная запись администратора не включена.

Мой вопрос:

Нужно ли выполнять рекурсивную групповую проверку, чтобы найти пользователя, или есть другой способ, который я не нашел?

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Чтобы проверить пользователя по группе, я бы попробовал IsMemberOf.

Вы также можете подойти к проблеме с другого направления, найдя группу и получив всех членов, используя функцию GetMembers с установленным флагом рекурсивности.Поскольку большинство приложений используют небольшое количество групп, вы должны иметь возможность кэшировать это для повторного использования, в моей работе обычно приемлемо 5–30 минут.

1 голос
/ 15 июня 2011

Вы можете стать жертвой контроля доступа пользователей Windows (Vista или Win7). Когда администратор входит в систему с включенным контролем учетных записей, Windows создает «разделенный токен» - т.е. они запускаются так, как будто их учетная запись не является частью группы администраторов, если / пока их разрешения для запущенного процесса явно не повышены. Вы можете проверить, так ли это, подняв исполняемый процесс, запустив от имени администратора (или запустив VS от имени администратора, если вы работаете в режиме отладки VS).

...