Подтвердить что ты не робот

Исключение Active Directory COM - произошла ошибка операций (0x80072020)

Я получаю прерывистый COM-исключение Произошла операционная ошибка (0x80072020) "(показано ниже) при попытке запросить Active Directory с помощью метода GroupPrincipal.FindByIdentity

Вот мой код:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "Group to find");

Я получаю исключение:

Inner Exception: System.Runtime.InteropServices.COMException (0x80072020): An operations error occurred.
  at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
  at System.DirectoryServices.DirectoryEntry.Bind()
  at System.DirectoryServices.DirectoryEntry.get_AdsObject()
  at System.DirectoryServices.PropertyValueCollection.PopulateList()
  at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
  at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
  at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
  at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
  at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
  at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
  at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
  at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue)
  at System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)

Код выполняется из службы Windows на сервере Windows 2003 SP2.

Я нашел еще один вопрос, Active Directory, перечисляя группы пользователей, исключение COM, предлагая, что включение Kerberos в качестве опции в конструктор PrincipalContext исправит эту проблему, но я получаю другой шестнадцатеричный код, чем в этом вопросе.

Мои вопросы:

  • Является ли это конкретным исключением COM исключительной проблемой аутентификации? Я должен быть уверен, что это устранит проблему на 100%, прежде чем выпускать программное обеспечение.
  • Есть ли какой-нибудь ресурс где-нибудь, в котором перечислены все возможные шестнадцатеричные коды исключения COM, чтобы я мог немного улучшить себя в будущем?
4b9b3361

Ответ 1

Теперь я нашел еще один ответ Не удалось добавить пользователя с API CrmService в Dynamics CRM, в котором говорится, что 0x80072020 действительно является проблемой разрешения. Я изменил мою службу для запуска под учетной записью уровня домена вместо локальной учетной записи системы, и это, похоже, вылечило мою проблему.

Ответ 2

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

Вкратце, убедитесь, что код all для доступа к Active Directory находится внутри этого блока using, и исключение должно быть исправлено при развертывании службы/приложения на сервере.

Ответ 3

Предоставлено это через 2 года, я столкнулся с этим и обнаружил, что следующее решение моей проблемы:

using System.Web.Hosting;
...
...
// Code here runs as the logged on user

using (HostingEnvironment.Impersonate()) {
// This code runs as the application pool user
     DirectorySearcher searcher ...
}

ссылка

Ответ 4

Это случилось со мной в ASP.NET(Windows 2008 R2/IIS7), где я возился с Web.config, и эта ошибка начала происходить при каждом вызове FindByIdentity. Основная причина заключалась в том, что пул приложений работает как DefaultAppPool, и он снова начал работать после того, как я сменил его для работы в качестве сетевой службы. Я не совсем понимаю, почему это изменилось, но это произошло.

Ответ 5

У меня была та же проблема. Я получил успех после изменения пула приложений, как показано ниже:  Модель процесса     загрузить профиль пользователя = true

Ответ 6

В моем случае пул веб-приложений работал как "DefaultAppPool", у которого не было достаточного доступа для подключения к Active Directory компании. Итак, я олицетворял учетную запись, которая имеет доступ к AD в моем коде, и все работает нормально.

Ответ 7

Если у вас есть код ошибки, "Произошла операционная ошибка (0x80072020)" , это может означать "Доступ запрещен" .

  • Проверьте свой веб-сервер независимо от того, находится ли он в домене AD
    • Если нет, вам нужно поставить аутентификацию в PrincipalContext.
Пример (что-то вроде этого):
public bool foo(String username, String password) {
    string ADIPaddress = "[ipaddress]";
    ContextOptions options = ContextOptions.Negotiate;
    PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, AD_IPaddress, null, options, username, password);
    bool isAuthenticated = principalContext.ValidateCredentials(username, password, options);
    return isAuthenticated;
}
Справка

Ответ 8

Для меня я столкнулся с той же проблемой, пытаясь войти в один из контроллеров домена, у меня есть 2 контроллера домена, 1 из них работает, а другой не работает, я считаю, что он имеет какое-то отношение к профиль пользователя, все еще исследующий...