Establecer permisos de carpeta para otro usuario mediante EWS en Exchange

Obtenga información sobre cómo establecer niveles de permisos en una carpeta mediante la API administrada de EWS o EWS en Exchange.

Los permisos de nivel de carpeta permiten a los usuarios acceder a una o varias carpetas en el buzón de otro usuario. Los permisos de carpeta son similares a delegar el acceso, pero difieren de las siguientes maneras:

  • Los permisos de carpeta no permiten a un usuario "enviar en nombre de" o "enviar como" a otro usuario. Solo habilitan el acceso a carpetas. Los usuarios pueden crear elementos en esas carpetas, pero no pueden enviarlos.

  • Puede establecer permisos de carpeta en cualquier carpeta del buzón de correo, pero solo puede agregar un delegado a las carpetas Calendario, Contactos, Bandeja de entrada, Diario, Notas y Tareas.

  • Puede establecer una serie de permisos en una carpeta específica. Al agregar un delegado, puede asignar uno de los cinco niveles de permisos.

  • Puede establecer permisos de carpeta para usuarios anónimos y predeterminados. Solo puede conceder acceso delegado a una cuenta habilitada para correo.

Si está familiarizado con Access Control Entradas (ACE) y Listas de Access Control discrecionales (DACL), sabe que un usuario solo puede tener un conjunto de permisos para cada carpeta. Si intenta agregar un conjunto de permisos para un usuario y ya tiene un conjunto de permisos, obtendrá un error. Al agregar, quitar o actualizar permisos en una carpeta, se obtiene la DACL actual, se agregan o quitan las ACE y, a continuación, se envía la DACL actualizada. No se pueden agregar varias ACE para el mismo usuario. Al actualizar los permisos mediante la API administrada de EWS, debe quitar la ACE actual del usuario y, a continuación, agregar su nueva ACE a la colección. Si usa EWS, solo tiene que reemplazar el conjunto anterior de ACE por los nuevos.

Si va a realizar varios cambios de permisos en una sola carpeta, puede agregar, quitar o actualizar por lotes, solo tiene que tener en cuenta que no puede procesar por lotes las actualizaciones del usuario en varias carpetas. Se requiere una llamada para obtener los permisos en una sola carpeta y se requiere una segunda llamada para actualizar los permisos en esa carpeta. Al agregar, quitar o actualizar permisos de usuario, se usan las mismas dos llamadas o operaciones de método para cada tarea.

Tabla 1. Métodos de API administrada de EWS y operaciones de EWS para establecer permisos de carpeta

Si quiere... Usar este método de API administrada de EWS... Use esta operación EWS...
Habilitación, eliminación o actualización de permisos de carpeta
Folder.Bind seguido de Folder.Update
GetFolder seguido de UpdateFolder
Creación de una carpeta y definición de permisos de carpeta
Folder.Save
CreateFolder

Permisos de carpeta

Tiene bastantes opciones a la hora de establecer permisos de carpeta en una carpeta específica. Puede establecer un nivel de permisos en una carpeta para cada usuario, lo que agrega un conjunto de permisos individuales predefinidos a dacl, o bien puede establecer permisos individuales en una carpeta, pero no puede mezclar ni coincidir.

Están disponibles los siguientes permisos individuales:

  • Puede crear
  • Puede crear subcarpetas
  • ¿Es el propietario de la carpeta?
  • ¿Está visible la carpeta?
  • Es contacto de carpeta
  • Editar elementos
  • Eliminar elementos
  • Leer elementos

Además, están disponibles los siguientes niveles de permisos, que definen un subconjunto de permisos y valores individuales, como se muestra en la tabla 2:

  • Ninguno
  • Owner
  • PublishingEditor
  • Editor
  • PublishingAuthor
  • Autor
  • NoneditingAuthor
  • Reviewer
  • Colaborador
  • Personalizado: la aplicación no puede establecer este valor. El servidor establece este valor si la aplicación incluye una colección personalizada de permisos individuales.
  • FreeBusyTimeOnly: solo se puede establecer en las carpetas calendario.
  • FreeBusyTimeAndSubjectAndLocation: solo se puede establecer en las carpetas calendario.

En la tabla siguiente se muestran los permisos individuales que se aplican de forma predeterminada en función del nivel de permiso.

