Разница между NativeGuid и Guid в Active Directory - PullRequest
19 голосов
/ 29 октября 2009

Мне нужно обновить код запроса AD и использовать новые объекты .NET 3.5 System.DirectoryServices.AccountManagement для управляемого запроса AD, в отличие от нашего текущего метода использования LDAP.

Я обнаружил странную проблему при чтении значения UserPrincipal.Guid. Оказывается, он похож на Guids, который мы использовали через LDAP, но отличается от него.

Сначала они выглядели совершенно по-другому, но во втором дубле я увидел, что последняя половина идентична, а первая половина просто транспонирована, т.е.:

Новый (.NET 3.5) метод GUID: 01234567-89ab-CDEF-0123-456789abcdef
Предыдущий (LDAP) метод GUID: 67452301-ab89-EFCD-0123-456789abcdef

Я проверил код LDAP и увидел, что мы используем поле SearchResult.GetDirectoryEntry (). NativeGuid для получения Old Guid.

У него есть другое свойство под названием SearchResult.GetDirectoryEntry (). Guid, идентичное идентификатору GUID, который я получаю с помощью новых классов .Net 3.5.

Мой вопрос: почему они (вроде) разные и что мне следует использовать?

1 Ответ

22 голосов
/ 02 ноября 2009

Как вы уже догадались, они оба представляют одно и то же значение. Разница в форматировании; DirectoryEntry.NativeGUID отображается в порядке с прямым порядком байтов (без черточек), как «изначально» хранится в службе каталогов, а UserPricipal.GUID/DirectoryEntry.GUID отображается в порядке с прямым порядком байтов (с черточками). Подробности смотрите в статье в Википедии Endianess .

Поэтому, когда вы распечатываете значение для NativeGUID (строка), оно не должно показывать никаких штрихов (как в вашем примере), если вы не создадите новый GUID, используя строку в качестве ввода (Guid ng = new Guid(de.NativeGuid);). Это создаст некоторую путаницу ...

Важно не смешивать их при сохранении GUID во внешнем источнике данных или при сохранении NativeGUID в качестве GUID с прямым порядком байтов.

Поэтому я бы выбрал UserPricipal.GUID / DirectoryEntry.GUID, потому что именно так отображается атрибут objectGUID с использованием большинства инструментов управления Windows (таких как «Пользователи и компьютеры Active Directory» и «Редактирование ADSI») и как он хранится и отображается в SQL. Сервер при использовании типа данных uniqueidentifier. Также; вам нужно перейти «ниже» UserPrincipal (GetUnderlyingObject()), чтобы получить значение NativeGUID (или преобразовать свойство UserPrincipal.GUID в little-endian).

Так что я думаю, вам придется решить, переносить ли ваши существующие «внешние» данные в GUID-формат или продолжать использовать NativeGUID-формат. Прямо сейчас я предполагаю, что вы где-то посередине.

...