用于在 Active Directory 中将 GUID 解析为字符串的脚本

用于在 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

我的问题是:

  • 该脚本的输出是什么?
  • 您是否必须拥有一个域帐户才能运行该命令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 提供了更详细的解释。

相关内容