2012-03-16 16 views
5

me dieron el siguiente fragmento (SomeName/SomeDomain contiene valores reales en mi código)0x8000500C error ActiveDirectory cuando se atraviesa propiedades

var entry = new DirectoryEntry("LDAP://CN=SomeName,OU=All Groups,dc=SomeDomain,dc=com"); 
foreach (object property in entry.Properties) 
{ 
    Console.WriteLine(property); 
} 

Imprime bien para los primeros 21 propiedades, pero luego fracasan 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?

actualización

Es un atributo personalizado que falla.

He intentado usar entry.RefreshCache() y entry.RefreshCache(new[]{"theAttributeName"}) antes de enumerar las propiedades (que no me ayudaron).

Update2

entry.InvokeGet("theAttributeName") obras (y sin RefreshCache).

¿Alguien puede explicar por qué?

Update3

Funciona si yo proporciono el nombre completo de la máquina: LDAP://srv00014.ssab.com/CN=SomeName,xxxx

Bounty

estoy buscando una respuesta que se ocupa de 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
  • Como llegar tanto trabajo
+0

Mi primera conjetura en _why_ serían los permisos. ¿En qué contexto estás corriendo? –

+0

@ Mr.Disappointment: Acabo de probar con una cuenta que debería tener suficientes privilegios. No hay diferencia :( – jgauffin

+0

¿Puedes intentar especificar las credenciales de 'Dios' explícitamente a través del constructor? Solo como una comprobación de cordura. –

Respuesta

3

Si se quiere acceder a un atributo personalizado a partir de una máquina que no es parte del dominio en el que reside el atributo personalizado (las credenciales del usuario conectado no es importante) hay que p culo totalmente la nombre completo del objeto está intentando acceder a la caché del esquema de lo contrario en la máquina cliente no se actualiza correctamente, no importa todo el schema.refresh() llama a tomar

encontrado here. Esto parece ser su problema, dadas las actualizaciones hechas a la pregunta.

3

Con 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 de directorio no se puede convertir a/de un nativo tipo de datos
DS
1 coincidencias encontradas para "0x8000500C"

Googled "El tipo de datos de directorio no se puede convertir a/de un nativo" y considera esta KB: http://support.microsoft.com/kb/907462

+0

Eso no Explicar por qué funciona con el FQDN – jgauffin

+0

@jgauffin ¿Puede decirnos qué versión de sistema operativo y nivel de SP? ¿Qué es esta 22 propiedad? ¿Puede verla usando ADSIEDIT.MSC? Eso causa una excepción/falla cuando ve este 22ª propiedad? ¿Qué pasa con el complemento MMC AD, qué significa eso cuando ves esta propiedad? –

+0

woops atributo personalizado olvida el bit MMC, mira, esto podría ser una pista falsa, pero no es una propiedad No Establecer ¿es? Http://stackoverflow.com/questions/7990505/net-code-to-set-an-active-directory-attribute-to-not-set –

1

Tengo el mismo error. 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 bajo C: \ Users \ xxxx \ AppData \ Local \ Microsoft \ Windows \ SchCache \ xyz.sch.

Quitar este archivo y el programa funciona bien :)

0

simplemente me encontré con el problema y la mía estaba 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é la página web sería llegar a este error en la llamada FindByIdentity.

Resolví el problema usando el usuario correcto para el grupo de aplicaciones del sitio web. Tan pronto como lo solucioné, esto comenzó a funcionar.

Cuestiones relacionadas