Назад | Перейти на главную страницу

Сценарий для преобразования GUID в строку в Active Directory

Я пытаюсь понять вывод следующего сценария VB, который преобразует GUID в строку в активном каталоге:

http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B325649

В этой статье показано, как преобразовать шестнадцатеричную строковую форму идентификатора GUID объекта в строковую форму:

Вставьте следующий код в файл .vbs.

'================================================================
'Set the next line to reflect a DN for an object in the directory
'================================================================
Set obj = GetObject("LDAP://CN=Username,CN=Users,DC=DOMAIN,DC=COM")
MsgBox "The GUID string Value for user " & obj.Get("DisplayName") & _
       " is " &  ConvertHexStringGUIDToStringGUID(obj.GUID)

'================================================================
' ConvertHexStringGUIDToStringGUID function
'================================================================
Function ConvertHexStringGUIDToStringGUID(strOctet)
    Dim tmpGUID, GUIDStr
    'Convert the string by flipping the bits around.
    GUIDStr = Mid(strOctet, 7, 2)
    GUIDStr = GUIDStr + Mid(strOctet,  5, 2)
    GUIDStr = GUIDStr + Mid(strOctet,  3, 2)
    GUIDStr = GUIDStr + Mid(strOctet,  1, 2)
    GUIDStr = GUIDStr + Mid(strOctet, 11, 2)
    GUIDStr = GUIDStr + Mid(strOctet,  9, 2)
    GUIDStr = GUIDStr + Mid(strOctet, 15, 2)
    GUIDStr = GUIDStr + Mid(strOctet, 13, 2)
    GUIDStr = GUIDStr + Mid(strOctet, 17, Len(strOctet))

    tmpGUID = "{" & Mid(GUIDStr,  1,  8) & "-" & Mid(GUIDStr,  9, 4) & _
              "-" & Mid(GUIDStr, 13,  4) & "-" & Mid(GUIDStr, 17, 4) & _
              "-" & Mid(GUIDStr, 21, 15) & "}"

    ConvertHexStringGUIDToStringGUID = tmpGUID
End Function

У меня вопрос:

Сначала ответьте на последний вопрос: да, вам нужна учетная запись домена, в противном случае GetObject() не удастся.

Что касается вашего первого вопроса: GUID свойство возвращает строку шестнадцатеричных значений, упорядоченных в соответствии с Структура данных GUID. Поскольку первые 4 байта хранятся как DWORD, за которым следуют 2 WORD, вы должны взять порядок байтов в учетную запись. Машины Intel хранят WORD и DWORD с прямым порядком байтов (младший байт first), поэтому вам нужно изменить порядок байтов первых 4 байтов. Остальная часть структуры данных представляет собой массив байтов, поэтому эти байты уже находятся в правильном порядке.

Пример:

Допустим, у вас есть такая шестнадцатеричная строка:

000102030405060708090a0b0c0d0e0f

Вы бы разбили это так:

00010203 0405 0607 08090a0b0c0d0e0f
DWORD    WORD WORD BYTE[]

Из-за кодировки с обратным порядком байтов вам необходимо изменить порядок первых 4 байтов (каждое 2-значное шестнадцатеричное значение представляет 1 байт):

03020100 0504 0706 08090a0b0c0d0e0f

Вот что делает эта часть кода (мои комментарии):

' reverse DWORD
GUIDStr = Mid(strOctet, 7, 2)
GUIDStr = GUIDStr + Mid(strOctet,  5, 2)
GUIDStr = GUIDStr + Mid(strOctet,  3, 2)
GUIDStr = GUIDStr + Mid(strOctet,  1, 2)
' reverse 1st WORD
GUIDStr = GUIDStr + Mid(strOctet, 11, 2)
GUIDStr = GUIDStr + Mid(strOctet,  9, 2)
' reverse 2nd WORD
GUIDStr = GUIDStr + Mid(strOctet, 15, 2)
GUIDStr = GUIDStr + Mid(strOctet, 13, 2)

Остальная часть строки представляет собой массив байтов, поэтому эти байты используются в следующем порядке:

GUIDStr = GUIDStr + Mid(strOctet, 17, Len(strOctet))

Следующая инструкция форматирует шестнадцатеричную строку в строку GUID, правильно группируя цифры (8-4-4-4-12):

tmpGUID = "{" & Mid(GUIDStr,  1,  8) & "-" & Mid(GUIDStr,  9, 4) & _
          "-" & Mid(GUIDStr, 13,  4) & "-" & Mid(GUIDStr, 17, 4) & _
          "-" & Mid(GUIDStr, 21, 15) & "}"

в результате получается следующая строка:

{03020100-0504-0706-0809-0a0b0c0d0e0f}

См. Также это сообщение в блоге от Эрика Липперта за более подробное объяснение.