Tabla 2. Permisos individuales por nivel de permiso

Nivel de permisos Puede crear elementos Puede crear subcarpetas ¿Es el propietario de la carpeta? ¿Está visible la carpeta? Es contacto de carpeta Editar elementos Eliminar elementos Puede leer elementos
Ninguno
False
False
False
False
False
Ninguno
Ninguno
Ninguno
Owner
True
True
True
True
True
Todo
Todo
FullDetails
PublishingEditor
True
True
False
True
False
Todo
Todo
FullDetails
Editor
True
False
False
True
False
Todo
Todo
FullDetails
PublishingAuthor
True
True
False
True
False
Propiedad
Propiedad
FullDetails
Autor
True
False
False
True
False
Propiedad
Propiedad
FullDetails
NoneditingAuthor
True
False
False
True
False
Ninguno
Propiedad
FullDetails
Reviewer
False
False
False
True
False
Ninguno
Ninguno
FullDetails
Colaborador
True
False
False
True
False
Ninguno
Ninguno
Ninguno

Si especifica un nivel de permiso no personalizado en la solicitud de permisos de nivel de carpeta, no es necesario especificar la configuración de permisos individual. Si especifica un permiso individual al establecer un nivel de permiso, se devolverá un error ErrorInvalidPermissionSettings en la respuesta.

Adición de permisos de carpeta mediante la API administrada de EWS

En el ejemplo de código siguiente se muestra cómo usar la API administrada de EWS para:

  • Cree un nuevo objeto FolderPermission para el nuevo usuario.

  • Obtenga los permisos actuales para una carpeta mediante el método Bind .

  • Agregue el nuevo objeto FolderPermissions a la propiedad Folder.Permissions .

  • Llame al método Update para guardar los nuevos permisos en el servidor.

En este ejemplo se supone que el servicio es un objeto ExchangeService válido para el propietario del buzón y que el usuario se ha autenticado en un servidor exchange.

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();
}

La siguiente línea de código especifica el nivel de permiso.

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

Si desea usar el nivel de permiso personalizado, use este código en su lugar.

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

Puede establecer cualquiera de las propiedades FolderPermission que se pueden escribir o todas al crear un objeto FolderPermission con un nivel de permiso personalizado. Tenga en cuenta, sin embargo, que folderPermissionLevel nunca se establece explícitamente en Personalizado por la aplicación. FolderPermissionLevel se establece en Personalizado solo cuando se crea un objeto FolderPermission y se establecen permisos individuales.

Adición de permisos de carpeta mediante EWS

En los siguientes ejemplos de código de EWS se muestra cómo agregar permisos a una carpeta específica mediante la recuperación de los permisos actuales y, a continuación, el envío de una lista de nuevos permisos.

El primer paso consiste en enviar una solicitud GetFolder , donde el valor DistinguishedFolderId especifica la carpeta en la que se van a agregar permisos (la carpeta Elementos enviados de este ejemplo) y el valor FieldURI incluye folder:PermissionSet. Esta solicitud recuperará la configuración de permisos de la carpeta especificada.

Esta es también la solicitud XML que la API administrada de EWS envía cuando se llama al método Bind para agregar permisos de carpeta.

  <?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>

El servidor responde a la solicitud GetFolder con un mensaje GetFolderResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que la carpeta se recuperó correctamente. Los valores FolderId y ParentFolderId se han acortado para mejorar la legibilidad.

<?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>

A continuación, use la operación UpdateFolder para enviar el conjunto de permisos actualizado, que incluye el permiso para el nuevo usuario. Tenga en cuenta que si se incluye el elemento SetFolderField para la carpeta correspondiente en la operación UpdateFolder , se sobrescribirá toda la configuración de permisos de la carpeta. Del mismo modo, si se incluye la opción DeleteFolderField de la operación UpdateFolder , también se eliminarán todas las configuraciones de permisos de la carpeta.

Esta es también la solicitud XML que envía la API administrada de EWS cuando se llama al método Update para agregar permisos de carpeta.

<?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>

La siguiente línea de código especifica el nivel de permiso.

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

Si desea usar el nivel de permiso personalizado, use este código en su lugar.

<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>

