DirectoryServices.AccountManagement - эффективность проверки членства в группе - PullRequest
1 голос
/ 15 декабря 2009

У нас есть группа в Active Directory с более чем 70 тысячами учетных записей пользователей. Мне нужно проверить, является ли кто-то членом этой группы. Код будет работать в веб-приложении с большим количеством одновременных пользователей. Я бы предпочел придерживаться System.DirectoryServices.AccountManagement , если возможно, чтобы уменьшить объем кода, написанного для этого приложения.

Существует два основных подхода к проверке того, является ли кто-либо членом:

  1. Используйте UserPrincipal.IsMemberOf () , чтобы получить логическое значение, указывающее членство
  2. Используйте UserPrincipal.GetGroups () , чтобы получить список членства в группах, который я могу вручную проверить

Я хочу, чтобы перечисляющие 70 тыс. Пользователей не проверяли, входит ли кто-то в группу, поэтому вариант 2 представляется более эффективным по номинальной стоимости. Когда я приступаю к работе, я могу провести несколько тестов с обоими методами, но я хотел получить некоторую информацию о том, что эти методы действительно делают, под прикрытием. Я на правильном пути здесь, в моих мыслях?

Последнее замечание о библиотеке, которую я использую. Могу ли я получить более высокую производительность, если полностью исключаю System.DirectoryServices.AccountManagement и пишу свои собственные запросы LDAP?

1 Ответ

1 голос
/ 15 декабря 2009

Ну, одна вещь, которую вы могли бы рассмотреть, чтобы сделать вещи более эффективными, основана на том факте, что членство в группе действительно управляется группой, которая имеет список пользователей (и групп), которые являются ее членами.«MemberOf» для пользователя - это действительно просчитанная «обратная ссылка» - см. Эту превосходную статью для получения дополнительной информации.

Так что если вам нужно проверить членство в одной или двух группах,может быть, намного проще просто подойти к этим группам и попросить их список участников, и их кэшировать.При оценке пользователей вам нужно только проверить, отображается ли их DN в одном из списков членов группы, не нажимая AD снова и снова.

Вы будете делать что-то вроде:

GroupPrincipal myGroup = Group.FindByIdentity(context, "myGroupName");

var members = myGroup.GetMembers();

Благодаря этому вы сможете повысить производительность благодаря кэшированию информации о членстве в группе.Попробуйте!

...