Подтвердить что ты не робот

Разница между NativeGuid и Guid в Active Directory

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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