2012-03-16 15 views
5

ho ottenuto il seguente frammento (SomeName/SomeDomain contiene i valori reali nel mio codice)ActiveDirectory 0x8000500C errore quando si attraversa proprietà

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

Esso stampa OK per i primi 21 proprietà, ma poi falliscono 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 

Perché? Come posso impedirlo?

Aggiornamento

Si tratta di un attributo personalizzato che non riesce.

Ho provato a utilizzare entry.RefreshCache() e entry.RefreshCache(new[]{"theAttributeName"}) prima di elencare le proprietà (che non ha aiutato).

Update2

entry.InvokeGet("theAttributeName") opere (e senza RefreshCache).

Qualcuno può spiegare perché?

Update3

Funziona se fornisco il nome di dominio completo alla voce: LDAP://srv00014.ssab.com/CN=SomeName,xxxx

Bounty

Sto cercando una risposta che affronta il seguente:

  • Perché entry.Properties["customAttributeName"] non riesce con l'eccezione menzionata
  • Perché entry.InvokeGet("customAttributeName") funziona
  • La causa dell'eccezione
  • Come ottenere sia lavorare
+0

La mia prima ipotesi su _why_ sarebbe permessi. In quale contesto stai correndo? –

+0

@ Mr.Disappointment: appena provato con un account che dovrebbe avere privilegi sufficienti. Nessuna differenza :( – jgauffin

+0

Puoi provare a specificare esplicitamente le credenziali di "Dio" tramite il costruttore? Proprio come un controllo di integrità. –

risposta

3

Se si vuole accedere ad un attributo personalizzato da una macchina che non è parte del dominio in cui l'attributo personalizzato risiede (le credenziali del utenti registrati non importa) si ha bisogno di p ass il nome completo qualificato dell'oggetto sta tentando di accedere altrimenti la cache dello schema sulla macchina client non è adeguatamente aggiornato, non importa tutto il schema.refresh() chiama a rendere

Trovato here. Sembra il tuo problema, visti gli aggiornamenti fatti alla domanda.

3

Utilizzando lo strumento Err.exe qui

http://www.microsoft.com/download/en/details.aspx?id=985

Sputa:
per hex 0x8000500c/decimale -2147463156:
E_ ADS_CANT_CONVERT_DATATYPE adserr.h
Il tipo di dati di directory non può essere convertito a/da un nativo tipo di dati
DS
1 corrispondenze trovate per "0x8000500C"

Googled "Il tipo di dati di directory non può essere convertito in/da un nativo" e pensano che questa KB: http://support.microsoft.com/kb/907462

+0

t spiegare perché funziona con il FQDN – jgauffin

+0

@jgauffin puoi farci sapere quale versione del sistema operativo e il livello SP? inoltre qual è questa proprietà 22nd? puoi vederlo utilizzando ADSIEDIT.MSC? ciò provoca un'eccezione/crash quando si visualizza questo 22nd property? Che dire dello snap-in MMC AD che cosa fa quando si visualizza questa proprietà? –

+0

woops attributo personalizzato dimentica il bit MMC, guarda questa potrebbe essere un'aringa rossa ma non è una proprietà Not Set? Http://stackoverflow.com/questions/7990505/net-code-to-set-an-active-directory-attribute-to-not-set –

1

Ho lo stesso errore. Ho letto e visto un sacco di domande sull'errore 0x8000500c elencando l'attributo da una DirectoryEntry. Potrei vedere, con Process Monitor (Sysinternals), che il mio processo ha letto un file di schema. Questo file di schema viene salvato in C: \ Users \ xxxx \ AppData \ Local \ Microsoft \ Windows \ SchCache \ xyz.sch.

rimuovere questo file e il programma funziona bene :)

0

Ho appena incontrato il problema e la mia era con un'applicazione web. Ho avuto questo bit di codice che estrae l'utente dall'autenticazione di Windows in IIS e recupera le informazioni da 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; 
    } 
} 

Questo ha funzionato bene nel mio test, ma quando ho pubblicato il sito sarebbe venuto su con questo errore su FindByIdentity chiamata.

Ho risolto il problema utilizzando l'utente corretto per il pool di applicazioni del sito Web. Non appena ho risolto ciò, questo ha iniziato a funzionare.

Problemi correlati