1

次のように、PythonスクリプトによってActiveDirectoryユーザーのいくつかの属性を取得できます。

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は文字列ではないようですが、その値を出力するにはどうすればよいですか?Python3.2.3でスクリプトを実行します。どんな答えでも大歓迎です!

4

1 に答える 1

0

以下を Python 2.7 でテストしましたが、主な考え方は同じです。

msExchMailboxGuidに関するMSDN のドキュメントには、構文が 2.5.5.10 であることが記載されています。これは、この表に記載されているように、オクテット文字列です。

これは、Python では無意味な Unicode 文字列として表されているようです。ord()文字を整数に変換する関数を使用して、これを 16 進文字の文字列に変換できます。

これにより、次のようになります。

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これにより、 が 16 進文字列として出力されます。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 に答える