2010-09-17 31 views
0

J'ai étendu l'interface MAPI win32comext avec l'interface IExchangeModifyTable pour modifier les ACL via l'interface MAPI. Je peux modifier les entrées ACL existantes, mais je me suis contenté d'ajouter de nouvelles entrées. J'ai besoin de l'ID d'entrée des utilisateurs d'ajouter, selon cet exemple CRécupération des ID d'entrée utilisateur à partir de MAPI

(Example Source from MSDN)

STDMETHODIMP AddUserPermission(
    LPSTR szUserAlias, 
    LPMAPISESSION lpSession, 
    LPEXCHANGEMODIFYTABLE lpExchModTbl, 
    ACLRIGHTS frights) 
{ 
HRESULT  hr = S_OK; 
LPADRBOOK lpAdrBook; 
ULONG  cbEid; 
LPENTRYID lpEid = NULL; 
SPropValue prop[2] = {0}; 
ROWLIST  rowList = {0}; 

char szExName[MAX_PATH]; 
// Replace with "/o=OrganizationName/ou=SiteName/cn=Recipients/cn=" 
char* szServerDN = "/o=org/ou=site/cn=Recipients/cn="; 

strcpy(szExName, szServerDN); 
strcat(szExName, szUserAlias); 

// Open the address book. 
hr = lpSession->OpenAddressBook(0, 
           0, 
           MAPI_ACCESS_MODIFY, 
           &lpAdrBook); 
if (FAILED(hr)) goto cleanup; 

// Obtain the entry ID for the recipient. 
hr = HrCreateDirEntryIdEx(lpAdrBook, 
          szExName, 
          &cbEid, 
          &lpEid); 
if (FAILED(hr)) goto cleanup; 

prop[0].ulPropTag = PR_MEMBER_ENTRYID; 
prop[0].Value.bin.cb = cbEid; 
prop[0].Value.bin.lpb = (BYTE*)lpEid; 
prop[1].ulPropTag = PR_MEMBER_RIGHTS; 
prop[1].Value.l = frights; 

rowList.cEntries = 1; 
rowList.aEntries->ulRowFlags = ROW_ADD; 
rowList.aEntries->cValues = 2; 
rowList.aEntries->rgPropVals = &prop[0]; 

hr = lpExchModTbl->ModifyTable(0, &rowList); 
if(FAILED(hr)) goto cleanup; 
printf("Added user permission. \n"); 

cleanup: 
if (lpAdrBook) 
    lpAdrBook->Release(); 
return hr; 
} 

Je peux ouvrir le carnet d'adresses, mais HrCreateDirEntryIdEx n'est pas fourni dans le mapi de pywin32. Je l'ai trouvé dans l'extension d'échange, qui ne compile pas sur mon système, le problème de bibliothèque manquant. Avez-vous une idée pour récupérer l'ID d'utilisateur?

Merci.

  • Patrick

Répondre

0

Je suis arrivé ce morceau de code et il fonctionne très bien

from binascii import b2a_hex, a2b_hex 
import active_directory as ad 


# entry_type, see http://msdn.microsoft.com/en-us/library/cc840018.aspx 
# + AB_DT_CONTAINER  0x000000100 
# + AB_DT_TEMPLATE  0x000000101 
# + AB_DT_OOUSER  0x000000102 
# + AB_DT_SEARCH  0x000000200 
# ab_flags, maybe see here: https://svn.openchange.org/openchange/trunk/libmapi/mapidefs.h 

def gen_exchange_entry_id(user_id, ab_flags=0, entry_type = 0): 
    muidEMSAB = "DCA740C8C042101AB4B908002B2FE182" 
    version = 1 

    # Find user and bail out if it's not there 
    ad_obj = ad.find_user(user_id) 
    if not ad_obj: 
     return None 

    return "%08X%s%08X%08X%s00" % (
     ab_flags, 
     muidEMSAB, 
     version, 
     entry_type, 
     b2a_hex(ad_obj.legacyExchangeDN.upper()).upper(), 
    ) 

data = gen_exchange_entry_id("myusername") 
print data 
print len(a2b_hex(data))