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



Я получаю прерывистое исключение COM "произошла ошибка операций (0x80072020) "(показано ниже), когда я пытаюсь запросить Active Directory с помощью метода группа "Ринципал".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 server .



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



Мои вопросы :




  1. это особое исключение com наверняка проблема с проверкой подлинности? Я должен быть уверен, что это на 100% исправит проблему, прежде чем выпустить программное обеспечение.

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

833   8  

8 ответов:

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

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

Конечно, это 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 ...
}

Ссылка

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

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

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

Если вы получили код ошибки, " произошла ошибка операции (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;
}
Ссылка

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

Comments

    Ничего не найдено.