Настройка разрешений доступа к папкам для других пользователей с помощью EWS в Exchange

Узнайте, как задать уровни разрешений для папки с помощью управляемого API EWS или EWS в Exchange.

Разрешения на уровне папок позволяют пользователям получать доступ к одной или нескольким папкам в почтовом ящике другого пользователя. Разрешения для папок похожи на делегирование доступа, но отличаются следующими способами:

  • Разрешения папки не позволяют пользователю "отправить от имени" или "отправить как" другого пользователя. Они разрешают доступ только к папкам. Пользователи могут создавать элементы в этих папках, но не могут отправлять их.

  • Вы можете задать разрешения для любой папки в почтовом ящике, но можно добавить только делегата в папки "Календарь", "Контакты", "Входящие", "Журнал", "Заметки" и "Задачи".

  • Для определенной папки можно задать ряд разрешений. При добавлении делегата можно назначить только один из пяти уровней разрешений.

  • Вы можете задать разрешения для папок для анонимных пользователей и пользователей по умолчанию. Вы можете предоставить только делегированный доступ к учетной записи с поддержкой почты.

Если вы знакомы с контроль доступа записями (ACE) и списками дискреционных контроль доступа (DACLs), вы знаете, что пользователь может иметь только один набор разрешений для каждой папки. Если вы попытаетесь добавить набор разрешений для пользователя, который уже имеет набор разрешений, вы получите сообщение об ошибке. При добавлении, удалении или обновлении разрешений для папки вы получаете текущий DACL, добавляете или удаляете все ACE, а затем отправляете обновленный DACL. Нельзя добавить несколько ACE для одного пользователя. При обновлении разрешений с помощью Управляемого API EWS необходимо удалить текущий ACE пользователя, а затем добавить его новый ACE в коллекцию. Если вы используете EWS, вы просто замените предыдущий набор ACE новыми.

Если вы вносите несколько изменений разрешений в одну папку, вы можете выполнять пакетные добавления, удаления или обновления. Обратите внимание, что нельзя пакетировать обновления пользователей в нескольких папках. Один вызов требуется для получения разрешений на одну папку, а второй — для обновления разрешений для этой папки. При добавлении, удалении или обновлении разрешений пользователя для каждой задачи используются одни и те же два вызова метода или операции.

Таблица 1. Методы управляемого API EWS и операции EWS для настройки разрешений для папок

Что требуется сделать Используйте этот метод управляемого API EWS... Используйте эту операцию EWS...
Включение, удаление или обновление разрешений для папок
Folder.Bind , за которым следует Folder.Update
GetFolder , за которым следует UpdateFolder
Создание папки и определение разрешений для папок
Folder.Save
CreateFolder

Разрешения для папок

У вас есть довольно много вариантов, когда дело доходит до настройки разрешений для папки для определенной папки. Вы можете задать уровень разрешений для папки для каждого пользователя, который добавляет набор стандартных индивидуальных разрешений в DACL, или вы можете задать отдельные разрешения для папки, но вы не можете смешивать и сопоставлять.

Доступны следующие отдельные разрешения:

  • Может создать
  • Может создавать вложенные папки
  • Владелец папки
  • Папка отображается
  • Является ли контактом папки
  • Изменение элементов
  • Удаление элементов
  • Чтение элементов

Кроме того, доступны следующие уровни разрешений, определяющие подмножество отдельных разрешений и значений, как показано в таблице 2:

  • Нет
  • Владелец
  • PublishingEditor
  • Редактор
  • PublishingAuthor
  • Автор
  • NoneditingAuthor
  • Reviewer
  • Участник
  • Пользовательский — это значение не может быть задано приложением. Сервер задает это значение, если приложение включает настраиваемую коллекцию отдельных разрешений.
  • FreeBusyTimeOnly — это можно задать только в папках календаря.
  • FreeBusyTimeAndSubjectAndLocation — это можно задать только в папках календаря.

В следующей таблице показано, какие отдельные разрешения применяются по умолчанию в зависимости от уровня разрешений.

Табл. 2. Отдельные разрешения по уровню разрешений

