Adición de citas mediante la suplantación de ExchangeAdd appointments by using Exchange impersonation

Obtenga información sobre cómo usar la suplantación con la API administrada de EWS o EWS en Exchange para agregar citas a los calendarios de los usuarios.Learn how to use impersonation with the EWS Managed API or EWS in Exchange to add appointments to users' calendars.

Puede crear una aplicación de servicio que inserte citas directamente en un calendario de Exchange mediante una cuenta de servicio que tenga habilitada la función ApplicationImpersonation .You can create a service application that inserts appointments directly into an Exchange calendar by using a service account that has the ApplicationImpersonation role enabled. Cuando se utiliza la suplantación, la aplicación actúa como usuario; es como si el usuario agregara la cita al calendario mediante un cliente como Outlook.When you use impersonation, the application is acting as the user; it's as if the user added the appointment to the calendar by using a client such as Outlook.

Cuando use la suplantación, tenga en cuenta lo siguiente:When you are using impersonation, keep in mind the following:

  • El objeto ExchangeService debe estar enlazado a la cuenta de servicio.Your ExchangeService object must be bound to the service account. Puede usar el mismo objeto ExchangeService para representar varias cuentas cambiando la propiedad ImpersonatedUserId para cada cuenta que desee suplantar.You can use the same ExchangeService object to impersonate multiple accounts by changing the ImpersonatedUserId property for each account that you want to impersonate.

  • Cualquier elemento que guarde en una cuenta suplantada solo puede usarse una vez.Any item that you save to an impersonated account can only be used once. Si desea guardar la misma cita en varias cuentas, por ejemplo, tiene que crear un objeto de cita para cada cuenta.If you want to save the same appointment in multiple accounts, for example, you have to create an Appointment object for each account.

Requisitos previosPrerequisites

La aplicación necesita una cuenta para conectarse con el servidor de Exchange antes de poder usar la suplantación.Your application needs an account to use to connect to the Exchange server before it can use impersonation. Le recomendamos que use una cuenta de servicio para la aplicación a la que se le haya concedido el rol de suplantación de aplicaciones para las cuentas a las que tendrá acceso.We suggest that you use a service account for the application that has been granted the Application Impersonation role for the accounts that it will be accessing. Para obtener más información, vea configurar la suplantaciónFor more information, see Configure impersonation

Agregar citas con la suplantación con la API administrada de EWSAdd appointments by using impersonation with the EWS Managed API

En el siguiente ejemplo se agrega una cita o una reunión al calendario de una o varias cuentas de Exchange.The following example adds an appointment or meeting to the calendar of one or more Exchange accounts. El método toma tres parámetros.The method takes three parameters.

  • servicio : objeto ExchangeService enlazado a la cuenta de la aplicación de servicio en el servidor Exchange.service — An ExchangeService object bound to the service application's account on the Exchange server.

  • emailAddresses : un objeto System. List que contiene una lista de cadenas de direcciones de correo electrónico SMTP.emailAddresses — A System.List object containing a list of SMTP email address strings.

  • Factory : un objeto que implementa la interfaz IAppointmentFactory .factory — An object that implements the IAppointmentFactory interface. Esta interfaz tiene un método, GetAppointment , que toma un objeto ExchangeService como parámetro y devuelve un objeto appointment .This interface has one method, GetAppointment that takes an ExchangeService object as a parameter and returns an Appointment object. La interfaz IAppointmentFactory está definida IAppointmentFactory interfaz.The IAppointmentFactory interface is defined IAppointmentFactory interface.

private static void CreateAppointments(ExchangeService service, List<string> emailAddresses, IAppointmentFactory factory)
{
  // Loop through the list of email addresses to add the appointment.
  foreach (var emailAddress in emailAddresses)
  {
    Console.WriteLine(string.Format("  Placing appointment in calendar for {0}.", emailAddress));
    // Set the email address of the account to get the appointment.
    service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailAddress);
    // Get the appointment to add.
    Appointment appointment = factory.GetAppointment(service);
    // Save the appointment.
    try
    {
      if (appointment.RequiredAttendees.Count > 0)
      {
        // The appointment has attendees so send them the meeting request.
        appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);
      }
      else
      {
        // The appointment does not have attendees, so just save to calendar.
        appointment.Save(SendInvitationsMode.SendToNone);
      }
    }
    catch (ServiceResponseException ex)
    {
      Console.WriteLine(string.Format("Could not create appointment for {0}", emailAddress));
      Console.WriteLine(ex.Message);
    }
  }
}

Al guardar la cita, el código comprueba si se ha agregado algún asistente a la propiedad RequiredAttendees .When saving the appointment, the code checks to determine whether any attendees have been added to the RequiredAttendees property. Si es así, se llama al método appointment. Save con el valor de enumeración SendToAllAndSaveCopy para que los asistentes reciban las convocatorias de reunión; de lo contrario, se llama al método appointment. Save con el valor de enumeración SendToNone para que la cita se guarde en el calendario del usuario suplantado con la propiedad appointment. IsMeeting establecida en false.If they have, the Appointment.Save method is called with the SendToAllAndSaveCopy enumeration value so that the attendees receive meeting requests; otherwise, the Appointment.Save method is called with the SendToNone enumeration value so that the appointment is saved into the impersonated user's calendar with the Appointment.IsMeeting property set to false.

