Cómo recuperar las ACL de carpetas que no se propietario

Seleccione idioma Seleccione idioma
Id. de artículo: 197743 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se muestra cómo tener acceso a la lista de control de acceso (ACL) de una carpeta pública que no pertenezca al usuario que actualmente ha iniciado la sesión. Aunque el código de ejemplo es específico para este propósito, puede modificarse fácilmente el mismo código para tener acceso o modificar las ACL de cualquier carpeta en cualquier almacén de información.

Más información

La lista de control de acceso de cualquier carpeta de Exchange determinado de Microsoft está incluida en el PR_ACL_DATA o el PR_ACL_TABLE las propiedades de esa carpeta.

Las siguientes funciones se utilizan para tener acceso a las ACL de una carpeta pública en un almacén de información de Exchange. Para revisar los datos de la propiedad PR_ACL_DATA, debe obtener los datos en una estructura SRowSet. Obtener esta información en la estructura SRowSet es el propósito principal del código siguiente.

Las siguientes bibliotecas deben vincularse estáticamente con el proyecto:
  • Kernel32.lib
  • User32.lib
  • Version.lib
  • Advapi32.lib
  • Msvcrt.lib
  • Mapi32.lib
  • Edkguid.lib
  • Edkutils.lib
  • Edkmapi.lib
  • Addrlkup.lib
  • Edkdebug.lib
  • Mblogon.lib

