2012-06-01 34 views
1

我可以通過Python腳本Active Directory用戶的一些屬性如下:如何獲得由python腳本的一個ACTVIE Directory用戶的msExchMailboxGUID的價值

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() 

但如果我加上「msExchMailboxGUID的」到SQL查詢子句,msExchMailboxGuid的值始終爲。 看來msExchMailboxGuid不是一個字符串,我如何打印它的值?我在Python 3.2.3下運行腳本。 任何答案都讚賞!

回答

0

我已經在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作爲十六進制字符串。爲了得到顯示爲一個很好的格式化的GUID字符串msExchMailboxGuid值,我們可以端口從this blog postHexGuidToGuidStr功能如下:

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僅僅因爲沒有與所討論的用戶相關的值而可能顯示爲空字符串。特別是如果您使用我剛剛佈置的代碼,則需要專門處理該案例。

+0

謝謝你的代碼。我認爲有一個)錯過了第二張照片。 但它不起作用,我得到以下消息: print('{}:{}'。format(e.Name,''.join(['{:x}'.format(ord(x ))for e.Value])))012) TypeError:'NoneType'對象不可迭代 – user1430185

+0

@ user1430185:我編輯了上面的代碼。但是,請注意,如果結果爲「無」,則這往往意味着該帳戶沒有「msExchMailboxGuid」值,這很可能...我爲上面的情況添加了一個檢查。 – ig0774

+0

太棒了!我在這裏呆了幾個小時。謝謝。 – user1430185

相關問題