none
Wie kann ich auf Exchange erstellte Termine in einen bestimmten Kalender einer mailbox eintragen? RRS feed

  • Frage

  • Hi,

    habe mit folgendem Code einen Termin erstellt und möchte diesen nun in den Kalender einer vordefinierten mailbox speichern. Ich komme aber leider nicht drauf wie ich die Save Methode definieren muss...

    #Import der managed Exchange Web Services API DLL
    Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"
    
    #E-Mail Adresse für die Mailbox festlegen in der gesucht werden soll
    $Mailboxname="Example@domain.de"
    #Script so einstellen, das Verbose Meldungen angezeigt werden
    $VerbosePreference = 'Continue'
    #Die Exchange Version setzen die genutzt werden soll  
    $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013
    #Den Data-Webservice mit der Exchange Server Version erstellen
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
    
    #Den eben selbst erstellten Datentyp in dem ServicePointManager veröffentlichen
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
    
    #Mit dem Service automatisch den Exchange Server finden, der für die Mailbox zuständig ist.
    $service.AutodiscoverUrl($MailboxName,{$true})
    # Anzeigen des gefundenen Exchange Servers  
    Write-Verbose "Ich benutze den Exchange Server : $($Service.url) für das Postfach: $Mailboxname"
    
    
    [Microsoft.Exchange.WebServices.Data.Appointment]$app = New-Object Microsoft.Exchange.WebServices.Data.Appointment($service);
    $app.Body = "testbody"
    $app.Subject = "Subject"
    [DateTime]$app.Start = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 8 -Minute 30 -Second 0)
    [DateTime]$app.End = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 9 -Minute 30 -Second 0)
    
    $app.save($save)

    PS: Habe es schon mit RequiredAttendees.Add("Example@domain.de") versucht. Macht aber aus einem Termin ein Meeting und sendet anschließend beim speichern eine Mail an den Betreffenden Account, in der der Nutzer dem Meeting zustimmen muss.

    https://msdn.microsoft.com/de-de/library/office/dn495611(v=exchg.150).aspx?f=255&MSPPError=-2147217396

    Danke für jede Hilfe

    Grüße



    • Bearbeitet MCMaggi Montag, 16. Oktober 2017 08:42
    Montag, 16. Oktober 2017 08:29

