Я пытаюсь понять вывод следующего сценария 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
У меня вопрос:
Set obj = GetObject("LDAP://CN=Username,CN=Users,DC=DOMAIN,DC=COM")
?Сначала ответьте на последний вопрос: да, вам нужна учетная запись домена, в противном случае 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}
См. Также это сообщение в блоге от Эрика Липперта за более подробное объяснение.