Windows-Server-2008

在 Active Directory 中將 GUID 解析為字元串的腳本

  • January 13, 2013

我試圖了解以下 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

我的問題是:

  • 這個腳本的輸出是什麼?
  • 您是否必須有一個 domian 帳戶才能執行該命令Set obj = GetObject("LDAP://CN=Username,CN=Users,DC=DOMAIN,DC=COM")

先回答你最後一個問題:是的,你需要一個域帳戶,否則GetObject()會失敗。

至於你的第一個問題:該GUID屬性返回一個十六進制值的字元串,這些值是根據GUID 資料結構排序的。由於前 4 個字節儲存為 DWORD,後跟 2 個 WORD,因此您必須考慮字節序。英特爾機器儲存 WORD 和 DWORD 小端編碼(最低有效字節在前),因此您必須顛倒前 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}

另請參閱Eric Lippert 的這篇博文以獲得更詳盡的解釋。

引用自:https://serverfault.com/questions/466594