Уровень разрешений. Может создавать элементы Может создавать вложенные папки Владелец папки Папка отображается Является ли контактом папки Изменение элементов Удаление элементов Может считывать элементы
Нет
Неверно.
Неверно.
Неверно.
Неверно.
Неверно.
Нет
Нет
Нет
Владелец
Да
Да
Да
Да
Да
Все
Все
FullDetails
PublishingEditor
Да
Верно.
Неверно.
Верно.
Неверно.
Все
Все
FullDetails
Редактор
Верно.
Неверно.
Неверно.
Верно.
Неверно.
Все
Все
FullDetails
PublishingAuthor
Да
Верно.
Неверно.
Верно.
Неверно.
Принадлежит
Принадлежит
FullDetails
Автор
Верно.
Неверно.
Неверно.
Верно.
Неверно.
Принадлежит
Принадлежит
FullDetails
NoneditingAuthor
Верно.
Неверно.
Неверно.
Верно.
Неверно.
Нет
Принадлежит
FullDetails
Reviewer
Неверно.
Неверно.
Неверно.
Верно.
Неверно.
Нет
Нет
FullDetails
Участник
Верно.
Неверно.
Неверно.
Верно.
Неверно.
Нет
Нет
Нет

Если в запросе на разрешения на уровне папки указан не пользовательский уровень разрешений, указывать отдельные параметры разрешений не нужно. Если при задании уровня разрешений указать отдельное разрешение, в ответе будет возвращена ошибка ErrorInvalidPermissionSettings .

Добавление разрешений для папок с помощью управляемого API EWS

В следующем примере кода показано, как использовать управляемый API EWS для:

  • Создайте объект FolderPermission для нового пользователя.

  • Получите текущие разрешения для папки с помощью метода Bind .

  • Добавьте новый объект FolderPermissions в свойство Folder.Permissions .

  • Вызовите метод Update , чтобы сохранить новые разрешения на сервере.

В этом примере предполагается, что служба является допустимым объектом ExchangeService для владельца почтового ящика и что пользователь прошел проверку подлинности на сервере Exchange Server.

static void EnableFolderPermissions(ExchangeService service)
{
    // Create a property set to use for folder binding.
    PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, FolderSchema.Permissions);
    // Specify the SMTP address of the new user and the folder permissions level.
    FolderPermission fldperm = new FolderPermission("sadie@contoso.com", FolderPermissionLevel.Editor);
    
    // Bind to the folder and get the current permissions. 
    // This call results in a GetFolder call to EWS.
    Folder sentItemsFolder = Folder.Bind(service, WellKnownFolderName.SentItems, propSet);
 
    // Add the permissions for the new user to the Sent Items DACL.
    sentItemsFolder.Permissions.Add(fldperm);
    // This call results in a UpdateFolder call to EWS.
    sentItemsFolder.Update();
}

В следующей строке кода указывается уровень разрешений.

    FolderPermission fldperm = new FolderPermission("sadie@contoso.com", FolderPermissionLevel.Editor);

Если вы хотите использовать пользовательский уровень разрешений, используйте этот код.

FolderPermission fldperm = new FolderPermission();
fldperm.UserId = "sadie@Contoso1000.onmicrosoft.com";
fldperm.CanCreateItems = true;
fldperm.CanCreateSubFolders = true;
…

При создании объекта FolderPermission с настраиваемым уровнем разрешений можно задать любые или все свойства FolderPermission. Обратите внимание, однако, что для folderPermissionLevel никогда явно не устанавливается значение Custom в приложении. Параметр FolderPermissionLevel имеет значение Custom только при создании объекта FolderPermission и настройке отдельных разрешений.

Добавление разрешений для папок с помощью EWS

В следующих примерах кода EWS показано, как добавить разрешения в определенную папку путем получения текущих разрешений, а затем отправки списка новых разрешений.

Первым шагом является отправка запроса GetFolder , в котором значение DistinguishedFolderId указывает папку, в которую нужно добавить разрешения (папка Отправленные в этом примере), а значение FieldURI содержит folder:PermissionSet. Этот запрос извлекает параметры разрешений для указанной папки.

