EWS: Auslesen von verknüpften Kalendern über WebServices --> Woher bekomme ich die nötigen eMail-Adressen?

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von GambaJo.

    EWS: Auslesen von verknüpften Kalendern über WebServices --> Woher bekomme ich die nötigen eMail-Adressen?

    Kurz zu meinem Vorhaben:
    Ich arbeite gerade an einem Dienst, der sich periodisch über EWS mit einem Exchange-Server verbinden, und dort alle geänderten Kalender-Termine auslesen soll (die werden dann in einer seperaten Datenbank abgelegt).

    Was ich schon habe:
    Der Dienst kann sich schon mit einem bestimmten User-Account am Exchange-Server anmelden, und die geänderten Termine des Acounts abrufen.

    Mein Problem:
    Die Idee war eigentlich, dass man auf dem Exchange-Server einen "Dummy"-User anlegt, der alle freigegebenen Kalender geöffnet (oder verknüpft hat), so dass diese kalender bei ihm in Outlook unter "Kalender von Personen" auftauchen. Auf dise Kalender hat der User nur Leserechte.

    Ich kann diese "verknüpften" Kalender zwar über den Dienst auslesen, aber nur, wenn ich die eMail-Adresse des Postfachs kenne, dem der "verknüpfte" Kalender gehört.

    z.B.
    User1 hat die Adresse user1@test.de
    User2 hat die Adresse user2@test.de
    User2 hat seinen Kalender freigegeben, und User1 hat den freigegebenen kalender von User2 bei sich geöffnet.

    Wenn ich beim Holen der Termine keine eMail-Adresse angebe, werden mir nur die Termine von User1 angezeigt. Wenn ich beim Holen der Termine die Adresse von User2 angbe, dann bekomme ich seine Termine.


    Hier ein Code-Ausschnitt:

    VB.NET-Quellcode

    1. Private Function GetAppointmentsFromExchange(ByVal emailAdress As String, ByVal StartZeit As Date) As List(Of GroupWareAppointment)
    2. Dim lAppointmentList As New List(Of GroupWareAppointment)
    3. 'Neues Find-Request erzeugen
    4. Dim lFindRequest As FindItemType = New FindItemType()
    5. lFindRequest.Transversal = ItemQueryTransversalType.Shallow
    6. lFindRequest.ItemShape = New ItemResponseShape()
    7. lFindRequest.ItemShape.BaseShape = DefaultShapeNamesType.Default
    8. 'Zu durchsuchenden Ordner festlegen
    9. Dim lCalendar As DistingishedFolderIdNameType.Calendar
    10. lCalendar.Id = DistinguishedFolderNameType.calendar
    11. 'Wenn nicht der eigene Kalender, sondern ein freigegebener Kalender gelesen werden soll
    12. If Not (String.IsNullOrEmpty(emailAdress)) Then
    13. lCalendar.Mailbox = New EmailAddressType()
    14. lCalendar.Mailbox.EmailAddress = emailAdress
    15. End If
    16. lFindRequest.ParentFolderIds = New BaseFolderIdType() {lCalendar}
    17. 'hier kommt noch etwas unwichtiger Code
    18. 'Request an Server senden
    19. Dim lResponse As FindItemResponseType = myExchangeServerAccess.FindItem(lFindRequest)
    20. 'hier kommt noch etwas unwichtiger Code
    21. Return lAppointmentList
    22. End Function



    Das funktioniert auch alles so weit ganz gut. Ich muss nur für jeden "verknüpften" Kalender die eMail-Adresse wissen, um sie in dem ode-Beispiel anzugeben. ich habe schon lange im Netz gesucht, aber anscheinend bietet EWS das nicht (scheint mir irgendwie nicht zu Ende gedacht zu sein).
    Die einzige Lösung, die ich gefunden habe, war über ActiveDirectory zu suchen. Aber das wird nicht unbedingt klappen, da das ActiveDirectory losgelöst von Exchange ist.


    Ich brauche also entweder eine Liste aller Exchange-user bzw. deren eMail-Adresse, oder eine andere Lösung auf freigegebene und verknüpfte kalender zu zugreifen.


    Hat jemand einen Tipp?
    Vielleicht interessiert es den einen oder anderen, wie ich es nun gelöst habe.

    Es ist zwar keine schöne Lösung, aber es funktioniert.

    Ich gehe zuerst übers Active Directory und suche mir da die User, die ein Exchange-Postfach haben und hole mir deren eMail-Adressen. Diese laufe ich dann in einer Schleife durch und probiere aus, ob ich auf ihren Kalender zugreifen kann. Wenn ja, hole ich mir dort die geänderten Termine.

    Das Holen der Termine (GetItem()) hat recht lange gedauert. Aber wenn man sich nicht alle Propertys, sondern nur die, die man auch wirklich braucht (AdditionalPropertys) holt, dann ist es recht flott.

    Diese Methode funktioniert zwar so weit ganz gut, aber sie hat einen Haken. Ich sehe zwar, welche neu erstellt und welche geändert wurden. Aber die, die gelöscht wurden, sind ja weg. Und was weg ist, kann man nicht holen.

    Wenn man Glück hat, dann findet man sie in den gelöschten Objekten. Aber darauf will ich mich nicht verlassen.



    Daher habe ich gestern noch die Funktion SyncFolderItem() ausprobiert. Diese Funktion ist an sich ganz gut, da sie auch die gelöschten bzw. deren IDs liefert, allerdings muss ich noch rausfinden, wie man auf andere Postfächer zugreifen und auch den SyncState ermitteln kann. Ich weiß, dass man auf andere Postfächer zugreifen kann, denn man brauch lediglich die FolderID der „fremden“ freigegebenen Ordner. Aber an diese ID kommt man nicht so einfach. Ich denke, ich werde das wieder übers Active Directory lösen.

    SyncState ist dabei die Eigenschaft, mit der man sagt, ab wann man synchronisieren möchte. Es ist aber kein Datum, sondern eine lange kryptische Zeichnfolge, ähnlich einer ID. SyncState kann man nicht berechnen oder aus einem Datum bilden. Jedes Mal, wenn man synchronisiert, bekommt man von Exchange einem neuen SyncState, den man sichern muss. Beim nächsten Synchronisieren muss man diesen SyncState wieder angeben, sonst wird von Anfang an synchronisiert.

    Ich finde es irgendwie schade, dass man das nicht auch über ein Datum machen kann.



    Ich werde mir die Tage auch mal die Notifications anschauen. Da informiert einen Exchange selbst, ob sich etwas geändert hat. Diese Lösung wäre natürlich optimal. Allerdings habe ich in einem Buch gelesen, dass es nur für ein Postfach geht (für das, welches man gerade angemeldet ist), und in einem anderen habe ich gelesen, dass es übergreifen ist.

    Ich werde es auf jeden Fall ausprobieren.