我试图理解以下 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")
?
答案1
首先回答您的最后一个问题:是的,您需要一个域帐户,否则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 提供了更详细的解释。