Python LDAP将objectGUID转换为十六进制字符串及其逆转换

2 投票
4 回答
5620 浏览
提问于 2025-04-18 17:15

我该如何把python-ldap返回的二进制ldap属性转换成好看的十六进制表示,然后再转换回来,以便在ldap过滤器中使用呢?

4 个回答

1

我们可以使用Python的uuid库来获取十六进制表示。

import uuid

object_guid_from_ldap_ad = '\x1dC\xce\x04\x88h\xffL\x8bX|\xe5!,\x9b\xa9'

guid = uuid.UUID(bytes=object_guid_from_ldap_ad)
# To hex
guid.hex
# To human readable
str(guid)
# Back to bytes
assert guid.bytes == object_guid_from_ldap_ad

问题的第二部分的答案是...

可以使用从LDAP/AD中提取的原始objectGUID,或者Python UUID对象的guid.bytes来创建搜索过滤器,这两者是一样的。

举个例子:

search_filter = ('(objectGUID=%s)' % object_guid_from_ldap_ad)

或者

search_filter = ('(objectGUID=%s)' % guid.bytes)

然后你可以在LDAP搜索中使用你的search_filter。

3

我没法直接用上面的代码把一个字符串形式的 objectGUID 转换成可以用在 ldap 查询中的格式。不过,参考了 @Rel 的代码和 @hernan 的评论后,我终于搞明白该怎么做了。我把这个过程分享出来,希望像我一样的人能更清楚怎么用上面的细节来制定搜索过滤器。以下是我所做的:

从一个字符串形式的 objectGuid 开始(我借用了上面的那个),我先把里面的连字符去掉。

guidString = '496772af-6219-4d45-b250-3963fba0e277'.replace("-","")

接着,你需要把前面三个分组的字符按对调换顺序。我生成的顺序如下:

newOrder = [6,7,4,5,2,3,0,1,10,11,8,9,14,15,12,13]       # the weird-ordered stuff
for i in range(16, len(guidString)): newOrder.append(i)  # slam the rest on

然后,我根据这个顺序创建了一个新的字符串:

guid_string_in_search_order = str.join('', [guidString[i] for i in newOrder]) 
guidSearch = ''.join(['\\%s' % str.join('',guid_string_in_search_order[i:i+2]) for i in range(0, len(guid_string_in_search_order), 2)])

接下来,你需要在每对字符前面加上转义的反斜杠:

guidSearch = ''.join(['\\%s' % str.join('',guid_string_in_search_order[i:i+2]) for i in range(0, len(guid_string_in_search_order), 2)])

这样你就得到了一个 guidSearch:

'\\af\\72\\67\\49\\19\\62\\45\\4d\\b2\\50\\39\\63\\fb\\a0\\e2\\77'

然后把它变成一个 ldap 查询字符串:

search_filter = '(objectGUID={})'.format(guidSearch)

这样就可以准备进行 ldap 查询了。我觉得有经验的人可能能用更少的步骤完成这个,但至少你可以跟着我做的步骤来理解。

4

如果你想把数据转换成十六进制字符串或者从十六进制字符串转换回来,可以考虑使用Python自带的 uuid模块

import uuid


object_guid = 'Igr\xafb\x19ME\xb2P9c\xfb\xa0\xe2w'
guid = uuid.UUID(bytes=object_guid)

# to hex
assert guid.hex == '496772af62194d45b2503963fba0e277'

# to human-readable guid
assert str(guid) == '496772af-6219-4d45-b250-3963fba0e277'

# to bytes
assert guid.bytes == object_guid == 'Igr\xafb\x19ME\xb2P9c\xfb\xa0\xe2w'
2

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能在使用一个叫做“库”的东西时,发现它的某些功能不太好用,或者出现了错误。这种情况其实很常见,很多人都会碰到。

当你在使用这些工具时,可能会看到一些错误信息,或者发现某些功能没有按照预期工作。这时候,最好的办法就是去查阅相关的文档,看看有没有人遇到过类似的问题,或者有没有解决方案。

另外,社区论坛,比如StackOverflow,就是一个很好的地方。在那里,你可以找到很多其他程序员分享的经验和解决方案。如果你有问题,也可以把你的情况描述清楚,问问大家,通常会有人愿意帮你。

总之,遇到问题时不要慌张,先查资料,看看有没有解决办法,或者向社区求助,很多时候你并不是一个人在战斗。

def guid2hexstring(val):
    s = ['\\%02X' % ord(x) for x in val]
    return ''.join(s)

guid = ldapobject.get('objectGUID', [''])[0] # 'Igr\xafb\x19ME\xb2P9c\xfb\xa0\xe2w'
guid2string(guid).replace("\\", "") # '496772AF62194D45B2503963FBA0E277'

#and back to a value you can use in an ldap search filter

guid = ''.join(['\\%s' % guid[i:i+2] for i in range(0, len(guid), 2)]) # '\\49\\67\\72\\AF\\62\\19\\4D\\45\\B2\\50\\39\\63\\FB\\A0\\E2\\77'

searchfilter = ('(objectGUID=%s)' % guid)

撰写回答