Исключение 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 исправит эту проблему, но я получаюдругой шестнадцатеричный код , чем в этом вопросе.
Мои вопросы :
- это особое исключение com наверняка проблема с проверкой подлинности? Я должен быть уверен, что это на 100% исправит проблему, прежде чем выпустить программное обеспечение.
- Есть ли где-нибудь ресурс, который перечисляет все возможные шестнадцатеричные коды исключений COM, чтобы я мог помочь себе немного лучше в будущем?
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), под которым работает ваш сервис или сайт.Однако одна очень важная деталь заключается в том, что весь код, вызывающий Active Directory, должен находиться в этом блоке. Я использовал некоторый код, написанный членом моей команды, который возвращал результаты запроса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 } }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