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

Printed on: April 20, 2024 at 00:04 o'clock

Member: colinardo
Solution colinardo Aug 06, 2018, updated at Aug 15, 2018 at 16:23:56 (UTC)
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
Member: DerWoWusste
DerWoWusste Aug 06, 2018 at 15:48:52 (UTC)
Goto Top
Danke Uwe, ich werde es mir erst morgen anschauen können.
Member: DerWoWusste
DerWoWusste Aug 07, 2018 at 06:42:45 (UTC)
Goto Top
Excellent. Ein weiteres Mal Dir großen Dank!
Member: colinardo
colinardo Aug 07, 2018 updated at 07:03:15 (UTC)
Goto Top
Keine Ursache. Freut mich wenn ich helfen konnte.
Member: DerWoWusste
DerWoWusste Aug 15, 2018 at 14:52:28 (UTC)
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?
Member: colinardo
Solution colinardo Aug 15, 2018 updated at 16:23:01 (UTC)
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.
Member: DerWoWusste
DerWoWusste Aug 15, 2018 at 20:20:48 (UTC)
Goto Top
Cool, deine Sachen funktionieren aber auch immer. "MEE-GA!", wie Dieter sagen würde.

Danke!