как проверить, является ли пользователь членом списка рассылки/группы безопасности в AD С#

Я использую приведенный ниже фрагмент кода, чтобы проверить, является ли данный пользователь частью группы рассылки в AD.

static bool IsUserMemberOf(string userName, string groupName)
{
  using (var ctx = new PrincipalContext(ContextType.Domain))
  using (var groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName))
  using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, userName))
  {
    return userPrincipal.IsMemberOf(groupPrincipal);
  }
}

я вызываю вышеуказанный метод со значениями как IsUserMemberOf("domain\\username","domain\\groupname"), но я вижу исключение нулевого указателя, потому что groupPrincipal имеет нулевое значение.

Любая помощь в этом отношении?


person Mahender    schedule 26.07.2011    source источник
comment
Ваш код работает в моей системе. Вы уверены, что домен\\имя_группы является действительной группой в используемом вами контексте? Возможно, стоит проверить ctx.ConnectedServer, чтобы убедиться, что вы подключены к домену, к которому вы ожидаете подключиться. Вы также можете попробовать использовать другое имя группы, чтобы проверить, не работает ли ваш код с этим. Функция userPrincipal.GetGroups() даст вам список имен, которые вы можете использовать.   -  person Frank Boyne    schedule 26.07.2011
comment
Я также попробовал ваш код, и он работает и для меня. Я опустил часть domain\\ из имени пользователя и имени группы.   -  person Frank Hale    schedule 26.07.2011
comment
Кроме того, есть ли шанс, что ваш пользователь не находится в том же домене, что и запрашиваемая группа? Ваш метод не будет работать, если это так. К сожалению, у меня нет решения этой проблемы. У меня была аналогичная проблема, и я никогда не мог найти достаточного ответа.   -  person RLH    schedule 26.07.2011
comment
на самом деле приведенный выше код работает, если имя пользователя и группы находятся в одном домене. Если я укажу группу из другого домена, я увижу поведение выше.   -  person Mahender    schedule 27.07.2011


Ответы (2)


Это просто означает, что:

groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName)) 

Возвращает нулевой указатель, поскольку вашей группы нет в вашем домене. Вам просто нужно проверить свои переменные ctx, userPrincipal и groupPrincipal.

person JPBlanc    schedule 26.08.2011

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

и я звоню так:

IsUserMemberOf("domain1\\username","domain2\\groupname")


static bool IsUserMemberOf(string userName, string groupName)
{
 using (var ctx = new PrincipalContext(ContextType.Domain,"domain1"))
 using (var groupPrincipal = GroupPrincipal.FindByIdentity(new PrincipalContext(ContextType.Domain,"domain2"), groupName))
 using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, userName))
 {
    return userPrincipal.IsMemberOf(groupPrincipal);
 }

}

person Mahender    schedule 16.01.2013