MAPI IExchangeModifyTable インターフェイスを使用して Exchange フォルダーのアクセス許可を変更する方法

文書翻訳 文書翻訳
文書番号: 297493 - 対象製品
この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
すべて展開する | すべて折りたたむ

目次

概要

Exchange サーバーに対してプライベートおよびパブリック フォルダー権限は、 IExchangeModifyTable インターフェイスを使用してアクセスできるアクセス制御リスト (ACL) テーブル オブジェクトに格納されます。 ここを追加、変更、またはこのインターフェイスを使用してユーザーのアクセス許可を削除する方法について説明します。

詳細

Exchange フォルダーのユーザー アクセス許可の変更、 IExchangeModifyTable::ModifyTable メソッドを使えます。 ModifyTable は、テーブルとそれらの行に対して実行される処理の行を表す ROWENTRY 構造体の配列を含む ROWLIST 構造体、します。 ROWENTRY 構造で ulRowFlags フィールドで実行される操作を指定してください。 テーブルに挿入される列の値を表す SPropValue 構造体の配列を指定する必要も。 たとえば。
  • ユーザー アクセス許可を追加、 ulRowFlags ROW_ADD に設定し、 SPropValue の PR_MEMBER_ENTRYID と PR_MEMBER_RIGHTS を指定します。
  • ユーザー アクセス許可を変更、 ulRowFlags ROW_MODIFY に設定し、 SPropValue の PR_MEMBER_ID と PR_MEMBER_RIGHTS を指定します。
  • ユーザー アクセス許可を削除するには、を ROW_REMOVE、 ulRowFlags を設定して、 SPropValue の PR_MEMBER_ID を指定します。

サンプル コード

マイクロソフトは提供プログラミング言語の使用方法の一例としてのみ、姿表現または明示、黙示、黙示または商品性および特定目的に対する適合性に限らずなどです。 この資料は、例示されているプログラミング言語やプロシージャの作成およびデバッグに使用するツールについて理解されているユーザーを対象としています。 Microsoft Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。
プログラミング経験がいない場合、マイクロソフト アドバイザリー サービスのマイクロソフト認定パートナーを連絡することがあります。 詳細については、これらのマイクロソフト Web サイトを参照してください。

マイクロソフト認定パートナー - https://partner.microsoft.com/global/30000104

Microsoft のアドバイザリ サービス - http://support.microsoft.com/gp/advisoryservice

使用可能なサポート オプションおよびマイクロソフトに連絡する方法についての詳細については、次のマイクロソフト Web サイトを参照してください: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMSサンプルを実行するには、次の手順を実行します:
  1. Win32 コンソール アプリケーション AppWizard を使用して、新しい空プロジェクト作成し、"ModifyTable"という名前です。
  2. プロジェクトに新しい C++ ソース ファイルを追加し、"ModifyTable.cpp"を名前します。
  3. 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. メイン 関数で MyFolder [すべてのパブリック フォルダーの下にあるパブリック フォルダー名に置き換えます。
  5. メイン 関数で、ユーザーの表示名、エイリアスをする、アクセス許可を追加して、両方の ModifyPermission を最初のパラメーターの置換をユーザーに AddUserPermission の呼び出しと RemovePermission の呼び出し、最初のパラメーターを置き換えます。
  6. AddUserPermission 関数で、Exchange 組織名とサイト名を反映する szServerDN を置き換えます。
  7. [ プロジェクト ] メニューの [ 設定 ] をクリックし、[ リンク ] タブ。 オブジェクト/ライブラリ モジュール ] で edkutils.lib exchsdk.lib mapi32.lib msvcrt.lib kernel32.lib version.lib user32.lib と advapi32.lib を追加します。 すべての既定のライブラリを無視する をクリックします。
  8. コンパイルし、[プロジェクトをビルドします。
  9. メイン 関数で、AddUserPermission、ModifyPermission、RemovePermission の呼び出しにブレークポイントを置きます。
  10. 、デバッグを開始する F5 を押しますが表示されたら、プロファイル名を選択します。
  11. 最初のブレークポイントに達した F10 キーを押してください。 「発行作成者」権限を持つユーザーのアクセス許可が追加されたことを確認する Microsoft Outlook からフォルダー アクセス許可をチェックします。
  12. ここでも、F10 キーを押し、ユーザーのアクセス許可が「参照者」に変更されたことを確認します。
  13. ここでも、F10 キーを押し、ユーザーのアクセス許可が削除されることを確認します。

プロパティ

文書番号: 297493 - 最終更新日: 2014年2月24日 - リビジョン: 5.6
この資料は以下の製品について記述したものです。
  • Microsoft Exchange Server 5.5 Standard Edition
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Messaging Application Programming Interface
キーワード:?
kbnosurvey kbarchive kbhowto kbmsg kbmt KB297493 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:297493
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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