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