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.
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;
}
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
(http://support.microsoft.com/kb/197743/en-us/
)
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.
¡Muchas gracias! Sus comentarios nos ayudarán a mejorar los contenidos de soporte. Para más opciones de asistencia, visite la página de Ayuda y soporte técnico.