Это также XML-запрос, который управляемый API EWS отправляет при вызове метода Bind для добавления разрешений для папки.

  <?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                 xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
                 xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" 
                 xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
      <t:RequestServerVersion Version="Exchange2007_SP1" />
    </soap:Header>
    <soap:Body>
      <m:GetFolder>
        <m:FolderShape>
          <t:BaseShape>IdOnly</t:BaseShape>
          <t:AdditionalProperties>
            <t:FieldURI FieldURI="folder:PermissionSet" />
          </t:AdditionalProperties>
        </m:FolderShape>
        <m:FolderIds>
          <t:DistinguishedFolderId Id="sentitems" />
        </m:FolderIds>
      </m:GetFolder>
    </soap:Body>
  </soap:Envelope>

Сервер отвечает на запрос GetFolder сообщением GetFolderResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что папка успешно получена. Значения FolderId и ParentFolderId сокращены для удобства чтения.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="893"
                         MinorBuildNumber="17"
                         Version="V2_10"
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetFolderResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetFolderResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Folders>
            <t:Folder>
              <t:FolderId Id="CgAAAA=="
                          ChangeKey="AQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiRd1" />
              <t:PermissionSet>
                <t:Permissions>
                  <t:Permission>
                    <t:UserId>
                      <t:DistinguishedUser>Default</t:DistinguishedUser>
                    </t:UserId>
                    <t:CanCreateItems>false</t:CanCreateItems>
                    <t:CanCreateSubFolders>false</t:CanCreateSubFolders>
                    <t:IsFolderOwner>false</t:IsFolderOwner>
                    <t:IsFolderVisible>false</t:IsFolderVisible>
                    <t:IsFolderContact>false</t:IsFolderContact>
                    <t:EditItems>None</t:EditItems>
                    <t:DeleteItems>None</t:DeleteItems>
                    <t:ReadItems>None</t:ReadItems>
                    <t:PermissionLevel>None</t:PermissionLevel>
                  </t:Permission>
                  <t:Permission>
                    <t:UserId>
                      <t:DistinguishedUser>Anonymous</t:DistinguishedUser>
                    </t:UserId>
                    <t:CanCreateItems>false</t:CanCreateItems>
                    <t:CanCreateSubFolders>false</t:CanCreateSubFolders>
                    <t:IsFolderOwner>false</t:IsFolderOwner>
                    <t:IsFolderVisible>false</t:IsFolderVisible>
                    <t:IsFolderContact>false</t:IsFolderContact>
                    <t:EditItems>None</t:EditItems>
                    <t:DeleteItems>None</t:DeleteItems>
                    <t:ReadItems>None</t:ReadItems>
                    <t:PermissionLevel>None</t:PermissionLevel>
                  </t:Permission>
                </t:Permissions>
              </t:PermissionSet>
            </t:Folder>
          </m:Folders>
        </m:GetFolderResponseMessage>
      </m:ResponseMessages>
    </m:GetFolderResponse>
  </s:Body>
</s:Envelope>

Затем используйте операцию UpdateFolder , чтобы отправить обновленный набор разрешений, который включает разрешение для нового пользователя. Обратите внимание, что включение элемента SetFolderField для соответствующей папки в операции UpdateFolder приведет к перезаписи всех параметров разрешений в папке. Аналогичным образом, включая параметр DeleteFolderField операции UpdateFolder , также будут удалены все параметры разрешений в папке.

Это также XML-запрос, который управляемый API EWS отправляет при вызове метода Update для добавления разрешений для папки.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:UpdateFolder>
      <m:FolderChanges>
        <t:FolderChange>
          <t:FolderId Id="CgAAAA=="
                      ChangeKey="AQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiRd1" />
          <t:Updates>
            <t:SetFolderField>
              <t:FieldURI FieldURI="folder:PermissionSet" />
              <t:Folder>
                <t:PermissionSet>
                  <t:Permissions>
                    <t:Permission>
                      <t:UserId>
                        <t:DistinguishedUser>Default</t:DistinguishedUser>
                      </t:UserId>
                      <t:PermissionLevel>None</t:PermissionLevel>
                    </t:Permission>
                    <t:Permission>
                      <t:UserId>
                        <t:DistinguishedUser>Anonymous</t:DistinguishedUser>
                      </t:UserId>
                      <t:PermissionLevel>None</t:PermissionLevel>
                    </t:Permission>
                    <t:Permission>
                      <t:UserId>
                        <t:PrimarySmtpAddress>sadie@contoso.com</t:PrimarySmtpAddress>
                      </t:UserId>
                      <t:PermissionLevel>Editor</t:PermissionLevel>
                    </t:Permission>
                  </t:Permissions>
                </t:PermissionSet>
              </t:Folder>
            </t:SetFolderField>
          </t:Updates>
        </t:FolderChange>
      </m:FolderChanges>
    </m:UpdateFolder>
  </soap:Body>
