как да проверите дали даден потребител е член на списък за разпространение/група за сигурност в AD C#

Използвам по-долу част от кода, за да проверя дали даден потребител е част от групата за разпространение в 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
Аз също опитах вашия код и той също работи за мен. Пропуснах частта за домейн\\ от потребителското име и името на групата.   -  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)) 

Връща нулев указател, защото вашата група не присъства във вашия домейн. Просто трябва да тествате вашите var 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