Compartir a través de


Trabajar con carpetas ocultas mediante EWS en Exchange

Obtenga información sobre cómo ocultar una carpeta y buscar carpetas ocultas mediante la API administrada de EWS o EWS en Exchange.

Con una excepción, las carpetas de la raíz de un buzón de Exchange (el subárbol que no es IPM) están ocultas al usuario. Por el contrario, todas las carpetas del subárbol MsgFolderRoot (el subárbol IPM) son visibles para el usuario. ¿Cómo se oculta una carpeta en MsgFolderRoot? No es tan complicado: se trata de una sola propiedad, la propiedad extendida PidTagAttributeHidden (0x10F4000B). Cuando esta propiedad se establece en true, Outlook u otro cliente que use la propiedad para determinar la visibilidad de la carpeta ocultará la carpeta de la vista del usuario. Dado que se trata de una propiedad extendida, es más complejo de usar que la propiedad de carpeta promedio, por lo que este artículo le guiará por los escenarios principales.

Tabla 1. Métodos de API administrada de EWS y operaciones de EWS para trabajar con carpetas ocultas

Task Método de la API administrada de EWS Operación de EWS
Ocultar una carpeta
Folder.Bind seguido de Folder.Update
GetFolder seguido de UpdateFolder
Buscar carpetas ocultas
FindFolders
FindFolder

¿Se pregunta cuál es la única excepción, es decir, qué carpeta de la raíz es visible para los usuarios? Es la carpeta Finder (también conocida como el valor de enumeración SearchFoldersWellKnownFolder o el valor del elemento SearchfoldersDistinguishedFolderId ), que contiene las carpetas de búsqueda de los usuarios. Las carpetas de búsqueda creadas en la carpeta Finder son visibles para los usuarios de Outlook. Si necesita crear una carpeta de búsqueda que no sea visible para los usuarios, muévalo bajo la carpeta raíz para ocultarla. A diferencia de otras carpetas, establecer la propiedad PidTagAttributeHidden en true no ocultará una carpeta de búsqueda en la carpeta Finder.

Ocultar una carpeta mediante la API administrada de EWS

Puede convertir una carpeta existente en una carpeta oculta cambiando la propiedad extendida PidTagAttributeHidden a true. En primer lugar, cree una definición de propiedad extendida para la propiedad . A continuación, use el método Bind para llegar a la carpeta y, a continuación, actualice el valor de la propiedad PidTagAttributeHidden a true y use el método Update para guardar los cambios.

En este ejemplo se supone que el servicio es un objeto ExchangeService válido para el propietario del buzón de correo, que el usuario se ha autenticado en un servidor exchange y que folderId es un Folder.Id válido que identifica la carpeta que se va a ocultar.

private static void MakeHidden(FolderId folderId, ExchangeService service)
{
    // Create an extended property definition for the PidTagAttributeHidden property.
    ExtendedPropertyDefinition isHiddenProp = new ExtendedPropertyDefinition(0x10f4, MapiPropertyType.Boolean);
    PropertySet propSet = new PropertySet(isHiddenProp);
    // Bind to a folder and retrieve the PidTagAttributeHidden property.
    Folder folder = Folder.Bind(service, folderId, propSet);
    // Set the PidTagAttributeHidden property to true.
    folder.SetExtendedProperty(isHiddenProp, true);
    // Save the changes.
    folder.Update();
}

Ocultar una carpeta mediante EWS

Puede usar EWS para convertir una carpeta existente en una carpeta oculta cambiando la propiedad extendida PidTagAttributeHidden a true. En primer lugar, use la operación GetFolder para llegar a la carpeta y, a continuación, recupere la propiedad PidTagAttributeHidden incluyendo el elemento ExtendedFieldURI y establezca el valor PropertyTag en 4340 y el valor PropertyType en Boolean.

Esta es también la solicitud XML que envía la API administrada de EWS cuando se usa el método Bind para obtener una carpeta antes de convertirla en una carpeta oculta.

El valor de FolderId se acorta para mejorar la legibilidad.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="http://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:ExtendedFieldURI PropertyTag="4340"
                              PropertyType="Boolean" />
        </t:AdditionalProperties>
      </m:FolderShape>
      <m:FolderIds>
        <t:FolderId Id="IQywAAAA==" />
      </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. La respuesta también incluye un valor para ExtendedProperty. En este ejemplo, el valor se establece en false, lo que significa que la carpeta no está oculta actualmente.

