2010-05-25 2 views
6

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

  • Я делаю это внутри 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 \ имя пользователя), либо просто имя пользователя без изменений в поведении. Я попытался выполнить код с другими учетными данными, используя оба подхода 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

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

+3

Возможно, вам стоит обратить внимание на то, что это подход «Железный кулак правосудия», а не рекомендуемое решение для производства или интернет-системы. –

+2

@Burly - Хорошая точка. Это работает в моей среде: внутренняя система в отключенной сети. Это не решение, которым я доволен, но это решение, так оно и будет на данный момент.Я действительно надеюсь на какое-то руководство, какие привилегии у админов, которые позволяют выполнять код без ошибок. Я бы хотел удалить привилегии администратора от этого пользователя и предоставить что-то более безопасное, продолжая работу по мере необходимости. – antik

+0

@antik Вы в конечном итоге удалили административную привилегию и сможете выполнить это без исключения? – FMFF

Смежные вопросы