Comment modifier les autorisations de dossier Exchange en utilisant l'interface MAPI IExchangeModifyTable

Traductions disponibles Traductions disponibles
Numéro d'article: 297493 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Agrandir tout | Réduire tout

Sommaire

Résumé

Les autorisations de dossier privé et public pour un serveur Exchange sont stockées dans des objets table liste de contrôle d'accès qui est accessible à l'aide de l'interface IExchangeModifyTable . Cet article explique comment ajouter, modifier ou supprimer des autorisations utilisateur à l'aide de cette interface.

Plus d'informations

Vous pouvez utiliser la méthode IExchangeModifyTable::ModifyTable pour modifier les autorisations utilisateur pour les dossiers Exchange. ModifyTable prend une structure ROWLIST , qui contient un tableau de structures ROWENTRY représentant des lignes dans la table et les opérations effectuées sur les lignes. Dans la structure ROWENTRY , vous devez spécifier l'opération à effectuer dans le champ ulRowFlags . Vous devez également spécifier un tableau de structures SPropValue représentant les valeurs de colonnes à être insérés dans la table. Par exemple :
  • Pour ajouter un utilisateur l'autorisation, la valeur ulRowFlags ROW_ADD et spécifiez PR_MEMBER_ENTRYID et PR_MEMBER_RIGHTS pour SPropValue .
  • Pour modifier une autorisation utilisateur, la valeur ulRowFlags ROW_MODIFY et spécifiez PR_MEMBER_ID et PR_MEMBER_RIGHTS pour SPropValue .
  • Pour supprimer un utilisateur l'autorisation, la valeur ulRowFlags ROW_REMOVE et spécifiez PR_MEMBER_ID pour SPropValue .

Exemple de code

Microsoft fournit des exemples de programmation à des fins d'illustration uniquement, sans garantie expresse ou implicite, y compris, mais sans limitation, toute garantie implicite de qualité marchande et/ou d'adéquation à un usage particulier. Cet article suppose que vous êtes familiarisé avec le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Professionnels du support technique Microsoft peuvent vous expliquer la fonctionnalité d'une procédure particulière, mais ils ne modifieront pas ces exemples afin de fournir des fonctionnalités supplémentaires ou des procédures pour répondre à vos besoins spécifiques de construction.
Si vous avez partiellement la programmation, il convient contacter un partenaire certifié Microsoft ou services de conseil Microsoft. Pour plus d'informations, visitez ces sites Web de Microsoft :

Microsoft certifié Partners - https://partner.microsoft.com/global/30000104

Services de conseil Microsoft - http://support.microsoft.com/gp/advisoryservice

