Como modificar permissões da pasta Exchange utilizando a interface MAPI IExchangeModifyTable

Traduções de Artigos Traduções de Artigos
Artigo: 297493 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

As permissões de pasta privada e pública para um servidor do Exchange são armazenadas na lista de controlo de acesso (ACL) os objectos de tabela que podem ser acedidos utilizando a interface IExchangeModifyTable . Este artigo demonstra como adicionar, modificar ou remover permissões de utilizador utilizando esta interface.

Mais Informação

Pode utilizar o método IExchangeModifyTable::ModifyTable para alterar permissões de utilizador para pastas do Exchange. ModifyTable tem uma estrutura ROWLIST , que contém uma matriz de estruturas ROWENTRY que representam linhas na tabela e operações efectuadas nessas linhas. Na estrutura de ROWENTRY , tem de especificar a operação seja executada no campo ulRowFlags . Também tem de especificar uma matriz de estruturas de SPropValue que representam os valores de colunas a inserir na tabela. Por exemplo:
  • Para adicionar uma permissão de utilizador, defina ulRowFlags para ROW_ADD e especificar PR_MEMBER_ENTRYID e PR_MEMBER_RIGHTS para SPropValue .
  • Para modificar uma permissão de utilizador, defina ulRowFlags para ROW_MODIFY e especificar PR_MEMBER_ID e PR_MEMBER_RIGHTS para SPropValue .
  • Para remover uma permissão de utilizador, defina ulRowFlags para ROW_REMOVE e especificar PR_MEMBER_ID para SPropValue .

Exemplo de código

Microsoft fornece exemplos de programação ilustração só, sem garantia expressa ou implícita, incluindo, sem limitação, garantias implícitas de comercialização e/ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas utilizadas para criar e depurar procedimentos. Profissionais de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas.
Se dispõe de limitada experiência de programação, poderá contactar um Microsoft Certified Partner ou a serviços de aviso. Para obter mais informações, visite estes Web sites da Microsoft:

Microsoft certificado Partner - https://partner.microsoft.com/global/30000104

Serviços Microsoft aviso - http://support.microsoft.com/gp/advisoryservice

Para obter mais informações sobre as opções de suporte estão disponíveis e sobre como contactar a Microsoft, visite o seguinte Web site da Microsoft: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMSPara executar o código de exemplo, siga estes passos:
  1. Utilizando o AppWizard de aplicação de consola Win32, crie um novo projecto vazio e o nome "ModifyTable".
  2. Adicionar um novo ficheiro de origem C++ ao projecto e o nome "ModifyTable.cpp".
  3. Cole o código seguinte no 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. Na função principal , substitua minha pasta o nome de pasta pública em todas as pastas públicas.
  5. Na função principal , substitua o primeiro parâmetro para a chamada AddUserPermission com um utilizador do alias para o qual pretende adicionar permissões e substituir o primeiro parâmetro para ambos os o ModifyPermission e RemovePermission chamadas com nome do utilizador.
  6. Na função AddUserPermission, substitua szServerDN para reflectir o nome de organização do Exchange e o nome do site.
  7. No menu Project , clique em definições e, em seguida, faça clique sobre o separador ligação . Em Módulos/biblioteca de objectos , adicione edkutils.lib exchsdk.lib mapi32.lib msvcrt.lib kernel32.lib version.lib user32.lib e advapi32.lib. Clique para seleccionar Ignorar todas as bibliotecas predefinido .
  8. Compilar e, em seguida, criar o projecto.
  9. Colocar o AddUserPermission pontos de interrupção, ModifyPermission e RemovePermission chama a função principal .
  10. Prima F5 para iniciar a depuração e escolha o nome de perfil quando lhe for pedido.
  11. Prima F10 quando é atingido primeiro ponto de interrupção. Verificar a permissão de pasta do Microsoft Outlook para Verifique se a permissão de utilizador foi adicionada com a permissão "Publicação autor".
  12. Prima F10 novamente e verificar se a permissão do utilizador é alterada para "Revisor".
  13. Prima F10 novamente e verificar se a permissão do utilizador foi removida.

Propriedades

Artigo: 297493 - Última revisão: 24 de fevereiro de 2014 - Revisão: 5.6
A informação contida neste artigo aplica-se a:
  • Microsoft Exchange Server 5.5 Standard Edition
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Messaging Application Programming Interface
Palavras-chave: 
kbnosurvey kbarchive kbmt kbhowto kbmsg KB297493 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 297493

Submeter comentários

 

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