El servidor responde a la solicitud UpdateFolder con un mensaje UpdateFolderResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que la carpeta se actualizó correctamente.

Eliminación de permisos de carpeta mediante la API administrada de EWS

En el ejemplo de código siguiente se muestra cómo usar la API administrada de EWS para quitar todos los permisos de usuario de una carpeta específica, excepto para los permisos predeterminados y anónimos, mediante:

  1. Obtención de los permisos actuales para una carpeta mediante el método Bind .

  2. Recorrer en iteración la colección Permissions y quitar permisos para usuarios individuales.

  3. Llamar al método Update para guardar los cambios.

En este ejemplo se quitan todos los permisos de usuario de una carpeta. Si desea modificar este ejemplo para quitar permisos solo para un usuario específico, cambie la siguiente línea de código para identificar el nombre para mostrar o la dirección SMTP del usuario.

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

En este ejemplo se supone que el servicio es un objeto ExchangeService válido para el propietario del buzón y que el usuario se ha autenticado en un servidor exchange.

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();
}

Eliminación de permisos de carpeta mediante EWS

En los siguientes ejemplos de código de EWS se muestra cómo quitar todos los permisos de usuario en una carpeta específica, excepto los permisos predeterminados y anónimos.

En primer lugar, envíe una solicitud GetFolder donde el valor DistinguishedFolderId especifique la carpeta en la que se van a quitar permisos (la carpeta Elementos enviados de este ejemplo) y el valor FieldURI incluye folder:PermissionSet. Esta solicitud recuperará permissionSet para la carpeta especificada.

Esta es también la solicitud XML que la API administrada de EWS envía cuando se llama al método Bind para quitar permisos de carpeta.

<?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>

El servidor responde a la solicitud GetFolder con un mensaje GetFolderResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que la carpeta se recuperó correctamente. Los valores de los elementos FolderId y ParentFolderId se han acortado para mejorar la legibilidad.

<?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>

A continuación, use la operación UpdateFolder para enviar el conjunto de permisos actualizado, que no incluye el permiso para el usuario quitado.

Esta es también la solicitud XML que envía la API administrada de EWS cuando se llama al método Update para quitar permisos de carpeta.

<?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>

El servidor responde a la solicitud UpdateFolder con un mensaje UpdateFolderResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que la actualización se realizó correctamente.

Actualización de permisos de carpeta mediante la API administrada de EWS

También puede actualizar los permisos de carpeta para una carpeta específica mediante la API administrada de EWS. Para actualizar los permisos:

  1. Quite los permisos de carpeta para los permisos obsoletos, pero no llame al método Update (todavía).

  2. Agregue permisos de carpeta para los usuarios nuevos o modificados.

  3. Llame al método Update para guardar los cambios.

Si intenta agregar dos conjuntos de permisos para el mismo usuario, recibirá un error ServiceResponseException con la siguiente descripción: "El conjunto de permisos especificado contiene identificadores de usuario duplicados". En ese caso, quite los permisos actuales de la colección Permission y agregue los nuevos permisos a la colección Permission .

Actualización de permisos de carpeta mediante EWS

También puede actualizar los permisos de carpeta para carpetas específicas mediante EWS mediante la combinación del proceso de eliminación y adición. Para actualizar los permisos:

  1. Recupere los permisos actuales de la carpeta mediante la operación GetFolder .

  2. Envíe una lista actualizada de permisos mediante la operación UpdateFolder .

Estas son las mismas dos operaciones que se usan para habilitar o quitar el acceso mediante EWS. La única diferencia es que cuando reciba la respuesta GetFolder , contendrá un conjunto de permisos para el usuario. Simplemente reemplace ese elemento Permission existente por el nuevo elemento Permission y, a continuación, envíe la operación UpdateFolder por el nuevo valor o valores Permission .

Si intenta agregar dos conjuntos de permisos para el mismo usuario, recibirá un valor ResponseCode de ErrorDuplicateUserIdsSpecified. En ese caso, quite el valor de Permiso obsoleto para el usuario de la solicitud y vuelva a intentar la solicitud.

Pasos siguientes

Después de conceder un permiso de usuario a una carpeta específica, el usuario puede acceder a la carpeta como delegado. Para obtener más información, consulte:

Recursos adicionales