如何通过python脚本获取Actvie目录用户的msExchMailboxGuid值

如何通过python脚本获取Actvie目录用户的msExchMailboxGuid值,python,active-directory,win32com,Python,Active Directory,Win32com,我可以通过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.Exec

我可以通过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()
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:]
   ])
但是,如果我将“msExchMailboxGuid”添加到SQL查询子句中,则msExchMailboxGuid的值始终为。 msExchMailboxGuid似乎不是字符串,我如何打印它的值?我在Python 3.2.3下运行脚本。
感谢您的回答

我已经在Python2.7上测试了以下内容,但主要思想应该是相同的

注意到它的语法是2.5.5.10,如文档所示,它是一个八位字节字符串

在Python中,这似乎表示为一个无意义的unicode字符字符串。我们可以使用将字符转换为整数的函数将其转换为十六进制字符串

这给了我们这样的东西:

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
函数:

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

谢谢您的代码。我想第二次印刷遗漏了。但是它在这里不起作用,我得到以下消息:print({}:{}.format(e.Name),.join([{:x}.format(ord(x))for x in e.Value]))TypeError:'NoneType'对象不是iterable@user1430185:我编辑了上面的代码。但是,请注意,如果您的值为
None
,则可能意味着该帐户没有
msExchMailboxGuid
值,这是很有可能的。。。我在上面加了一张支票。太好了!我在这里呆了几个小时。谢谢。@user1430185:很高兴能帮到你。