derwowusste
Goto Top

Kalenderabfrage Gerätepostfach per Powershell

Moin Exchange-Admins und Powershellmeister!

Ich würde gerne programmatisch zu einem Gerätepostfach auslesen können, von welchem Nutzer es gebucht ist, und bis wann.
Bislang habe ich noch kein passendes Kommando ausmachen können. Exchange ist ein 2016 CU9.

Content-Key: 382492

Url: https://administrator.de/contentid/382492

Ausgedruckt am: 28.03.2024 um 23:03 Uhr

Mitglied: colinardo
Lösung colinardo 06.08.2018, aktualisiert am 15.08.2018 um 18:23:56 Uhr
Goto Top
Servus DWW,
machst du wie so oft über die Universalschnittstelle EWS. Ab EX2016 gibt es mitlerweile auch eine REST-API.

Bitte Voraussetzungen unter dem Skript beachten!

Im Beispiel werden alle Meetings deren Startdatum oder Enddatum größer Heute ist mit einigen Eigenschaften als Object zurückgeliefert.
(Variablen im Kopf: Exchange Server und Mailbox anpassen.)
# Start Variablen -------------------------------------------------------------------------
# FQDN Exchange  Server 
$exserver = "ex.domain.tld"  
# E-Mail Adresse der Resource-Mailbox
$mailbox = "resourcemailbox@domain.tld"  
# Ende Variablen -------------------------------------------------------------------------

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}   

$ewspath = "$psscriptroot\Microsoft.Exchange.WebServices.dll"  
if (!(Test-Path $ewspath)){
    write-error "EWS DLL not found in script directory!"  
    return
}
# EWS DLL laden
Add-Type -Path $ewspath

# Allen Zertifikaten vertrauen
try{
Add-Type '  
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
'  
}catch{}
# Trust all certs policy dem ServicePointManager zuweisen
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

# EWS Objekt erstellen
$ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010)
$ews.UseDefaultCredentials = $true
$ews.Url = "https://$exserver/ews/exchange.asmx"  
$ews.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $mailbox)

# -----------------------------
# Ergebnis Set-Einstellungen festlegen
$view = New-Object Microsoft.Exchange.WebServices.Data.ItemView(10000)
$view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
# Nur Meetings größer/gleich Heute
$filterStartDate = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.AppointmentSchema]::Start,(get-date).Date)
# oder Meetings mit Enddatum größer Heute
$filterEndDate = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo([Microsoft.Exchange.WebServices.Data.AppointmentSchema]::End,(get-date).Date)
# Die zwei Conditions zu einer FilterCollection hinzufügen
$filterCollection = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection([Microsoft.Exchange.WebServices.Data.LogicalOperator]::Or,[Microsoft.Exchange.WebServices.Data.SearchFilter[]]($filterStartDate,$filterEndDate))
# Ergebnis Sortierung festlegen
$view.OrderBy.Add([Microsoft.Exchange.WebServices.Data.AppointmentSchema]::Start,[Microsoft.Exchange.WebServices.Data.SortDirection]::Descending)
# Kalender mit  Einstellungen durchsuchen
$result = $ews.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$filterCollection,$view)
# Gefundene Items im Kalender auflisten
$result.Items | select Subject,Start,End,Organizer,RequiredAttendees,OptionalAttendees | ft
Du benötigst die EWS DLL im selben Verzeichnis und der User der es ausführt muss über Impersonation-Rechte oder entsprechende Lese-Rechte auf der Mailbox am Exchange verfügen.

Es gelten also die selben Vorraussetzungen wie bei diesem Skript hier
Script odgl ausführen, wenn E-Mail eingeht

Grüße Uwe
Mitglied: DerWoWusste
DerWoWusste 06.08.2018 um 17:48:52 Uhr
Goto Top
Danke Uwe, ich werde es mir erst morgen anschauen können.
Mitglied: DerWoWusste
DerWoWusste 07.08.2018 um 08:42:45 Uhr
Goto Top
Excellent. Ein weiteres Mal Dir großen Dank!
Mitglied: colinardo
colinardo 07.08.2018 aktualisiert um 09:03:15 Uhr
Goto Top
Keine Ursache. Freut mich wenn ich helfen konnte.
Mitglied: DerWoWusste
DerWoWusste 15.08.2018 um 16:52:28 Uhr
Goto Top
Sag mal, Uwe, kannst Du das Skript noch ohne große Mühe (hoffentlich) erweitern, so dass es zusätzlich noch alle alten Buchungen ausgibt, deren Ende heute ist bzw. in der Zukunft?
Mitglied: colinardo
Lösung colinardo 15.08.2018 aktualisiert um 18:23:01 Uhr
Goto Top
Zitat von @DerWoWusste:

Sag mal, Uwe, kannst Du das Skript noch ohne große Mühe (hoffentlich) erweitern, so dass es zusätzlich noch alle alten Buchungen ausgibt, deren Ende heute ist bzw. in der Zukunft?
Kein Problem, hab ich dir jetzt oben noch mit eingebaut. Mit der SearchFilterCollection lassen sich beliebig viele Suchfilter miteinander kombinieren.
Mitglied: DerWoWusste
DerWoWusste 15.08.2018 um 22:20:48 Uhr
Goto Top
Cool, deine Sachen funktionieren aber auch immer. "MEE-GA!", wie Dieter sagen würde.

Danke!