MAPI IExchangeModifyTable arabirimini kullanarak Exchange klasör izinlerini değiştirme

Makale çevirileri Makale çevirileri
Makale numarası: 297493 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bir Exchange sunucusuna özel ve ortak klasörün izinlerini IExchangeModifyTable arabirimi kullanılarak erişilebilen Erişim Denetim Listesi'ni (ACL) tablo nesnelerinde depolanır. Bu makalede, eklemek, değiştirmek veya bu arabirimi kullanarak kullanıcı izinlerini kaldırmak gösterilmiştir.

Daha fazla bilgi

IExchangeModifyTable::ModifyTable yöntemi, Exchange klasörleri kullanıcı izinlerini değiştirmek için kullanabilirsiniz. ModifyTable satırları üzerinde gerçekleştirilen işlemleri ve bir tablodan satır temsil eden ROWENTRY yapıları dizisi içeren bir ROWLIST yapısı alır. ROWENTRY yapısında, ulRowFlags alanda gerçekleştirilecek işlemi belirtmeniz gerekir. Ayrıca, bir tabloya eklenecek sütunları değerlerini gösteren SPropValue yapıları dizisi belirtmeniz gerekir. Örneğin,:
  • Bir kullanıcı izin eklemek için <a0></a0>, ulRowFlags ROW_ADD için ayarlanan ve PR_MEMBER_ENTRYID ve PR_MEMBER_RIGHTS SPropValue için belirtin.
  • Kullanıcı bir izni değiştirmek için <a0></a0>, ulRowFlags ROW_MODIFY için ayarlanan ve PR_MEMBER_ID ve PR_MEMBER_RIGHTS SPropValue için belirtin.
  • Bir kullanıcı izni kaldırmak için <a0></a0>, ulRowFlags ROW_REMOVE için ayarlanan ve PR_MEMBER_ID SPropValue için belirtin.

Örnek kod

Microsoft, programlama örneklerini yalnızca gösterim amacıyla sağlar; satılabilirlik ve/veya belirli bir amaca uygunluk da dahil, ancak bununla sınırlı olmamak kaydıyla, örtülü veya açık garanti vermez. Bu makale, gösterilen programlama dilini ve yordamları oluşturmak ve hata ayıklamak amacıyla kullanılan araçları kullanmayı bildiğinizi varsayar. Microsoft destek uzmanları, belirli bir yordamın işlevselliğinin açıklanmasına yardımcı olabilir, ancak gereksinimlerinizi karşılamaya yönelik olarak ek işlevsellik sağlamak veya yordamlar geliştirmek amacıyla bu örnekleri değiştirmezler.
Programlama deneyiminiz kısıtlıysa, bir Microsoft Sertifikalı İş Ortağı'na veya Microsoft Danışmanlık Hizmetleri'ne başvurabilirsiniz. Daha fazla bilgi için şu Microsoft Web sitelerini ziyaret edin:

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

Microsoft danışma belgesi Hizmetleri - http://support.microsoft.com/gp/advisoryservice

Kullanılabilir destek seçenekleri ve Microsoft'a başvurma konusunda daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin: http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMSÖrnek kod çalıştırmak için şu adımları izleyin:
  1. Win32 Console Application AppWizard kullanarak, yeni, boş bir proje oluşturun ve "ModifyTable" olarak adlandırın.
  2. Yeni bir C++ kaynak dosyası projeye ekleyin ve "ModifyTable.cpp" olarak adlandırın.
  3. Aşağıdaki kodu ModifyTable.cpp yapıştırın.
    #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. Ana işlevi, Klasörüm tüm ortak klasörler altında ortak klasör adla değiştirin.
  5. Ana işlevi, kullanıcı diğer adı, izin eklemek ve her iki ModifyPermission ilk parametreyi değiştirmek istediğiniz AddUserPermission çağrısıyla ve RemovePermission çağrıları ilk parametre ile kullanıcının görünen adını değiştirin.
  6. AddUserPermission işlevinde szServerDN Exchange Kuruluş adınızı ve site adını yansıtacak şekilde değiştirin.
  7. Proje menüsünde Ayarlar ' ı tıklatın ve sonra da bağlantı sekmesini tıklatın. Nesne/Kitaplığı modülleri, edkutils.lib exchsdk.lib mapi32.lib msvcrt.lib kernel32.lib version.lib user32.lib ve advapi32.lib ekleyin. Tüm varsayılan kitaplıkları Yoksay ' ı seçmek için tıklatın.
  8. Derleme ve sonra Projeyi derleyin.
  9. Kesme noktaları ana işlevi AddUserPermission ModifyPermission ve RemovePermission çağrılarında yerleştirin.
  10. Hata Ayıklaması'nı başlatmak için F5 tuşuna basın ve istendiğinde profil adı seçin.
  11. Ilk kesme ulaşıldığında, F10 tuşuna basın. "Publishing Yazar" izni olan kullanıcı izni eklendiğini doğrulamak için Microsoft Outlook klasör iznini denetleyin.
  12. F10 tuşuna yeniden basın ve sonra da kullanıcının iznini "Gözden geçirici için" değiştirildiğinde doğrulayın.
  13. F10 tuşuna yeniden basın ve sonra da kullanıcının iznini kaldırıldığını doğrulayın.

Özellikler

Makale numarası: 297493 - Last Review: 24 Şubat 2014 Pazartesi - Gözden geçirme: 5.6
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Exchange Server 5.5 Standard Edition
  • Microsoft Exchange 2000 Server Standard Edition
  • Microsoft Messaging Application Programming Interface
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbhowto kbmsg KB297493 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:297493

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