</soap:Envelope>

В следующей строке кода указывается уровень разрешений.

<t:Permission>
    <t:UserId>
        <t:PrimarySmtpAddress>sadie@contoso.com</t:PrimarySmtpAddress>
    </t:UserId>
    <t:PermissionLevel>Editor</t:PermissionLevel>
</t:Permission>

Если вы хотите использовать пользовательский уровень разрешений, используйте этот код.

<t:Permission>
    <t:UserId>
        <t:PrimarySmtpAddress> sadie@contoso.com </t:PrimarySmtpAddress>
    </t:UserId>
    <t:CanCreateItems>true</t:CanCreateItems>
    <t:CanCreateSubFolders>true</t:CanCreateSubFolders>
    <t:IsFolderOwner>false</t:IsFolderOwner>
    <t:IsFolderVisible>false</t:IsFolderVisible>
    <t:IsFolderContact>false</t:IsFolderContact>
    <t:EditItems>None</t:EditItems>
    <t:DeleteItems>None</t:DeleteItems>
    <t:ReadItems>None</t:ReadItems>
    <t:PermissionLevel>Custom</t:PermissionLevel>
</t:Permission>

Сервер отвечает на запрос UpdateFolder сообщением UpdateFolderResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что папка успешно обновлена.

Удаление разрешений для папок с помощью управляемого API EWS

В следующем примере кода показано, как использовать управляемый API EWS для удаления всех разрешений пользователей на определенную папку, за исключением разрешений по умолчанию и анонимных разрешений, с помощью:

  1. Получение текущих разрешений для папки с помощью метода Bind .

  2. Итерации по коллекции Permissions и удалению разрешений для отдельных пользователей.

  3. Вызов метода Update для сохранения изменений.

В этом примере удаляются все разрешения пользователя для папки. Если вы хотите изменить этот пример, чтобы удалить разрешения только для определенного пользователя, измените следующую строку кода, чтобы указать отображаемое имя или SMTP-адрес пользователя.

if (sentItemsFolder.Permissions[t].UserId.DisplayName != null || sentItemsFolder.Permissions[t].UserId.PrimarySmtpAddress != null)

В этом примере предполагается, что служба является допустимым объектом ExchangeService для владельца почтового ящика и что пользователь прошел проверку подлинности на сервере Exchange Server.

static void RemoveFolderPermissions(ExchangeService service)
{
    // Create a property set to use for folder binding.
    PropertySet propSet = new PropertySet(BasePropertySet.FirstClassProperties, FolderSchema.Permissions);
    // Bind to the folder and get the current permissions. 
    // This call results in a GetFolder call to EWS.
    Folder sentItemsFolder = Folder.Bind(service, new FolderId(WellKnownFolderName.SentItems, "primary@contoso.com"), propSet);
    // Iterate through the collection of permissions and remove permissions for any 
    // user with a display name or SMTP address. This leaves the anonymous and 
    // default user permissions unchanged. 
    if (sentItemsFolder.Permissions.Count != 0)
    {
        for (int t = 0; t < sentItemsFolder.Permissions.Count; t++)
        {
            // Find any permissions associated with the specified user and remove them from the DACL
            if (sentItemsFolder.Permissions[t].UserId.DisplayName != null || sentItemsFolder.Permissions[t].UserId.PrimarySmtpAddress != null)
            {
                sentItemsFolder.Permissions.Remove(sentItemsFolder.Permissions[t]);
            }
        }
    }
    // This call results in an UpdateFolder call to EWS.
    sentItemsFolder.Update();
}

Удаление разрешений для папок с помощью EWS

В следующих примерах кода EWS показано, как удалить все разрешения пользователей для определенной папки, за исключением разрешений по умолчанию и анонимных разрешений.