Pour plus d'informations sur les options de support sont disponibles et sur la façon de contacter Microsoft, consultez le site Microsoft suivant : http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMSPour exécuter l'exemple de code, procédez comme suit :
  1. Utilisez AppWizard Application Console Win32, créez un nouveau projet vide et nommez-le «ModifyTable».
  2. Ajoutez un nouveau fichier source C++ au projet et nommez-le «ModifyTable.cpp».
  3. Collez le code suivant dans ModifyTable.cpp.
    #include <windows.h>
    #include <stdio.h>
    #include "edk.h"
    
    typedef 
    enum ACLRIGHTS
        { 
     RIGHTS_EDIT_OWN = 0x8,
     RIGHTS_EDIT_ALL = 0x20,
     RIGHTS_DELETE_OWN = 0x10,
     RIGHTS_DELETE_ALL = 0x40,
     RIGHTS_READ_ITEMS = 0x1,
     RIGHTS_CREATE_ITEMS = 0x2,
     RIGHTS_CREATE_SUBFOLDERS = 0x80,
     RIGHTS_FOLDER_OWNER = 0x100,
     RIGHTS_FOLDER_CONTACT = 0x200,
     RIGHTS_FOLDER_VISIBLE = 0x400,
     RIGHTS_NONE = 0,
     ROLE_OWNER = 0x5e3,
     ROLE_PUBLISH_EDITOR = 0x4e3,
     ROLE_EDITOR = 0x463,
     ROLE_PUBLISH_AUTHOR = 0x49b,
     ROLE_AUTHOR = 0x41b,
     ROLE_NONEDITING_AUTHOR = 0x413,
     ROLE_REVIEWER = 0x401,
     ROLE_CONTRIBUTOR = 0x402,
     ROLE_NONE = 0x400
        } ACLRIGHTS;
    
    enum {
        ePR_MEMBER_ENTRYID, 
        ePR_MEMBER_RIGHTS,  
        ePR_MEMBER_ID, 
        ePR_MEMBER_NAME, 
        NUM_COLS
    };
    
    SizedSPropTagArray(NUM_COLS, rgPropTag) =
    {
        NUM_COLS,
        {
            PR_MEMBER_ENTRYID,  // Unique across directory.
            PR_MEMBER_RIGHTS,  
            PR_MEMBER_ID,       // Unique within ACL table. 
            PR_MEMBER_NAME,     // Display name.
        }
    };
    
    
    STDMETHODIMP AddUserPermission(
       LPSTR szUserAlias, 
       LPMAPISESSION lpSession,
       LPEXCHANGEMODIFYTABLE lpExchModTbl, 
       ACLRIGHTS frights);
    
    STDMETHODIMP ModifyUserPermission(
       LPSTR szDisplayName, 
       LPEXCHANGEMODIFYTABLE lpExchModTbl, 
       ACLRIGHTS frights);
    
    STDMETHODIMP RemoveUserPermission(
       LPSTR szDisplayName, 
       LPEXCHANGEMODIFYTABLE lpExchModTbl);
    
    void  main()
    {
     HRESULT               hr = NULL;
     LPMAPISESSION         lpSession = NULL;
     LPMDB                 lpPubStore = NULL;
     LPMAPIFOLDER          lpPubFolder = NULL;
     LPMAPIFOLDER          lpMyFolder = NULL;
     LPEXCHANGEMODIFYTABLE lpExchModTbl= NULL; 
     
     hr = MAPIInitialize(NULL);
     if (FAILED(hr)) return;
    
     hr = MAPILogonEx(0,
          NULL,
          NULL,
          MAPI_LOGON_UI | MAPI_NEW_SESSION,
          &lpSession);
     if (FAILED(hr)) goto cleanup0; 
     
     // Open public folder store.
     hr = HrOpenExchangePublicStore(lpSession,
                                 &lpPubStore);
     if (FAILED(hr)) goto cleanup;
     
     // Open all public folders.
     hr = HrOpenExchangePublicFolders(lpPubStore,  
                                   &lpPubFolder);  
     if (FAILED(hr)) goto cleanup;
     
     // Replace with your public folder name.
     hr = HrMAPIOpenSubfolderEx(lpPubFolder, 
                             '\\',
                             "\\MyFolder", 
                             &lpMyFolder);
     if (FAILED(hr)) goto cleanup;
    
     hr = lpMyFolder->OpenProperty(PR_ACL_TABLE, 
                                 &IID_IExchangeModifyTable, 
                                 0, 
                                 MAPI_DEFERRED_ERRORS, 
                                 (LPUNKNOWN*)&lpExchModTbl);
        if(FAILED(hr)) goto cleanup;
    
     // Replace first parameter with user alias.
     // Add user with publishing author rights.
     hr = AddUserPermission(
       "userone", 
       lpSession,
       lpExchModTbl, 
       ROLE_PUBLISH_AUTHOR); 
     
     // Replace first parameter with user display name.
     // Modify user to have reviewer rights.
     hr = ModifyUserPermission(
       "User One", 
       lpExchModTbl, 
       ROLE_REVIEWER);
    
     // Replace first parameter with user display name.
     // Remove user rights.
     hr = RemoveUserPermission(
       "User One", 
       lpExchModTbl);
    
    
    cleanup:
     if (lpExchModTbl) 
      lpExchModTbl->Release();
     
     if (lpMyFolder)
      lpMyFolder->Release();
     if (lpPubFolder)
      lpPubFolder->Release();
     if (lpPubStore)
      lpPubStore->Release();
    
     lpSession->Logoff(0, MAPI_LOGOFF_UI, 0);
     lpSession->Release();
    
    cleanup0:
    
     MAPIUninitialize(); 
     return;
     
    }
    
    
    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;
    }
    
    STDMETHODIMP ModifyUserPermission(
       LPSTR szDisplayName, 
       LPEXCHANGEMODIFYTABLE lpExchModTbl, 
       ACLRIGHTS frights)
    {
     HRESULT      hr = S_OK;
     LPMAPITABLE  lpMapiTbl = NULL;
     ULONG        ulFlagsTable = 0;
     ULONG        lpulCount = NULL;
     LPSRowSet    pRows = NULL;
     UINT         i = 0;
     SPropValue   prop[2] = {0};
     ROWLIST      rowList  = {0};
     BOOLEAN      bFound = false;
     
     // Retrieve MAPI table. 
     hr = lpExchModTbl->GetTable(0,
                              &lpMapiTbl);
     if (FAILED(hr)) goto cleanup;
    
     hr = lpMapiTbl->GetRowCount(ulFlagsTable,
                              &lpulCount);
     if (FAILED(hr)) goto cleanup;
     
     hr = lpMapiTbl->SetColumns((LPSPropTagArray)&rgPropTag, 
                                0 );
     if (FAILED(hr)) goto cleanup;
    
     hr = HrQueryAllRows(lpMapiTbl,
                         NULL, 
                         NULL, 
                         NULL, 
                         lpulCount,
                         &pRows);
     if (FAILED(hr)) goto cleanup;
    
     for (i = 0; i < pRows -> cRows; i++)
     {
      if(PR_MEMBER_NAME == pRows ->aRow[i].lpProps[ePR_MEMBER_NAME].ulPropTag)
      {
       if (!strcmp(pRows -> aRow[i].lpProps[ePR_MEMBER_NAME].Value.lpszA, szDisplayName))
       {
        bFound = true;
        if (PR_MEMBER_ID == pRows -> aRow[i].lpProps[ePR_MEMBER_ID].ulPropTag)
        {
         prop[0].ulPropTag  = PR_MEMBER_ID;
         prop[0].Value.bin.cb = pRows -> aRow[i].lpProps[ePR_MEMBER_ID].Value.bin.cb;
         prop[0].Value.bin.lpb = (BYTE*)pRows -> aRow[i].lpProps[ePR_MEMBER_ID].Value.bin.lpb;
         prop[1].ulPropTag  = PR_MEMBER_RIGHTS;
         prop[1].Value.l   = frights;
    
         rowList.cEntries    = 1;
         rowList.aEntries->ulRowFlags = ROW_MODIFY;
         rowList.aEntries->cValues  = 2;
         rowList.aEntries->rgPropVals = &prop[0];
         
         hr = lpExchModTbl->ModifyTable(0, &rowList);
         if(FAILED(hr)) goto cleanup;
         printf("Modified user permission.\n");
        }
       }
      }
     }
     if (!bFound)
      printf("User not there, no need to modify ...\n");
    cleanup:
     if (lpMapiTbl) 
      lpMapiTbl->Release();
     if (pRows)
      FreeProws(pRows);
     return hr;
    }
    
    STDMETHODIMP RemoveUserPermission(
       LPSTR szDisplayName, 
       LPEXCHANGEMODIFYTABLE lpExchModTbl)
    {
     HRESULT      hr = S_OK;
     LPMAPITABLE  lpMapiTbl = NULL;
     ULONG        ulFlagsTable = 0;
     ULONG        lpulCount = NULL;
     LPSRowSet    pRows = NULL;
     UINT         i = 0;
     SPropValue   prop[1] = {0};
     ROWLIST      rowList  = {0};
     BOOLEAN      bFound = false;
     
     // Retrieve MAPI table.
     hr = lpExchModTbl->GetTable(0, 
                              &lpMapiTbl);
     if (FAILED(hr)) goto cleanup;
    
     hr = lpMapiTbl->GetRowCount(ulFlagsTable,
                              &lpulCount);
     if (FAILED(hr)) goto cleanup;
     
     hr = lpMapiTbl->SetColumns((LPSPropTagArray)&rgPropTag, 
                               0 );
     if (FAILED(hr)) goto cleanup;
    
     hr = HrQueryAllRows(lpMapiTbl,
                         NULL, 
                         NULL, 
                         NULL, 
                         lpulCount,
                         &pRows);
     if (FAILED(hr)) goto cleanup;
    
     for (i = 0; i < pRows -> cRows; i++)
     {
      if(PR_MEMBER_NAME == pRows -> aRow[i].lpProps[ePR_MEMBER_NAME].ulPropTag)
      {
       if (!strcmp(pRows -> aRow[i].lpProps[ePR_MEMBER_NAME].Value.lpszA, szDisplayName))
       {
        printf("Found User to remove\n");
        bFound = true;
        if (PR_MEMBER_ID == pRows -> aRow[i].lpProps[ePR_MEMBER_ID].ulPropTag)
        {
         prop[0].ulPropTag  = PR_MEMBER_ID;
         prop[0].Value.bin.cb = pRows -> aRow[i].lpProps[ePR_MEMBER_ID].Value.bin.cb;
         prop[0].Value.bin.lpb = (BYTE*)pRows -> aRow[i].lpProps[ePR_MEMBER_ID].Value.bin.lpb;
         rowList.cEntries    = 1;
         rowList.aEntries->ulRowFlags = ROW_REMOVE;
         rowList.aEntries->cValues  = 1;
         rowList.aEntries->rgPropVals = &prop[0];
        
         hr = lpExchModTbl->ModifyTable(0,
                                     &rowList);
         if(FAILED(hr)) goto cleanup;
         printf("Removed user permission. \n");
        }
       }
      }
     }
     if (!bFound)
      printf("User not there, no need to remove. \n");
    cleanup:
     if (lpMapiTbl) 
      lpMapiTbl->Release();
     if (pRows)
      FreeProws(pRows);
     return hr;
    }
  4. Dans la fonction principale , remplacez votre nom de dossier public sous tous les dossiers publics MonDossier.
  5. Dans la fonction principale , remplacez le premier paramètre au AddUserPermission appel à un utilisateur alias pour lequel vous souhaitez ajouter des autorisations et remplacer le premier paramètre à deux le ModifyPermission et appelle la RemovePermission par nom complet de l'utilisateur.
  6. Dans la fonction AddUserPermission, remplacez szServerDN pour refléter votre nom de l'organisation Exchange et le nom du site.
  7. Dans le menu projet , cliquez sur paramètres et puis cliquez sur l'onglet lien . Dans les Modules objet/bibliothèque , ajoutez edkutils.lib exchsdk.lib mapi32.lib msvcrt.lib kernel32.lib version.lib user32.lib et advapi32.lib. Cliquez sur Ignorer toutes les bibliothèques par défaut .
  8. Compilez et puis générez le projet.
  9. Placez des points d'arrêt sur les appels AddUserPermission, ModifyPermission et RemovePermission dans la fonction principale .
  10. Appuyez sur F5 pour démarrer le débogage et choisissez le nom de profil lorsque vous y êtes invité.
  11. Appuyez sur F10 lorsque le premier point d'arrêt est atteint. Vérifier l'autorisation de dossier à partir de Microsoft Outlook pour vérifier que l'utilisateur l'autorisation a été ajoutée avec l'autorisation «Auteur principal».
  12. Appuyez à nouveau sur F10 et vérifiez que l'autorisation d'utilisateur est modifiée en "Relecteur".
  13. Appuyez à nouveau sur F10 et vérifiez que l'autorisation d'utilisateur est supprimée.

Propriétés

Numéro d'article: 297493 - Dernière mise à jour: lundi 24 février 2014 - Version: 5.6
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Exchange Server 5.5 Standard Edition
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Messaging Application Programming Interface
Mots-clés : 
kbnosurvey kbarchive kbmt kbhowto kbmsg KB297493 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 297493
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com