2009-10-29 2 views
19

Devo aggiornare un po 'di codice di interrogazione di AD e voglio usare il nuovo .NET 3.5 System.DirectoryServices.AccountGli oggetti di gestione per interrogare AD in modo gestito invece del nostro attuale metodo di utilizzo di LDAP .Differenza tra NativeGuid e Guid in Active Directory

Ho riscontrato uno strano problema durante la lettura del valore UserPrincipal.Guid. Si scopre che è simile ma diverso dal Guids che abbiamo utilizzato tramite LDAP.

In un primo momento sembrava completamente diverso, ma su una seconda ripresa, ho visto che l'ultimo mezzo sono identici e nel primo semestre sono semplicemente cioè trasposte:

Nuova (3,5 NET) Metodo GUID: -89ab-CDEF-0123-456789abcdef
Prev (LDAP) Metodo GUID: 67.452.301-ab89-efcd-0123-456789abcdef

ho controllato il codice LDAP e ho visto che stavamo usando il SearchResult.GetDirectoryEntry (). Il campo di NationalGuid per ottenere il Vecchio Guid.

Ha una proprietà diversa chiamata SearchResult.GetDirectoryEntry(). Guid che è identico al GUID che richiamo utilizzando le nuove classi .Net 3.5.

La mia domanda è: perché sono (specie) diversi e quali dovrei usare?

risposta

22

Come avete indovinato, sono entrambe rappresentazioni dello stesso identico valore. La differenza è nella formattazione; DirectoryEntry.NativeGUID viene visualizzato nell'ordine little-endian (senza trattini), ovvero come viene memorizzato "in modo nativo" nel servizio directory e UserPricipal.GUID/DirectoryEntry.GUID viene visualizzato nell'ordine big-endian (con trattini). Vedere l'articolo di Wikipedia su Endianess per i dettagli.

Quindi quando si stampa il valore per NativeGUID (una stringa) non dovrebbe mostrare alcun trattino (come nell'esempio) a meno che non si crei un nuovo GUID utilizzando la stringa come input (Guid ng = new Guid(de.NativeGuid);). Ciò creerà un po 'di confusione ...

L'importante è non mescolare i due quando si memorizzano i GUID in un'origine dati esterna o si memorizza un NativeGUID come GUID big-endian.

Quindi andrei per UserPricipal.GUID/DirectoryEntry.GUID perché è così che l'attributo objectGUID viene visualizzato utilizzando la maggior parte degli strumenti di gestione di Windows (come Utenti e computer di Active Directory e Modifica ADSI) e come viene memorizzato e visualizzato in SQL Server quando si utilizza il tipo di dati uniqueidentifier. Anche; è necessario andare "sotto" UserPrincipal (GetUnderlyingObject()) per ottenere il valore NativeGUID (o convertire la proprietà UserPrincipal.GUID in little-endian).

Quindi suppongo che dovrai decidere se migrare i dati "esterni" esistenti nel formato GUID o continuare a utilizzare il formato NativeGUID. In questo momento immagino che tu sia nel mezzo.

+0

Grazie! E 'stato un grande aiuto. –