Сначала отправьте запрос GetFolder , в котором значение РазличающеесяFolderId указывает папку, в которой нужно удалить разрешения (папка Отправленные в этом примере), а значение FieldURI содержит folder:PermissionSet. Этот запрос извлекает PermissionSet для указанной папки.

Это также XML-запрос, который управляемый API EWS отправляет при вызове метода Bind для удаления разрешений для папки.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:GetFolder>
      <m:FolderShape>
        <t:BaseShape>AllProperties</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="folder:PermissionSet" />
        </t:AdditionalProperties>
      </m:FolderShape>
      <m:FolderIds>
        <t:DistinguishedFolderId Id="drafts">
          <t:Mailbox>
            <t:EmailAddress>primary@contoso.com</t:EmailAddress>
          </t:Mailbox>
        </t:DistinguishedFolderId>
      </m:FolderIds>
    </m:GetFolder>
  </soap:Body>
</soap:Envelope>

Сервер отвечает на запрос GetFolder сообщением GetFolderResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что папка успешно получена. Значения элементов FolderId и ParentFolderId сокращены для удобства чтения.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="893"
                         MinorBuildNumber="17"
                         Version="V2_10"
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetFolderResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetFolderResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Folders>
            <t:Folder>
              <t:FolderId Id="EAAAAA=="
                          ChangeKey="AQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiRd5" />
              <t:ParentFolderId Id="CQAAAA=="
                                ChangeKey="AQAAAA==" />
              <t:FolderClass>IPF.Note</t:FolderClass>
              <t:DisplayName>Drafts</t:DisplayName>
              <t:TotalCount>0</t:TotalCount>
              <t:ChildFolderCount>0</t:ChildFolderCount>
              <t:EffectiveRights>
                <t:CreateAssociated>true</t:CreateAssociated>
                <t:CreateContents>true</t:CreateContents>
                <t:CreateHierarchy>true</t:CreateHierarchy>
                <t:Delete>true</t:Delete>
                <t:Modify>true</t:Modify>
                <t:Read>true</t:Read>
                <t:ViewPrivateItems>true</t:ViewPrivateItems>
              </t:EffectiveRights>
              <t:PermissionSet>
                <t:Permissions>
                  <t:Permission>
                    <t:UserId>
                      <t:DistinguishedUser>Default</t:DistinguishedUser>
                    </t:UserId>
                    <t:CanCreateItems>false</t:CanCreateItems>
                    <t:CanCreateSubFolders>false</t:CanCreateSubFolders>
                    <t:IsFolderOwner>false</t:IsFolderOwner>
                    <t:IsFolderVisible>false</t:IsFolderVisible>
                    <t:IsFolderContact>false</t:IsFolderContact>
                    <t:EditItems>None</t:EditItems>
                    <t:DeleteItems>None</t:DeleteItems>
                    <t:ReadItems>None</t:ReadItems>
                    <t:PermissionLevel>None</t:PermissionLevel>
                  </t:Permission>
                  <t:Permission>
                    <t:UserId>
                      <t:DistinguishedUser>Anonymous</t:DistinguishedUser>
                    </t:UserId>
                    <t:CanCreateItems>false</t:CanCreateItems>
                    <t:CanCreateSubFolders>false</t:CanCreateSubFolders>
                    <t:IsFolderOwner>false</t:IsFolderOwner>
                    <t:IsFolderVisible>false</t:IsFolderVisible>
                    <t:IsFolderContact>false</t:IsFolderContact>
                    <t:EditItems>None</t:EditItems>
                    <t:DeleteItems>None</t:DeleteItems>
                    <t:ReadItems>None</t:ReadItems>
                    <t:PermissionLevel>None</t:PermissionLevel>
                  </t:Permission>
                  <t:Permission>
                    <t:UserId>
                      <t:SID>S-1-5-21-1337771579-694202782-848329751-1535223</t:SID>
                      <t:PrimarySmtpAddress>sadie@Contoso.com</t:PrimarySmtpAddress>
                      <t:DisplayName>Sadie Daniels</t:DisplayName>
                    </t:UserId>
                    <t:CanCreateItems>true</t:CanCreateItems>
                    <t:CanCreateSubFolders>false</t:CanCreateSubFolders>
                    <t:IsFolderOwner>false</t:IsFolderOwner>
                    <t:IsFolderVisible>true</t:IsFolderVisible>
                    <t:IsFolderContact>false</t:IsFolderContact>
                    <t:EditItems>All</t:EditItems>
                    <t:DeleteItems>All</t:DeleteItems>
                    <t:ReadItems>FullDetails</t:ReadItems>
                    <t:PermissionLevel>Editor</t:PermissionLevel>
                  </t:Permission>
                </t:Permissions>
              </t:PermissionSet>
              <t:UnreadCount>0</t:UnreadCount>
            </t:Folder>
          </m:Folders>
        </m:GetFolderResponseMessage>
      </m:ResponseMessages>
    </m:GetFolderResponse>
  </s:Body>
