Windows-Server-2008
在 Active Directory 中將 GUID 解析為字元串的腳本
我試圖了解以下 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 的這篇博文以獲得更詳盡的解釋。