Antworten

  • Ich verwende zum erstellen des Services immer das Konto von dem aus ich andere bearbeiten möchte. Außerdem ziehe ich mir die Credentials entweder aus einem PSCredential-Object oder verwende mit UseDefaulCredentials die der Session. Das ist meiner Meinung nach auch eh besser als Plaintextkennwörter in Scripte zu schreiben ;-)

    Das hier hat in meinem Testsystem funktioniert:

    Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"
    $Mailboxname="admin@domain.com"
    $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
    $service.AutodiscoverUrl($MailboxName,{$true})
    $PSCred = Get-Credential
    $creds = $PSCred.GetNetworkCredential() 
    $service.Credentials = $creds
    $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, "testuser2@contoso.com")  
    [Microsoft.Exchange.WebServices.Data.Appointment]$app = New-Object Microsoft.Exchange.WebServices.Data.Appointment($service);
    $app.Body = "testbody"
    $app.Subject = "Subject"
    [DateTime]$app.Start = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 8 -Minute 30 -Second 0)
    [DateTime]$app.End = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 9 -Minute 30 -Second 0) 
    $app.save()

    Alternative kann statt:

    $PSCred = Get-Credential
    $creds = $PSCred.GetNetworkCredential() 
    $service.Credentials = $creds

    auch folgendes verwendet werden um die Session credentials zu verwenden:

    $service.UseDefaultCredentials = $true


    Mittwoch, 25. Oktober 2017 14:43
  • Moin,

    dann musst Du den Admin noch in die ApplicationImpersonation-Rolle stecken und bei der Initialisierung angeben, dass Impersonation benutzt wird (https://msdn.microsoft.com/en-us/library/office/dd633680(v=exchg.80).aspx )


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 16. Oktober 2017 10:49

Alle Antworten

  • Moin,

    wenn Du $app.Save() ohne Argumente aufrufst, speichert EWS den Termin im Standardkalender des Postfaches  $Mailboxname. Für einen anderen Ordner derselben Mailbox, musst Du dir die FolderID besorgen und die an Save als Parameter übergeben. Möchtest Du etwas anderes erreichen?


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 16. Oktober 2017 08:54
  • Hallo, 

    erst mal danke für die schnelle Antwort.

    Ich melde mich auf dem Server mit dem Admin an und der Termin wird immer im Kalender des Admins angelegt, egal welches Postfach ich in $Mailboxname angebe.

    Möchte einfach nur in $Mailboxname eine Mail angeben und in den Kalender des Postfachs den Termin speichern.

    Grüße

    Montag, 16. Oktober 2017 09:50
  • Moin,

    dann musst Du den Admin noch in die ApplicationImpersonation-Rolle stecken und bei der Initialisierung angeben, dass Impersonation benutzt wird (https://msdn.microsoft.com/en-us/library/office/dd633680(v=exchg.80).aspx )


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Montag, 16. Oktober 2017 10:49
  • Habe mein Script angepasst, allerdings bekomme ich jetzt, je nachdem ob ich die Admin oder Useradresse angebe eine Fehlermeldung wenn ich speichern will. (Nicht autorisiert oder nicht berechtigt)

    cls
    #Import der managed Exchange Web Services API DLL
    Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"
    #E-Mail Adresse für die Mailbox festlegen in der gesucht werden soll
    $Mailboxname="User@domain.de"
    #Script so einstellen, das Verbose Meldungen angezeigt werden
    $VerbosePreference = 'Continue'
    #Die Exchange Version setzen die genutzt werden soll  
    $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013
    #Den Data-Webservice mit der Exchange Server Version erstellen
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
    #Den eben selbst erstellten Datentyp in dem ServicePointManager veröffentlichen
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
    #Mit dem Service automatisch den Exchange Server finden, der für die Mailbox zuständig ist.
    $service.AutodiscoverUrl($MailboxName,{$true})
    #Credentials hinzufügen
    $creds = New-Object System.Net.NetworkCredential("Admin@domain.de","Password")
    $service.Credentials = $creds
    #Userid
    $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, "User@domain.de")  
    # Anzeigen des gefundenen Exchange Servers  
    Write-Verbose "Ich benutze den Exchange Server : $($Service.url) für das Postfach: $Mailboxname"
    [Microsoft.Exchange.WebServices.Data.Appointment]$app = New-Object Microsoft.Exchange.WebServices.Data.Appointment($service);
    $app.Body = "testbody"
    $app.Subject = "Subject"
    [DateTime]$app.Start = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 8 -Minute 30 -Second 0)
    [DateTime]$app.End = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 9 -Minute 30 -Second 0) 
    $app.save()

    Wenn ich die Credential definiere bevor ich die URL auslesen lasse, bekomme ich beim auslesen der URL ebenfalls eine Fehlermeldung. Vielleicht ist das das Problem ?

    Grüße


    • Bearbeitet MCMaggi Montag, 16. Oktober 2017 12:41
    Montag, 16. Oktober 2017 12:40
  • Ich verwende zum erstellen des Services immer das Konto von dem aus ich andere bearbeiten möchte. Außerdem ziehe ich mir die Credentials entweder aus einem PSCredential-Object oder verwende mit UseDefaulCredentials die der Session. Das ist meiner Meinung nach auch eh besser als Plaintextkennwörter in Scripte zu schreiben ;-)

    Das hier hat in meinem Testsystem funktioniert:

    Add-Type -Path "C:\Program Files\Microsoft\Exchange Server\V15\Bin\Microsoft.Exchange.WebServices.dll"
    $Mailboxname="admin@domain.com"
    $ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
    $service.AutodiscoverUrl($MailboxName,{$true})
    $PSCred = Get-Credential
    $creds = $PSCred.GetNetworkCredential() 
    $service.Credentials = $creds
    $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, "testuser2@contoso.com")  
    [Microsoft.Exchange.WebServices.Data.Appointment]$app = New-Object Microsoft.Exchange.WebServices.Data.Appointment($service);
    $app.Body = "testbody"
    $app.Subject = "Subject"
    [DateTime]$app.Start = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 8 -Minute 30 -Second 0)
    [DateTime]$app.End = (Get-Date -Year 2017 -Month 10 -day 13 -Hour 9 -Minute 30 -Second 0) 
    $app.save()

    Alternative kann statt:

    $PSCred = Get-Credential
    $creds = $PSCred.GetNetworkCredential() 
    $service.Credentials = $creds

    auch folgendes verwendet werden um die Session credentials zu verwenden:

    $service.UseDefaultCredentials = $true


    Mittwoch, 25. Oktober 2017 14:43
  • Da stimme ich Torsten zu. Kennworte gehören nicht ins Script und auch nicht in eine Konfig-Datei.

    Als Krönung könnte man auch noch das Service-Kennwort AES verschlüsselt speichern. Dann klappt es auch mit der Automation :-)

    Gruss, Mike


    • Bearbeitet Mike_Schmitz Mittwoch, 25. Oktober 2017 18:16 Typo
    Mittwoch, 25. Oktober 2017 18:14