Ajouter des rendez-vous à l’aide de l’emprunt d’identité Exchange

Découvrez comment utiliser l’emprunt d’identité avec l’API gérée par EWS ou EWS dans Exchange pour ajouter des rendez-vous aux calendriers des utilisateurs.

Vous pouvez créer une application de service qui insère des rendez-vous directement dans un calendrier Exchange à l’aide d’un compte de service pour lequel le rôle ApplicationImpersonation est activé. Lorsque vous utilisez l’emprunt d’identité, l’application agit comme utilisateur ; Comme si l’utilisateur ajoutait le rendez-vous au calendrier à l’aide d’un client tel qu’Outlook.

Lorsque vous utilisez l’emprunt d’identité, gardez à l’esprit les points suivants :

  • Votre objet ExchangeService doit être lié au compte de service. Vous pouvez utiliser le même objet ExchangeService pour emprunter l’identité de plusieurs comptes en modifiant la propriété ImpersonatedUserId pour chaque compte que vous souhaitez emprunter.
  • Tout élément que vous enregistrez sur un compte dont l’identité a été empruntée ne peut être utilisé qu’une seule fois. Si vous souhaitez enregistrer le même rendez-vous dans plusieurs comptes, par exemple, vous devez créer un objet Appointment pour chaque compte.

Conditions préalables

Votre application a besoin d’un compte à utiliser pour se connecter au serveur Exchange avant de pouvoir utiliser l’emprunt d’identité. Nous vous suggérons d’utiliser un compte de service pour l’application qui a reçu le rôle d’emprunt d’identité d’application pour les comptes auxquels elle aura accès. Pour plus d’informations, voir Configurer l’emprunt d’identité

Ajouter des rendez-vous à l’aide de l’emprunt d’identité avec l’API gérée par EWS

L’exemple suivant ajoute un rendez-vous ou une réunion au calendrier d’un ou plusieurs comptes Exchange. La méthode requiert trois paramètres.

  • service : objet ExchangeService lié au compte de l’application de service sur le serveur Exchange.
  • emailAddresses : objet System.List contenant une liste de chaînes d’adresse e-mail SMTP.
  • factory : objet qui implémente l’interface IAppointmentFactory. Cette interface a une méthode, GetAppointment, qui prend un objet ExchangeService comme paramètre et renvoie un objet Appointment. L’interface IAppointmentFactory est définie comme interface IAppointmentFactory.
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);
    }
  }
}

Lors de l’enregistrement du rendez-vous, le code vérifie si des participants ont été ajoutés à la propriété RequiredAttendees. Si tel est le cas, la méthode Appointment.Save est appelée avec la valeur d’énumération SendToAllAndSaveCopy afin que les participants reçoivent les demandes de réunion ; sinon, la méthode Appointment.Save est appelée avec la valeur d’énumération SendToNone afin que le rendez-vous soit enregistré dans le calendrier de l’utilisateur dont l’identité a été empruntée avec la propriété Appointment.IsMeeting définie sur false.

Interface IAppointmentFactory

Étant donné que vous avez besoin d’un nouvel objet Appointment chaque fois que vous souhaitez enregistrer un rendez-vous dans le calendrier d’un utilisateur dont l’identité a été empruntée, l’interface IAppointmentFactory extrait l’objet utilisé pour remplir chaque objet Appointment. Cette version est une simple interface qui ne contient qu’une seule méthode, GetAppointment, qui prend un objet ExchangeService comme paramètre et renvoie un nouvel objet Appointment lié à cet objet ExchangeService.

interface IAppointmentFactory
{
  Appointment GetAppointment(ExchangeService service);
}

L’exemple de classe AppointmentFactory suivant montre une implémentation de l’interface IAppointmentFactory qui renvoie un simple rendez-vous qui a lieu dans trois jours. Si vous décomposez la ligne appointment.RequiredAttendees.Add, la méthode GetAppointment renverra une réunion et l'adresse électronique spécifiée dans cette ligne recevra une demande de réunion avec l'utilisateur usurpé comme organisateur.

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

Ajouter des rendez-vous à l’aide de l’emprunt d’identité avec EWS

EWS permet à votre application d’utiliser l’emprunt d’identité pour ajouter des éléments à un calendrier au nom du propriétaire du calendrier. Cet exemple montre comment utiliser l’opération CreateItem pour ajouter un rendez-vous au calendrier d’un compte dont l’identité a été empruntée.

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

Notez qu’en dehors de l’ajout de l’élément ExchangeImpersonation dans l’en-tête SOAP pour spécifier le compte dont nous empruntons l’identité, il s’agit de la même requête XML utilisée pour créer un rendez-vous sans utiliser l’emprunt d’identité.

L'exemple suivant présente le code XML de réponse renvoyé par l'opération CreateItem.

Remarque

Les attributs ItemId et ChangeKey sont réduits pour une meilleure lisibilité.

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

Là encore, il s’agit du même XML qui est renvoyé lorsque vous utilisez l’opération CreateItem sans utiliser l’emprunt d’identité.

Voir aussi