<?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="898"
                         MinorBuildNumber="23"
                         Version="V2_10"
                         xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="http://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="http://schemas.microsoft.com/exchange/services/2006/messages"
                         xmlns:t="http://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="IQywAAAA=="
                          ChangeKey="AQAAABYAAAD32nSTjepyT63rYH17n9THAAAAABED" />
              <t:ExtendedProperty>
                <t:ExtendedFieldURI PropertyTag="0x10f4"
                                    PropertyType="Boolean" />
                <t:Value>false</t:Value>
              </t:ExtendedProperty>
            </t:Folder>
          </m:Folders>
        </m:GetFolderResponseMessage>
      </m:ResponseMessages>
    </m:GetFolderResponse>
  </s:Body>
</s:Envelope>

Para cambiar el valor de ExtendedProperty a true, use la operación UpdateFolder . Incluya los elementos ExtendedProperty, ExtendedFieldURI y Value para la propiedad extendida PidTagAttributeHidden y establezca el elemento Value en true para ocultar la carpeta.

Esta es también la solicitud XML que la API administrada de EWS envía cuando se usa el método Update para actualizar una carpeta y convertirla en una carpeta oculta.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="http://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="IQywAAAA=="
                      ChangeKey="AQAAABYAAAD32nSTjepyT63rYH17n9THAAAAABED" />
          <t:Updates>
            <t:SetFolderField>
              <t:ExtendedFieldURI PropertyTag="4340"
                                  PropertyType="Boolean" />
              <t:Folder>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="4340"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </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, que indica que la carpeta se actualizó correctamente y ahora está oculta.

Búsqueda de todas las carpetas ocultas mediante la API administrada de EWS

Puede encontrar todas las carpetas ocultas en una carpeta primaria creando una definición de propiedad extendida para la propiedad extendida PidTagAttributeHidden y, a continuación, usando el método FindFolders para buscar carpetas con un valor PidTagAttributeHidden establecido en true. En este ejemplo se usa MsgFolderRoot, también conocido como el subárbol Top of Information Store o IPM, como la carpeta primaria en la que buscar.

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

private static void FindHiddenFolders(ExchangeService service)
{
    // Create an extended property definition for the PidTagAttributeHidden property.
    ExtendedPropertyDefinition isHiddenProp = new ExtendedPropertyDefinition(0x10f4, MapiPropertyType.Boolean);
    // Create a folder view to retrieve up to 100 folders and 
    // retrieve only the PidTagAttributeHidden and the display name.
    FolderView folderView = new FolderView(100);
    folderView.PropertySet = new PropertySet(isHiddenProp, FolderSchema.DisplayName);
    // Indicate a Traversal value of Deep, so that all subfolders are retrieved.
    folderView.Traversal = FolderTraversal.Deep;
    // Find all hidden folders under the MsgFolderRoot.
    // This call results in a FindFolder call to EWS.
    FindFoldersResults findFolder = service.FindFolders(WellKnownFolderName.MsgFolderRoot,
            new SearchFilter.IsEqualTo(isHiddenProp, true), folderView);
    // Display the folder ID and display name of each hidden folder.
    foreach (Folder folder in findFolder)
    {
        Console.WriteLine("FolderId: {0}", folder.Id);
        Console.WriteLine("DisplayName: {0}", folder.DisplayName);
        Console.WriteLine("\r\n");
    }
}

Buscar todas las carpetas ocultas mediante EWS

Puede usar EWS para buscar todas las carpetas ocultas en una carpeta existente llamando a la operación FindFolder y buscando carpetas cuya propiedad extendida PidTagAttributeHidden esté establecida en true. Para ello, incluya una restricciónIsEqualTo que busque el elemento ExtendedFieldURI para la propiedad PidTagAttributeHidden ( valor PropertyTag en 4243 y el valor PropertyType en Boolean), como se muestra en la solicitud siguiente. En este ejemplo se usa MsgFolderRoot, también conocido como el subárbol Top of Information Store o IPM, como la carpeta primaria en la que buscar.