Ejemplo de código

    // TODO: Change these constants to reflect the folder and server of
    // interest.
    #define STR_FOLDER_NAME "\\IPM_SUBTREE\\AFolder"
    #define STR_DN_SERVERNAME "/O=Org/OU=AServer"\ 
         "/CN=Configuration/CN=Servers"\ 
         "/CN=AServer/CN=Org Private MDB"

    #include <windows.h>
    #include <edk.h>
    #include <mapidbg.h>
    #include <stdio.h>
    #include <conio.h>
    #include <mspab.h>

    static   LPMAPISESSION    lpSession =                NULL;
    static   LPMDB            lpStore =                  NULL;
    static   CHAR             szStore[MAX_PATH + 1] =    {0};
    static   ULONG            cbEIDStore  =              0;
    static   LPENTRYID        lpEIDStore =               NULL;
    static   CHAR             szFolder[MAX_PATH + 1] =   {0};
    static   LPMAPIFOLDER     lpFolder =                 NULL;
    static   ULONG            cbEIDFolder =              0;
    static   LPENTRYID        lpEIDFolder =              NULL;


    HRESULT Logon ( LPMAPISESSION *pSession )
    {
      HRESULT hRes = S_OK;
      LPMAPISESSION pLocalSession = NULL;
      ULONG ulFlags = 0L;

      if ( FAILED ( hRes = MAPIInitialize ( NULL ) ) )
         goto Quit;

      ulFlags = MAPI_EXTENDED |
                MAPI_LOGON_UI |
                MAPI_EXPLICIT_PROFILE |
                MAPI_NEW_SESSION;

      if ( FAILED ( hRes = MAPILogonEx ( 0l,
                                         NULL,
                                         NULL,
                                         ulFlags,
                                         &pLocalSession ) ) )
         goto Quit;

      *pSession = pLocalSession;

    Quit:
      return hRes;
    }


    HRESULT ModifyACLS ( )
    {
      LPSRowSet      pRows   =      NULL;
      HRESULT        hr =           S_OK;
      ULONG          ulUIParam =    0;
      LPCIID         lpInterface =  NULL;
      ULONG          ulFlags =      MAPI_BEST_ACCESS;
      ULONG          ulObjType =    0;
      LPSTR          mstr =         NULL;
      LPMAPITABLE    m_lpMapiTbl=   NULL;
      ULONG          ulFlagsTable = 0;
      ULONG          lpulCount =    NULL;
      LPMDB          lpMailbox =    NULL;

      LPEXCHANGEMODIFYTABLE m_lpExchTbl =   NULL;

      SizedSPropTagArray ( 2, sptCols ) = { 2,
                                            PR_ENTRYID,
                                            PR_DISPLAY_NAME };


      // Logon to MAPI Session
      hr = Logon ( &lpSession );

      if (FAILED(hr))
      {

         MessageBox(NULL,"MAPI Logon failed",NULL,MB_OK);
         goto cleanup;
      }

      // Get entry ID of the Public Folders store
      hr = HrMAPIFindStore(lpSession,
                           "Public Folders",
                           &cbEIDStore,
                           &lpEIDStore);


      if (FAILED(hr))
      {
         MessageBox(NULL,"Message Store Not Found",NULL,MB_OK);
         goto cleanup;
      }

      // Open the Public Folders store
      hr = lpSession->OpenMsgStore(ulUIParam,
                                   cbEIDStore,
                                   lpEIDStore,
                                   lpInterface,
                                   ulFlags,
                                   &lpStore);

      if (FAILED(hr))
      {
         MessageBox(NULL,"Message Store Not Opened",NULL,MB_OK);
         goto cleanup;
      }

      // Logon to server and mailbox - as admin
      hr = HrMailboxLogon(lpSession,
                          lpStore,
                          STR_DN_SERVERNAME,
                          NULL, &lpMailbox);


      if (FAILED(hr))
      {
         MessageBox(NULL,"HrMailBoxLogon Failed",NULL,MB_OK);
         goto cleanup;
      }
      strcpy(szFolder, STR_FOLDER_NAME);

      // Get entry ID of specific public folder
      hr = HrMAPIFindFolderEx(lpMailbox,
                              '\\',
                              szFolder,
                              &cbEIDFolder,
                              &lpEIDFolder);

      if (FAILED(hr))
      {
         MessageBox(NULL,"Folder Not Found",NULL,MB_OK);
         goto cleanup;
      }

      // Open the folder in an IMAPIFolder interface
      hr = lpMailbox->OpenEntry(cbEIDFolder,
                                lpEIDFolder,
                                NULL,
                                MAPI_BEST_ACCESS,
                                &ulObjType,
                                (LPUNKNOWN FAR *)&lpFolder);

      if (FAILED(hr))
      {
         MessageBox(NULL,"Folder Could Not Be Opened",NULL,MB_OK);
         goto cleanup;
      }

      // Open the ACL table in an IExchangeModifyTable interface
      hr = lpFolder->OpenProperty(PR_ACL_TABLE,
                                  (LPGUID)&IID_IExchangeModifyTable,
                                  0,
                                  MAPI_DEFERRED_ERRORS,
                                  (LPUNKNOWN FAR *)&m_lpExchTbl);
      if (FAILED(hr))
         goto cleanup;

      // Open a MAPI table on the ACL table property.  This table can be
      // read to determine what the ACL table looks like.
      hr = m_lpExchTbl->GetTable(0, &m_lpMapiTbl);

      if (FAILED(hr))
      {
         hr = HR_LOG(E_FAIL);
         goto cleanup;
      }
      hr = m_lpMapiTbl->GetRowCount(ulFlagsTable,&lpulCount);

      if (FAILED(hr))
      {
         goto cleanup;
      }

      hr = HrQueryAllRows(m_lpMapiTbl,NULL, NULL, NULL, lpulCount,&pRows);
      if (FAILED(hr))
      {
         goto cleanup;
      }

    // You now have the PR_ACL_DATA in a SRowSet structure.

    cleanup:

      if (lpSession)
      {
         lpSession->Logoff(0, 0, 0);
         ULRELEASE(lpSession);
      }
      MAPIUninitialize();
      return 0;
    }
				

Propiedades

Id. de artículo: 197743 - Última revisión: lunes, 21 de marzo de 2005 - Versión: 2.2
La información de este artículo se refiere a:
  • Microsoft Exchange Development Kit 5.5
  • Microsoft Exchange Server 2003 Software Development Kit
Palabras clave: 
kbmt kbhowto kbmsg KB197743 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 197743
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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