Hinzufügen von Terminen mit Exchange-Identitätswechsel

Erfahren Sie, wie Sie den Identitätswechsel mit der verwalteten EWS-API oder EWS in Exchange verwenden, um Termine zum Kalender des Benutzers hinzuzufügen.

Sie können eine Dienstanwendung erstellen, die Termine direkt in einen Exchange-Kalender einfügt, indem Sie ein Dienstkonto verwenden, für das die ApplicationImpersonation-Rolleaktiviert ist. Wenn Sie den Identitätswechsel verwenden, fungiert die Anwendung als Benutzer. Das ist gleich, wie wenn der Benutzer den Termin mithilfe eines Clients wie Outlook zum Kalender hinzugefügt hätte.

Beachten Sie bei der Verwendung des Identitätswechsels Folgendes:

  • Ihr ExchangeService-Objekt muss an das Dienstkonto gebunden sein. Sie können dasselbe ExchangeService-Objekt verwenden, um die Identität mehrerer Konten zu annehmen, indem Sie die Eigenschaft ImpersonatedUserId für jedes Konto ändern, für das Sie die Identität annehmen möchten.
  • Jedes Element, das Sie in einem Konto mit Identitätswechsel speichern, kann nur einmal verwendet werden. Wenn Sie denselben Termin beispielsweise in mehreren Konten speichern möchten, müssen Sie für jedes Konto ein Appointment-Objekt erstellen.

Voraussetzungen

Ihre Anwendung benötigt ein Konto, das zum Herstellen einer Verbindung mit dem Exchange-Server verwendet wird, bevor der Identitätswechsel verwendet werden kann. Es wird empfohlen, ein Dienstkonto für die Anwendung zu verwenden, dem die Rolle „Anwendungsidentitätswechsel“ für die Konten zugewiesen wurde, auf die es zugreifen wird. Weitere Informationen finden Sie unter Identitätswechsel konfigurieren.

Hinzufügen von Terminen mithilfe des Identitätswechsels mit der verwalteten EWS-API

Im folgenden Beispiel wird dem Kalender eines oder mehrerer Exchange-Konten ein Termin oder eine Besprechung hinzugefügt. Die Methode akzeptiert drei Parameter.

  • service – Ein ExchangeService-Objekt, das an das Konto der Dienstanwendung auf dem Exchange-Server gebunden ist.
  • emailAddresses – Ein System.List-Objekt, das eine Liste von SMTP-E-Mail-Adresszeichenfolgen enthält.
  • factory – Ein Objekt, das die Schnittstelle IAppointmentFactory implementiert. Diese Schnittstelle verfügt über eine Methode, GetAppointment, die ein ExchangeService-Objekt als Parameter akzeptiert und ein Appointment-Objekt zurückgibt. Die IAppointmentFactory-Schnittstelle ist definiert in IAppointmentFactory-Schnittstelle.
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);
    }
  }
}

Beim Speichern des Termins überprüft der Code, ob Teilnehmer zur Eigenschaft RequiredAttendees hinzugefügt wurden. Wenn vorhanden, wird die Appointment.Save-Methode mit dem SendToAllAndSaveCopy-Enumerationswert aufgerufen, sodass die Teilnehmer Besprechungsanfragen erhalten. Andernfalls wird die Appointment.Save-Methode mit dem SendToNone-Enumerationswert aufgerufen, sodass der Termin im Kalender des imitierten Benutzers gespeichert wird, wobei die Eigenschaft Appointment.IsMeeting auf false festgelegt ist.

IAppointmentFactory-Schnittstelle

Da Sie jedes Mal ein neues Appointment-Objekt benötigen, wenn Sie einen Termin im Kalender eines imitierten Benutzers speichern möchten, abstrahiert die IAppointmentFactory-Schnittstelle das Objekt, das zum Auffüllen jedes Appointment-Objekts verwendet wird. Diese Version ist eine einfache Schnittstelle, die nur eine Methode enthält, GetAppointment, die ein ExchangeService-Objekt als Parameter akzeptiert und ein neues Appointment-Objekt zurückgibt, das an dieses ExchangeService-Objekt gebunden ist.

interface IAppointmentFactory
{
  Appointment GetAppointment(ExchangeService service);
}

Das folgende AppointmentFactory-Klassenbeispiel zeigt eine Implementierung der IAppointmentFactory-Schnittstelle, die einen einfachen Termin zurückgibt, der in drei Tagen ab jetzt stattfindet. Wenn Sie die Auskommentierung der appointment.RequiredAttendees.Add-Zeile aufheben, gibt die GetAppointment-Methode eine Besprechung zurück, und die in dieser Zeile angegebene E-Mail-Adresse empfängt eine Besprechungsanfrage mit dem als Organisator aufgeführten imitierten Benutzer.

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

Hinzufügen von Terminen mithilfe des Identitätswechsels mit EWS

EWS ermöglicht Ihrer Anwendung die Verwendung des Identitätswechsels, um Elemente im Namen des Besitzers des Kalenders zu einem Kalender hinzufügen. In diesem Beispiel wird gezeigt, wie Sie den Vorgang CreateItem verwenden, um dem Kalender eines Kontos mit Identitätswechsel einen Termin hinzuzufügen.

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

Beachten Sie, dass neben dem Hinzufügen des ExchangeImpersonation-Elements im SOAP-Header zur Bezeichnung des Kontos, für das wir die Identität annehmen, die gleiche XML-Anforderung zum Erstellen eines Termins ohne Identitätswechsel verwendet wird.

Das folgende Beispiel zeigt den Antwort-XML-Code, der vom CreateItem-Vorgang zurückgegeben wird.

Hinweis

Die Attribute ItemId und ChangeKey sind zur besseren Lesbarkeit gekürzt.

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

Auch hierbei handelt es sich um den gleichen XML-Code, der zurückgegeben wird, wenn Sie den Vorgang CreateItem ohne Identitätswechsel verwenden.

Siehe auch