如何在Coldfusion中将Active Directory objectGUID转换为UUID

时间:2018-06-08 18:29:25

标签: coldfusion active-directory uuid

我有一个返回objectGUID的CFLDAP查询。如何在ColdFusion中将其转换为8-4-4-4-12模式中的有效UUID字符串?

我已指定returnAsBinary="ObjectGUID",但toString(getLDAP.ObjectGUID)未返回所需的结果。

更新

我尝试了binaryEncode():

<cfset guid = binaryencode(getLDAP.objectguid,"HEX")> 

返回:

18E0CE3388B79C4EA4D73894AE8CD8F6

但是我期待这个(由另一个我无法看到转换步骤的进程提取和提供)。

3cee018-b788-4e9c-a4d7-3894ae8cd8f6 
嗯......虽然他们不匹配,但后半部分是一样的。 a4d7-3894ae8cd8f6

3 个答案:

答案 0 :(得分:2)

  哼哼......下半场是一样的

有趣。来自this thread的链接解释了原因。显然,它是more involved than just converting the binary into hex, in one shot

  
      
  1. 首先,要知道形成虚线字符串的字节索引的顺序:   [3] [2] [1] [0] - [5] [4] - [7] [6] - [8] [9] - [10] [11] [12] [13] [14] [15]
  2.   
  3. 接下来,将位屏蔽应用于数组中访问的每个单字节值。
  4.   
  5. 然后转换为值的十六进制表示。
  6.   
  7. 只需确保十六进制值是一个两位数值,而不是“A”,它应该是“0A”
  8.   

由于CF的数组是基于1的,所以只需在位置上加+1。这将以正确的顺序构建解码后的字符串(没有破折号,您可以使用字符串函数轻松添加)。

 // Get GUID binary
 bin = yourQuery.objectGUID[rowNumber];
 // Extract bytes in this sequence
 order = [4,3,2,1, 6,5, 8,7, 9,10,11,12,13,14,15,16];
 // Stores converted bytes
 hex = [];

 for (pos in order) {
    // Apply mask to current byte and convert to hext 
    arrayAppend(hex, formatBaseN(BitAnd(bin[pos], 255), 16));
 }

 writeOutput("Hex string = "& arrayToList(hex, ""));

答案 1 :(得分:1)

是的......我在一篇旧的CF帖子中找到了它,它对我有用:

<CFLDAP ACTION="query" NAME="getLDAP" START="DC=info,DC=sys" SCOPE="subtree" STARTROW="1" maxRows="1"
SERVER="#domainCONTROLLER#" USERNAME="#USERNAME#" PASSWORD="#PASSWORD#" PORT="389" TIMEOUT="60"
ATTRIBUTES="sAMAccountName,mail,name,givenName,middleName,sn,title,department,ObjectGUID"
FILTER="sAMAccountName=#session.username#"
returnAsBinary = "ObjectGUID">

<cfset hexguid = BinaryEncode(getLDAP.objectguid,"Hex")>
<cfset sthex = toString(hexguid)>

<cfset GuidStr = mid(sthex,7,2)>
<cfset GuidStr = GuidStr & mid(sthex,5,2)>
<cfset GuidStr = GuidStr & mid(sthex,3,2)>
<cfset GuidStr = GuidStr & mid(sthex,1,2)>
<cfset GuidStr = GuidStr & mid(sthex,11,2)>
<cfset GuidStr = GuidStr & mid(sthex,9,2)>
<cfset GuidStr = GuidStr & mid(sthex,15,2)>
<cfset GuidStr = GuidStr & mid(sthex,13,2)>
<cfset GuidStr = GuidStr & mid(sthex,17,18)>
<cfset guid = left(GuidStr,8) & "-" & mid(GuidStr,9,4) & "-" & mid(GuidStr,13,4) & "-" & mid(GuidStr,17,4) & "-" & mid(GuidStr,21,18)>

你的雄辩更有说服力。谢谢!

答案 2 :(得分:1)

这是我为Pentaho Kettle的“ Modified Javascript”步骤所做的JavaScript实现。

它以字节[16]数组的形式从Java接收if (!Array.isArray) { Array.isArray = function(arg) { return arg.constructor === Array; }; } ,并继续使用Java类进行处理。

objectGUID

这不是Coldfusion方言,是的,但希望对扫描网络以解决类似任务的人有用。