【问题标题】:How to get the value of msExchMailboxGuid of an Actvie Directory user by python script如何通过 python 脚本获取 Active Directory 用户的 msExchMailboxGuid 的值
【发布时间】:2023-06-05 06:34:01
【问题描述】:

我可以通过 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 下运行脚本。 任何答案都值得赞赏!

【问题讨论】:

    标签: python active-directory win32com


    【解决方案1】:

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

    【讨论】:

    • 感谢您的代码。我认为有一个 ) 错过了第二次打印。但它在这里不起作用,我收到以下消息: print('{}: {}'.format(e.Name, ''.join(['{:x}'.format(ord(x)) for x in e.Value]))) TypeError: 'NoneType' object is not iterable
    • @user1430185:我编辑了上面的代码。但是请注意,如果您最终的值是None,这往往意味着该帐户没有msExchMailboxGuid 值,这很有可能......我在上面添加了一个检查这种情况.
    • 太棒了!我在这里呆了几个小时。谢谢。
    • @user1430185:很高兴能帮到你。