我已经在 Python 2.7 上测试了以下内容,但主要思想应该是相同的。
msExchMailboxGuid 上的MSDN 文档指出它的语法是 2.5.5.10,如本表中所述,它是一个八位字节字符串。
这似乎在 Python 中表示为一串毫无意义的 unicode 字符。ord()
我们可以使用将字符转换为整数的函数将其转换为十六进制字符串。
这给了我们这样的东西:
import win32com.client
ldap="SELECT cn, mail, msExchMailboxGuid From 'LDAP://OU=XXXXXXXX,DC=center,DC=intranet,DC=sinotrans'"
c = win32com.client.Dispatch('ADODB.Connection')
c.Open('Provider=ADsDSOObject')
rs,rc = c.Execute(ldap)
rs.MoveFirst()
while not rs.EOF:
for e in rs.fields:
if e.Name != 'msExchMailboxGuid':
print('{}: {}'.format(e.Name, e.Value))
else:
print('{}: {}'.format(e.Name, ''.join(['{:x}'.format(ord(x)) for x in e.Value]))
print()
rs.MoveNext()
这应该将 输出msExchMailboxGuid
为十六进制字符串。要将msExchMailboxGuid
值显示为格式良好的 GUID 字符串,我们可以从这篇博客文章HexGuidToGuidStr
中移植该函数,如下所示:
def hex_to_guid(s):
return '-'.join([
''.join(s[8-2*x:10-2*x] for x in range(1, 5)),
''.join(s[12-2*x:14-2*x] for x in range(1, 3)),
''.join(s[16-2*x:18-2*x] for x in range(1, 3)),
s[16:20],
s[20:]
])
最后得到:
import win32com.client
ldap="SELECT cn, mail, msExchMailboxGuid From 'LDAP://OU=XXXXXXXX,DC=center,DC=intranet,DC=sinotrans'"
c = win32com.client.Dispatch('ADODB.Connection')
c.Open('Provider=ADsDSOObject')
rs,rc = c.Execute(ldap)
rs.MoveFirst()
while not rs.EOF:
for e in rs.fields:
if e.Name != 'msExchMailboxGuid':
print('{}: {}'.format(e.Name, e.Value))
else:
if e.Value is not None:
print('{}: {}'.format(e.Name, hex_to_guid(''.join(['{:x}'.format(ord(x)) for x in e.Value]))))
print()
rs.MoveNext()
说了这么多,msExchMailboxGuid
可能仅仅因为没有与相关用户关联的值而显示为空字符串。特别是如果您使用我刚刚列出的代码,您需要特别处理这种情况。