Esta es también la solicitud XML que la API administrada de EWS envía cuando se usa el método FindFolders para buscar todas las carpetas ocultas.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Central Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:FindFolder Traversal="Deep">
      <m:FolderShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:ExtendedFieldURI PropertyTag="4340"
                              PropertyType="Boolean" />
          <t:FieldURI FieldURI="folder:DisplayName" />
        </t:AdditionalProperties>
      </m:FolderShape>
      <m:IndexedPageFolderView MaxEntriesReturned="100"
                               Offset="0"
                               BasePoint="Beginning" />
      <m:Restriction>
        <t:IsEqualTo>
          <t:ExtendedFieldURI PropertyTag="4340"
                              PropertyType="Boolean" />
          <t:FieldURIOrConstant>
            <t:Constant Value="true" />
          </t:FieldURIOrConstant>
        </t:IsEqualTo>
      </m:Restriction>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="msgfolderroot" />
      </m:ParentFolderIds>
    </m:FindFolder>
  </soap:Body>
</soap:Envelope>

El servidor responde a la solicitud FindFolder con un mensaje FindFolderResponse que incluye un valor de elemento ResponseCode de NoError, lo que indica que la búsqueda de carpetas se realizó correctamente, así como todas las carpetas ocultas en la carpeta del mensaje raíz.

Los valores de FolderId se acortan 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="898"
                         MinorBuildNumber="23"
                         Version="V2_10"
                         xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="http://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:FindFolderResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                          xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindFolderResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="6"
                        TotalItemsInView="6"
                        IncludesLastItemInRange="true">
            <t:Folders>
              <t:ContactsFolder>
                <t:FolderId Id="IBHgAAAA=="
                            ChangeKey="AwAAABYAAAD32nSTjepyT63rYH17n9THAAAAAACz" />
                <t:DisplayName>{06967759-274D-40B2-A3EB-D7F9E73727D7}</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x10f4"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </t:ContactsFolder>
              <t:ContactsFolder>
                <t:FolderId Id="IBHwAAAA=="
                            ChangeKey="AwAAABYAAAD32nSTjepyT63rYH17n9THAAAAAAC7" />
                <t:DisplayName>{A9E2BC46-B3A0-4243-B315-60D991004455}</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x10f4"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </t:ContactsFolder>
              <t:ContactsFolder>
                <t:FolderId Id="IBIQAAAA=="
                            ChangeKey="AwAAABYAAAD32nSTjepyT63rYH17n9THAAAAAADO" />
                <t:DisplayName>GAL Contacts</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x10f4"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </t:ContactsFolder>
              <t:ContactsFolder>
                <t:FolderId Id="IBHQAAAA=="
                            ChangeKey="AwAAABYAAAD32nSTjepyT63rYH17n9THAAAAAACa" />
                <t:DisplayName>Recipient Cache</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x10f4"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </t:ContactsFolder>
              <t:Folder>
                <t:FolderId Id="HAAAAA=="
                            ChangeKey="AQAAABYAAAD32nSTjepyT63rYH17n9THAAAAAACS" />
                <t:DisplayName>Conversation Action Settings</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x10f4"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </t:Folder>
              <t:Folder>
                <t:FolderId Id="IQywAAAA=="
                            ChangeKey="AQAAABYAAAD32nSTjepyT63rYH17n9THAAAeZIBf" />
                <t:DisplayName>TestFolder</t:DisplayName>
                <t:ExtendedProperty>
                  <t:ExtendedFieldURI PropertyTag="0x10f4"
                                      PropertyType="Boolean" />
                  <t:Value>true</t:Value>
                </t:ExtendedProperty>
              </t:Folder>
            </t:Folders>
          </m:RootFolder>
        </m:FindFolderResponseMessage>
      </m:ResponseMessages>
    </m:FindFolderResponse>
  </s:Body>
</s:Envelope>

Después de haber ocultado o deshidnado carpetas, es posible que desee obtener la jerarquía de carpetas o sincronizar la jerarquía de carpetas. Los ejemplos que muestran cómo obtener una jerarquía de carpetas mediante la API administrada de EWS u obtener una jerarquía de carpetas mediante EWS también indican qué carpetas de la jerarquía están ocultas.

Vea también