Я пытаюсь определить, является ли пользователь членом данной группы, используя 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, которая может запретить выполнение этой функции?
Возможно, вам стоит обратить внимание на то, что это подход «Железный кулак правосудия», а не рекомендуемое решение для производства или интернет-системы. –
@Burly - Хорошая точка. Это работает в моей среде: внутренняя система в отключенной сети. Это не решение, которым я доволен, но это решение, так оно и будет на данный момент.Я действительно надеюсь на какое-то руководство, какие привилегии у админов, которые позволяют выполнять код без ошибок. Я бы хотел удалить привилегии администратора от этого пользователя и предоставить что-то более безопасное, продолжая работу по мере необходимости. – antik
@antik Вы в конечном итоге удалили административную привилегию и сможете выполнить это без исключения? – FMFF