Часто проблема заключается в том, что контекст, для которого выполняются вызовы Active Directory, находится под пользователем, у которого нет разрешений (это также может произойти, если identity impersonate="true"
в ASP.NET из-за того, что маркер пользователя является «вторичный токен», который нельзя использовать при аутентификации на другом сервере с: https://social.technet.microsoft.com/Forums/en-US/f188029c-51cf-4b50-966a-eee7160d0353/an-operations-error-occured).
Следующий код гарантирует, что блок кода, который вы запускаете, выполняется в контексте, скажем, AppPool
(т.е. NETWORKSERVICE
), под которым работает ваша служба или сайт.
using (HostingEnvironment.Impersonate())
{
var domainContext = new PrincipalContext(ContextType.Domain, "myDomain.com");
var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "PowerUsers");
if (groupPrincipal != null)
{
//code to get the infomation
}
}
Однако одна очень важная деталь заключается в том, что весь код, вызывающий Active Directory , должен находиться в этом блоке. Я использовал некоторый код, который написал мой член команды, который возвращал LINQ
результаты запроса типа Users
(пользовательский класс), но не вычислял выражение (плохая практика). Поэтому вместо результатов было возвращено дерево выражений.
В конечном итоге, вызывающий код оценил результаты, и сообщение An operations error occurred
все равно появилось. Я, хотя код, исправленный выше, не работал. Когда это действительно так, но был код, оценивающий результаты за пределами блока.
В двух словах, убедитесь, что весь код для доступа к Active Directory находится внутри этого блока using
, и исключение следует исправить, если служба / приложение развернуто на сервере.