在Active Directory中将GUIDparsing为string的脚本

我想了解下面的VB脚本的输出,该脚本将GUIDparsing为活动目录中的string:

http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B325649

本文演示如何将对象的GUID的hexstringforms转换为其stringforms:

将以下代码粘贴到.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属性返回一个hex值的string,它是根据GUID数据结构sorting的。 由于前4个字节存储为DWORD,后面跟着2个WORD,所以必须考虑字节序 。 英特尔机器存储WORD和DWORDs小端编码( 最低有效字节在前),所以你必须扭转前4个字节的字节顺序。 数据结构的其余部分是一个字节数组,所以这些字节已经按照正确的顺序排列。

例:

假设你有这样一个hexstring:

 000102030405060708090a0b0c0d0e0f 

你会像这样拆分它:

 00010203 0405 0607 08090a0b0c0d0e0f DWORD WORD WORD BYTE[] 

由于小端编码,您必须颠倒前4个字节的顺序(每个2位hex值代表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) 

string的其余部分表示一个字节数组,所以这些字节按顺序使用:

 GUIDStr = GUIDStr + Mid(strOctet, 17, Len(strOctet)) 

下一条指令将hexstring格式化为一个GUIDstring,将数字正确分组(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) & "}" 

导致下面的string:

 {03020100-0504-0706-0809-0a0b0c0d0e0f} 

请参阅Eric Lippert的博客文章 ,以获得更全面的解释。