</s:Envelope>

Затем используйте операцию UpdateFolder , чтобы отправить обновленный Набор разрешений, который не включает разрешение для удаленного пользователя.

Это также XML-запрос, который управляемый API EWS отправляет при вызове метода Update для удаления разрешений для папки.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:UpdateFolder>
      <m:FolderChanges>
        <t:FolderChange>
          <t:FolderId Id="EAAAAA=="
                      ChangeKey="AQAAABYAAADOilbYa8KaT7ZgMoTz2P+hAAABiRd5" />
          <t:Updates>
            <t:SetFolderField>
              <t:FieldURI FieldURI="folder:PermissionSet" />
              <t:Folder>
                <t:PermissionSet>
                  <t:Permissions>
                    <t:Permission>
                      <t:UserId>
                        <t:DistinguishedUser>Default</t:DistinguishedUser>
                      </t:UserId>
                      <t:PermissionLevel>None</t:PermissionLevel>
                    </t:Permission>
                    <t:Permission>
                      <t:UserId>
                        <t:DistinguishedUser>Anonymous</t:DistinguishedUser>
                      </t:UserId>
                      <t:PermissionLevel>None</t:PermissionLevel>
                    </t:Permission>
                  </t:Permissions>
                </t:PermissionSet>
              </t:Folder>
            </t:SetFolderField>
          </t:Updates>
        </t:FolderChange>
      </m:FolderChanges>
    </m:UpdateFolder>
  </soap:Body>
</soap:Envelope>

Сервер отвечает на запрос UpdateFolder сообщением UpdateFolderResponse , которое содержит значение элемента ResponseCodeNoError, указывающее, что обновление прошло успешно.

Обновление разрешений для папок с помощью управляемого API EWS

Вы также можете обновить разрешения для папки для определенной папки с помощью управляемого API EWS. Чтобы обновить разрешения, выполните следующие действия:

  1. Удалите разрешения папки для устаревших разрешений, но не вызывайте метод Update (пока).

  2. Добавьте разрешения для папок для новых или измененных пользователей.

  3. Вызовите метод Update , чтобы сохранить изменения.

При попытке добавить два набора разрешений для одного и того же пользователя вы получите сообщение об ошибке ServiceResponseException со следующим описанием: "Указанный набор разрешений содержит дубликаты идентификаторов пользователей". В этом случае удалите текущие разрешения из коллекции Permission , а затем добавьте новые разрешения в коллекцию Permission .

Обновление разрешений для папок с помощью EWS

Вы также можете обновить разрешения для определенных папок с помощью EWS, объединяя процесс удаления и добавления. Чтобы обновить разрешения, выполните следующие действия:

  1. Получите текущие разрешения папки с помощью операции GetFolder .

  2. Отправьте обновленный список разрешений с помощью операции UpdateFolder .

Это те же две операции, которые используются для включения или удаления доступа с помощью EWS. Единственное отличие заключается в том, что при получении ответа GetFolder он будет содержать набор разрешений для пользователя. Просто замените существующий элемент Permission новым элементом Permission , а затем отправьте операцию UpdateFolder с новым значением или значениями Permission .

При попытке добавить два набора разрешений для одного и того же пользователя вы получите значение ResponseCodeErrorDuplicateUserIdsSpecified. В этом случае удалите из запроса устаревшее значение Permission для пользователя, а затем повторите запрос.

Дальнейшие действия

После предоставления пользователю разрешения на доступ к определенной папке пользователь сможет получить доступ к ней в качестве делегата. Дополнительные сведения см. в разделе:

См. также