DirectoryServicesCOMException при работе с System.DirectoryServices.AccountManagement

Я пытаюсь определить, является ли пользователь членом данной группы, используя System.DirectoryServices.AccountManagment.

  • Я делаю это внутри SharePoint WebPart в SharePoint 2007 в 64-битной системе.
  • Проект нацелен на .NET 3.5
  • Олицетворение включено в web.config.
  • Рассматриваемый сайт IIS использует пул приложений IIS с пользователем домена, настроенным в качестве удостоверения.

Я могу создать экземпляр PrincipalContext как таковой:

PrincipalContext pc = new PrincipalContext(ContextType.Domain)

Далее я пытаюсь схватить принципала:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
   GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup");
   // snip: exception thrown by line above.
}

Как указанное выше, так и UserPrincipal.FindByIdentity с пользователем SAM выдают DirectoryServicesCOMException: «Ошибка входа: неизвестное имя пользователя или неверный пароль»

Я пробовал передать полное имя SAMAccountName либо FindByIdentity (в форме MYDOMAIN \ username), либо просто имя пользователя без каких-либо изменений в поведении. Я пробовал выполнить код с другими учетными данными, используя подходы HostingEnvironment.Impersonate и SPSecurity.RunWithElevatedPrivileges, и также получил тот же результат.

Я также попытался создать экземпляр своего контекста с доменным именем на месте:

Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

Это выдает PrincipalServerDownException: «Не удалось связаться с сервером».

Я работаю на достаточно защищенном сервере. Я не блокировал систему, поэтому я не уверен, что именно с ней сделали. Если есть учетные данные, которые мне нужно выделить пользователю моего удостоверения пула или в политике безопасности домена, чтобы они работали, я могу соответствующим образом настроить домен. Существуют ли какие-либо настройки, которые могут помешать запуску моего кода? Мне что-то не хватает в самом коде? Разве это невозможно в сети SharePoint?

РЕДАКТИРОВАТЬ: при дальнейшем тестировании мой код работает правильно при тестировании в консольном приложении, ориентированном на .NET 4.0. Я нацелился на другую платформу, потому что по какой-то причине у меня не было AccountManagement в консольном приложении при настройке .NET 3.5.

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user"))
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group"))
{
   if (adUser.IsMemberOf(adGroup))
   {
       Console.WriteLine("User is a member!");
   }
   else
   {
       Console.WriteLine("User is NOT a member.");
   }
}

Что меняется в моей среде SharePoint, что может препятствовать выполнению этой функции?


person antik    schedule 25.05.2010    source источник


Ответы (1)


Я добавил учетную запись, используемую пулом приложений IIS, в группу администраторов, и эта проблема была решена.

person antik    schedule 26.05.2010
comment
Вам, вероятно, следует отметить, что это подход «Железного кулака правосудия», а не рекомендованное решение для производственной системы или системы с выходом в Интернет. - person Zach Burlingame; 27.05.2010
comment
@Burly - Хорошее замечание. Это работает в моей среде: внутренняя система в отключенной сети. Это не то решение, которым я доволен, но это решение, поэтому на данный момент оно будет работать. Я действительно надеюсь на некоторые рекомендации относительно того, какие привилегии имеют администраторы, позволяющие выполнять код без ошибок. Я бы хотел удалить у этого пользователя права администратора и предоставить что-то более безопасное, продолжая работу, как мне нужно. - person antik; 27.05.2010
comment
@antik Вы в конце концов удалили права администратора и смогли выполнить это без исключения? - person FMFF; 11.10.2013