我已经在 Python 2.7 上测试了以下内容,但主要思想应该是相同的。
MSDN documentation on msExchMailboxGuid 指出它的语法是 2.5.5.10,据记录,in this table 是一个八位字节字符串。
这似乎在 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 字符串,我们可以从this blog post 移植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 可能只是因为没有与相关用户关联的值而显示为空字符串。特别是如果你使用我刚刚列出的代码,你需要专门处理这种情况。