c# - usuario - Error de ActiveDirectory 0x8000500c al atravesar propiedades
single sign on c# active directory (4)
Acabo de encontrar el problema y el mío fue con una aplicación web. Tenía este código que saca al usuario de la autenticación de Windows en IIS y extrae su información de AD.
using (var context = new PrincipalContext(ContextType.Domain))
{
var name = UserPrincipal.Current.DisplayName;
var principal = UserPrincipal.FindByIdentity(context, this.user.Identity.Name);
if (principal != null)
{
this.fullName = principal.GivenName + " " + principal.Surname;
}
else
{
this.fullName = string.Empty;
}
}
Esto funcionó bien en mis pruebas, pero cuando publiqué el sitio web aparecería este error en la llamada a FindByIdentity.
Solucioné el problema utilizando el usuario correcto para el grupo de aplicaciones del sitio web. Tan pronto como lo solucioné, esto comenzó a funcionar.
SomeName
el siguiente fragmento ( SomeName
/ SomeDomain
contiene valores reales en mi código)
var entry = new DirectoryEntry("LDAP://CN=SomeName,OU=All Groups,dc=SomeDomain,dc=com");
foreach (object property in entry.Properties)
{
Console.WriteLine(property);
}
Imprime OK para las primeras 21 propiedades, pero luego falla con:
COMException {"Unknown error (0x8000500c)"}
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.PropertyEnumerator.get_Entry()
at System.DirectoryServices.PropertyCollection.PropertyEnumerator.get_Current()
at ActiveDirectory.Tests.IntegrationTests.ObjectFactoryTests.TestMethod1() in MyTests.cs:line 22
¿Por qué? ¿Cómo puedo prevenirlo?
Actualizar
Es un atributo personalizado que falla.
Intenté utilizar entry.RefreshCache()
y entry.RefreshCache(new[]{"theAttributeName"})
antes de enumerar las propiedades (que no ayudaron).
Actualización2
entry.InvokeGet("theAttributeName")
funciona (y sin RefreshCache
).
¿Alguien puede explicar por qué?
Actualización3
Funciona si proporciono el FQDN al elemento: LDAP://srv00014.ssab.com/CN=SomeName,xxxx
Generosidad
Estoy buscando una respuesta que aborde lo siguiente:
- Por qué
entry.Properties["customAttributeName"]
falla con la excepción mencionada - Por qué funciona
entry.InvokeGet("customAttributeName")
- La causa de la excepción
- Cómo hacer que ambos trabajen
Tengo el mismo fracaso. Me leen y vi muchas preguntas sobre el error 0x8000500c al enumerar el atributo de un DirectoryEntry. Pude ver, con Process Monitor (Sysinternals), que mi proceso ha leído un archivo de esquema. Este archivo de esquema se guarda en C: / Users / xxxx / AppData / Local / Microsoft / Windows / SchCache / xyz.sch.
Elimine este archivo y el programa funciona bien :)
Usando la herramienta Err.exe aquí
http://www.microsoft.com/download/en/details.aspx?id=985
Escupe:
para hex 0x8000500c / decimal -2147463156:
E_ADS_CANT_CONVERT_DATATYPE adserr.h
El tipo de datos del directorio no se puede convertir a / desde un nativo
Tipo de datos DS
1 coincidencias encontradas para "0x8000500c"
Google "El tipo de datos del directorio no se puede convertir a / desde un nativo" y encontró este KB: http://support.microsoft.com/kb/907462
Si uno quiere acceder a un atributo personalizado desde una máquina que no es parte del dominio donde reside el atributo personalizado (las credenciales del usuario conectado no tienen importancia) uno necesita pasar el nombre totalmente calificado del objeto que intenta De lo contrario, el caché de esquema en la máquina cliente no se actualiza correctamente, no importa todas las llamadas a schema.refresh () que realice
Encontrado aquí . Esto parece ser su problema, dadas las actualizaciones hechas a la pregunta.