1

我可以通过 python 脚本获取 Active Directory 用户的一些属性,如下所示:

import win32com.client

ldap="SELECT cn, mail 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:
        print('{}: {}'.format(e.Name, e.Value))
    print()
    rs.MoveNext()

但是,如果我在 SQL 查询子句中添加“msExchMailboxGuid”,则 msExchMailboxGuid 的值始终为 . 似乎 msExchMailboxGuid 不是字符串,我如何打印它的值?我在 Python 3.2.3 下运行脚本。任何答案表示赞赏!

4

1 回答 1

0

我已经在 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可能仅仅因为没有与相关用户关联的值而显示为空字符串。特别是如果您使用我刚刚列出的代码,您需要特别处理这种情况。

于 2012-06-01T12:29:48.407 回答