Interfaz IAppointmentFactoryIAppointmentFactory interface

Debido a que necesita un nuevo objeto appointment cada vez que desea guardar una cita en el calendario de un usuario suplantado, la interfaz IAppointmentFactory abstrae el objeto que se usa para rellenar cada objeto appointment .Because you need a new Appointment object each time that you want to save an appointment on an impersonated user's calendar, the IAppointmentFactory interface abstracts the object used to populate each Appointment object. Esta versión es una interfaz simple que contiene un solo método, GetAppointment, que toma un objeto ExchangeService como un parámetro y devuelve un nuevo objeto appointment enlazado a dicho objeto ExchangeService .This version is a simple interface that contains only one method, GetAppointment, that takes an ExchangeService object as a parameter and returns a new Appointment object bound to that ExchangeService object.

interface IAppointmentFactory
{
  Appointment GetAppointment(ExchangeService service);
}

El siguiente ejemplo de clase AppointmentFactory muestra una implementación de la interfaz IAppointmentFactory que devuelve una cita sencilla que se produce tres días a partir de ahora.The following AppointmentFactory class example shows an implementation of the IAppointmentFactory interface that returns a simple appointment that occurs three days from now. Si quita la marca de comentario de la appointment.RequiredAttendees.Add línea, el método GetAppointment devolverá una reunión y la dirección de correo electrónico especificada en esa línea recibirá una convocatoria de reunión con el usuario suplantado que se muestra como organizador.If you uncomment the appointment.RequiredAttendees.Add line, the GetAppointment method will return a meeting and the email address specified in that line will receive a meeting request with the impersonated user listed as the organizer.

class AppointmentFactory : IAppointmentFactory
{
  public Appointment GetAppointment(ExchangeService service)
  {
    // First create the appointment to add.
    Appointment appointment = new Appointment(service);
    // Set the properties on the appointment.
    appointment.Subject = "Tennis lesson";
    appointment.Body = "Focus on backhand this week.";
    appointment.Start = DateTime.Now.AddDays(3);
    appointment.End = appointment.Start.AddHours(1);
    appointment.Location = "Tennis club";
    // appointment.RequiredAttendees.Add(new Attendee("sonyaf@contoso1000.onmicrosoft.com"));
    return appointment;
  }
}

Agregar citas mediante la suplantación con EWSAdd appointments by using impersonation with EWS

EWS permite que la aplicación use la suplantación para agregar elementos a un calendario en nombre del propietario del calendario.EWS enables you application to use impersonation to add items to a calendar on behalf the calendar's owner. En este ejemplo se muestra cómo usar la operación CreateItem para agregar una cita al calendario de una cuenta suplantada.This example shows how to use the CreateItem operation to add an appointment to the calendar of an impersonated account.

<?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="Exchange2013" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Pacific Standard Time" />
    </t:TimeZoneContext>
    <t:ExchangeImpersonation>
      <t:ConnectingSID>
        <t:SmtpAddress>alfred@contoso.com</t:SmtpAddress>
      </t:ConnectingSID>
    </t:ExchangeImpersonation>
  </soap:Header>
  <soap:Body>
    <m:CreateItem SendMeetingInvitations="SendToNone">
      <m:Items>
        <t:CalendarItem>
          <t:Subject>Tennis lesson</t:Subject>
          <t:Body BodyType="HTML">Focus on backhand this week.</t:Body>
          <t:ReminderDueBy>2013-09-19T14:37:10.732-07:00</t:ReminderDueBy>
          <t:Start>2013-09-21T19:00:00.000Z</t:Start>
          <t:End>2013-09-21T20:00:00.000Z</t:End>
          <t:Location>Tennis club</t:Location>
          <t:MeetingTimeZone TimeZoneName="Pacific Standard Time" />
        </t:CalendarItem>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

Tenga en cuenta que, aparte de la adición del elemento ExchangeImpersonation en el encabezado SOAP para especificar la cuenta que se va a suplantar, esta es la misma solicitud XML que se usa para crear una cita sin usar suplantación.Note that other than the addition of the ExchangeImpersonation element in the SOAP header to specify the account that we are impersonating, this is the same XML request used to create an appointment without using impersonation.

En el ejemplo siguiente se muestra el XML de respuesta que devuelve la operación CreateItem .The following example shows the response XML that is returned by the CreateItem operation.

Nota

Los atributos Itemid y changekey se acortan para facilitar la legibilidad.The ItemId and ChangeKey attributes are shortened for readability.

<?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="775" MinorBuildNumber="7" Version="V2_4" 
 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:CreateItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
  xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:CreateItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:CalendarItem>
              <t:ItemId Id="AAMkA" ChangeKey="DwAAA" />
            </t:CalendarItem>
          </m:Items>
        </m:CreateItemResponseMessage>
      </m:ResponseMessages>
    </m:CreateItemResponse>
  </s:Body>
</s:Envelope>

De nuevo, este es el mismo XML que se devuelve cuando se utiliza la operación CreateItem sin usar la suplantación.Again, this is the same XML that is returned when you use the CreateItem operation without using impersonation.

Vea tambiénSee also