c# - Excepción COM de Active Directory: se ha producido un error de operaciones(0x80072020)
.net exception (8)
Ahora encontré otra respuesta. No se puede agregar un usuario con la API CrmService en Dynamics CRM, que establece que 0x80072020 es un problema de permiso. He cambiado mi servicio para que se ejecute bajo una cuenta de nivel de dominio en lugar de la cuenta del sistema local y esto parece haber solucionado mi problema.
Recibo una excepción COM intermitente " Se produjo un error de operaciones (0x80072020) " (se muestra a continuación) cuando intento consultar Active Directory utilizando el método GroupPrincipal.FindByIdentity
Aquí está mi código:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "Group to find");
Estoy recibiendo Excepción:
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)
El código se ejecuta desde un servicio de Windows en un servidor Windows 2003 SP2 .
He encontrado otra pregunta sobre Desbordamiento de pila, Active Directory, enumerando grupos de usuarios, excepción COM , sugiriendo que habilitar Kerberos como una opción en el constructor PrincipalContext solucionará este problema, pero estoy recibiendo un código hexadecimal diferente que en esta pregunta.
Mis preguntas son :
- ¿Es esta particular Excepción COM definitivamente un problema de autenticación? Necesito estar seguro de que esto solucionará el problema al 100% antes de lanzar el software.
- ¿Hay algún recurso en alguna parte que enumere todos los posibles códigos hexadecimales COM de excepción para que pueda ayudarme a mí mismo un poco mejor en el futuro?
De acuerdo, esto es 2 años después, me encontré con esto y descubrí que lo siguiente resolvió mi problema:
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 ...
}
El problema a menudo es que el contexto para el que se realizan las llamadas de Active Directory está bajo un usuario que no tiene permisos (también puede suceder cuando identity impersonate="true"
en ASP.NET, debido al hecho de que el token de los usuarios es "token secundario" que no se puede usar al autenticarse en otro servidor desde: https://social.technet.microsoft.com/Forums/en-US/f188029c-51cf-4b50-966a-eee7160d0353/an-operations-error-occured )
El siguiente código asegurará que el bloque de código que esté ejecutando se ejecute en el contexto de, por ejemplo, la AppPool
(es decir, NETWORKSERVICE
) con la que se ejecuta su servicio o sitio.
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
}
}
Sin embargo, un detalle súper importante es que todo el código que llama a Active Directory debe estar en ese bloque. Había usado algún código. Un miembro del equipo mío escribió que devolvía los resultados de una consulta LINQ
de tipo Users
(clase personalizada), pero no evaluaba la expresión (mala práctica). Por lo tanto, se devolvió el árbol de expresión en lugar de los resultados.
Lo que terminó sucediendo es que el código de llamada finalmente evaluó los resultados y aún apareció el mensaje An operations error occurred
. Pensé que la corrección de código anterior no funcionaba. Cuando de hecho lo hizo, pero había un código que evaluaba los resultados fuera del bloque.
En pocas palabras, asegúrese de que todo el código para acceder a Active Directory esté dentro de ese bloque de using
y la excepción se debe corregir si el servicio / aplicación se implementa en el servidor.
En mi caso, el grupo de aplicaciones web se estaba ejecutando como "DefaultAppPool", que no tenía suficiente acceso para conectarse al Directorio Activo de la Compañía. Entonces, suplante una cuenta que tiene acceso a AD en mi código y todo funcionó bien.
Esto me sucedió en ASP.NET (Windows 2008 R2 / IIS7) donde estaba jugando con Web.config y este error comenzó a suceder en cada llamada a FindByIdentity. La causa principal fue que el Pool de aplicaciones se ejecutaba como DefaultAppPool, y comenzó a funcionar nuevamente una vez que lo cambié para ejecutarlo como servicio de red. No entiendo muy bien por qué se cambiaría, pero lo hizo.
Para mí, me encontré con el mismo problema al intentar iniciar sesión en uno de los controladores de dominio, tengo 2 controladores de dominio, 1 de ellos está funcionando y el otro no funciona, creo que tiene algo que ver con el perfil de usuario, sigue investigando ...
Si obtuvo un código de error, "Ocurrió un error de operaciones (0x80072020)" , podría significar "Acceso denegado" .
- Verifique su servidor web ya sea en AD Domain o no
- Si no, debes poner la autenticación en 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;
}
Referencia
Yo tuve el mismo problema. Logré el éxito después de cambiar el grupo de aplicaciones de la siguiente manera: Perfil de usuario de la carga del modelo de proceso = verdadero