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