2009-10-29 18 views
19

Necesito actualizar algunos códigos de consultas de AD y quiero utilizar los nuevos objetos .NET 3.5 System.DirectoryServices.AccountManagement para consultar AD de forma administrada en lugar de nuestro método actual de usar LDAP .Diferencia entre NativeGuid y Guid en Active Directory

Me encontré con un problema extraño al leer el valor de UserPrincipal.Guid. Resulta que es similar pero diferente de las Guids que hemos estado utilizando a través de LDAP.

Al principio se veía completamente diferente, pero en una segunda toma, he visto que la última mitad son idénticos y la primera mitad están mera transposición es decir:

Nueva (.NET 3.5) Método GUID: -89ab-CdeF-0123-456789abcdef
Anterior (LDAP) Método GUID: 67452301 -ab89-efcd-0123-456789abcdef

he comprobado el código LDAP y vi que estábamos usando el SearchResult.GetDirectoryEntry () .NativeGuid campo para obtener el Viejo Guid.

Tiene una propiedad diferente llamada SearchResult.GetDirectoryEntry(). Guid que es idéntico al GUID que recupero utilizando las nuevas clases .Net 3.5.

Mi pregunta es, ¿por qué son (algo así como) diferentes y cuáles debo usar?

Respuesta

22

Como has adivinado, ambas son representaciones del mismo valor exacto. La diferencia está en el formato; DirectoryEntry.NativeGUID se muestra en orden little-endian (sin guiones) que es cómo se almacena "de forma nativa" en el servicio de directorio y UserPricipal.GUID/DirectoryEntry.GUID se muestra en orden big-endian (con guiones). Vea el artículo de Wikipedia en Endianess para más detalles.

Así que cuando imprima el valor de NativeGUID (una cadena) no debería mostrar ningún guiones (como su ejemplo) a menos que cree un nuevo GUID usando la cadena como entrada (Guid ng = new Guid(de.NativeGuid);). Eso creará cierta confusión ...

Lo importante es no mezclar los dos cuando se guardan los GUID en una fuente de datos externa o almacenar un NativeGUID como un GUID big-endian.

Así que iría por el UserPricipal.GUID/DirectoryEntry.GUID porque así es como se muestra el atributo objectGUID usando la mayoría de las herramientas de administración de Windows (como usuarios y equipos de Active Directory y ADSI Edit) y cómo se almacena y muestra en SQL Server cuando usa el tipo de datos uniqueidentifier. También; necesitarás ir a "debajo" de UserPrincipal (GetUnderlyingObject()) para obtener el valor de NativeGUID (o convertir la propiedad UserPrincipal.GUID a little-endian).

Así que supongo que tendrá que decidir si desea migrar sus datos "externos" existentes al formato GUID o continuar usando el formato NativeGUID. En este momento supongo que estás en el medio.

+0

¡Gracias! Eso fue una gran ayuda. –

Cuestiones relacionadas