Исключение COM Active Directory - произошла ошибка операций (0x80072020) - PullRequest
27 голосов
/ 02 сентября 2011

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

Мои вопросы :

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

Ответы [ 8 ]

40 голосов
/ 26 сентября 2013

Часто проблема заключается в том, что контекст, для которого выполняются вызовы 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, и исключение следует исправить, если служба / приложение развернуто на сервере.

19 голосов
/ 02 сентября 2011

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

9 голосов
/ 03 июня 2013

Конечно, это 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 голосов
/ 07 февраля 2014

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

2 голосов
/ 29 июля 2016

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

0 голосов
/ 19 сентября 2017

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

0 голосов
/ 15 ноября 2016

Если вы получили код ошибки, "Произошла ошибка операции (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;
}
Ссылка
0 голосов
/ 18 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...