DirectoryServicesCOMException при работе с System.DirectoryServices.AccountManagement - PullRequest
6 голосов
/ 25 мая 2010

Я пытаюсь определить, является ли пользователь членом данной группы, используя 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?

EDIT: При дальнейшем тестировании мой код работает правильно при тестировании в консольном приложении, ориентированном на .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, которая может запрещать выполнение этой функции?

1 Ответ

1 голос
/ 26 мая 2010

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

...