Tento článek demonstruje přístup k seznamu řízení přístupu (ACL) veřejné složky, která není vlastněna aktuálně přihlášeného uživatele. Zatímco ukázkový kód je specifický pro tento účel, stejný kód lze snadno upravit k přístupu nebo upravit ACL libovolné složky v úložišti žádné informace.
Seznam řízení přístupu libovolné dané složky Microsoft Exchange je obsažen v PR_ACL_DATA nebo PR_ACL_TABLE vlastnosti dané složky.
Následující funkce se používají k přístupu ACL do veřejné složky Exchange Information Store. Zkontrolujte data v PR_ACL_DATA vlastnost, musíte získat data do struktury SRowSet. Získání této informace do SRowSet struktury je hlavní účel kód níže.
Následující knihovny musí být staticky propojeny s projektu:
Kernel32.lib
User32.lib
Version.lib
Advapi32.lib
Msvcrt.lib
Mapi32.lib
Edkguid.lib
Edkutils.lib
Edkmapi.lib
Addrlkup.lib
Edkdebug.lib
Mblogon.lib
Ukázka kódu
// 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 článku: 197743 - Poslední aktualizace: 21. března 2005 - Revize: 2.2
Informace v tomto článku jsou určeny pro produkt:
Microsoft Exchange Development Kit 5.5
Microsoft Exchange Server 2003 Software Development Kit
Klíčová slova:
kbmt kbhowto kbmsg KB197743 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.