2009-10-29 7 views
19

Potrzebuję zaktualizować kod zapytania AD i chcę użyć nowych obiektów .NET 3.5 System.DirectoryServices.AccountManagement do zapytania AD w sposób zarządzany w przeciwieństwie do naszej obecnej metody używania LDAP .Różnica między NativeGuid i Guid w Active Directory

Napotkano na dziwny problem podczas odczytu wartości UserPrincipal.Guid. Okazuje się, że jest podobny do, ale różni się od Guidów, których używaliśmy przez LDAP.

Początkowo wyglądały zupełnie inaczej, ale na drugim odbiorze, widziałem, że ostatnie pół są identyczne i pierwsza połowa po prostu transpozycji tj

nowy (.NET 3.5) Metoda GUID: -89ab-cdef-0123-456789abcdef
Prev (LDAP) Metoda GUID: 67452301-ab89-efcd-0123-456789abcdef

Sprawdziłem kod LDAP i zobaczył, że używaliśmy SearchResult.GetDirectoryEntry (). Pole NativeGuid, aby uzyskać Stary Guid.

Ma inną właściwość o nazwie SearchResult.GetDirectoryEntry(). Guid, który jest identyczny z identyfikatorem GUID pobieranym przy użyciu nowych klas .Net 3.5.

Moje pytanie brzmi: dlaczego są one (w pewnym sensie) różne i z których powinienem skorzystać?

Odpowiedz

22

Jak można się domyślić, są one reprezentacjami dokładnie tej samej wartości. Różnica polega na formatowaniu; DirectoryEntry.NativeGUID jest wyświetlany w małej kolejności (bez myślników), co oznacza, że ​​jest przechowywany "natywnie" w usłudze katalogowej, a UserPricipal.GUID/DirectoryEntry.GUID jest wyświetlany w kolejności wielkich-endian (z myślnikami). Zobacz artykuł z Wikipedii pod numerem Endianess w celu uzyskania szczegółowych informacji.

Kiedy więc wydrukujesz wartość NativeGUID (ciąg znaków), nie powinna ona pokazywać żadnych kresek (jak twój przykład), chyba że utworzysz nowy GUID, używając łańcucha jako danych wejściowych (Guid ng = new Guid(de.NativeGuid);). To spowoduje pewne zamieszanie ...

Ważne jest, aby nie mieszać tych dwóch przy przechowywaniu identyfikatorów GUID w zewnętrznym źródle danych lub przechowywaniu NativeGUID jako identyfikatora GUID typu big-endian.

Więc idę na UserPricipal.GUID/DirectoryEntry.GUID, ponieważ w ten sposób wyświetlany jest atrybut objectGUID przy użyciu większości narzędzi do zarządzania systemem Windows (takich jak Użytkownicy i komputery Active Directory i Edycja ADSI) oraz sposób ich przechowywania i wyświetlania w SQL Server, gdy używasz typu danych uniqueidentifier. Również; musisz przejść "poniżej" UserPrincipal (GetUnderlyingObject()), aby uzyskać wartość NativeGUID (lub przekonwertować właściwość UserPrincipal.GUID na little-endian).

Sądzę, że musisz zdecydować, czy chcesz przenieść istniejące "zewnętrzne" dane do formatu GUID, czy kontynuować korzystanie z formatu NativeGUID. W tej chwili domyślam się, że jesteś gdzieś pomiędzy.

+0

Dziękujemy! To była ogromna pomoc. –

Powiązane problemy