以下を 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
はいえ、問題のユーザーに関連付けられた値がないという理由だけで、 が空の文字列として表示される場合があります。特に、先ほど説明したコードを使用する場合は、そのケースを特別に処理する必要があります。