Outlook und Exchange - wie perfekten Termin in den nächsten 30 Tagen finden?
Moin Kollegen.
Wieder eine Frage, die sich vermutlich von Leuten mit größerer Erfahrungen auf der Exchange-Managementshell lösen lassen wird:
Bei der Outlook-Terminplanung ist Outlook 2016 ja schon recht zuvorkommend und zeigt die Anzahl an Konflikten für verschiedene Stunden des gewählten Tages automatisch an.
Ich würde mir gerne darüber hinaus alle Tage innerhalb der nächsten 30 Tage ausgeben lassen, auf denen ich zu der gewählten Zeit (Beispiel 11-12 Uhr) mit den gewählten Teilnehmern (Mustermann, Beispielmann, Nochnmann) maximal einen Konflikt habe.
Hat das jemand schon einmal gemacht?
Wieder eine Frage, die sich vermutlich von Leuten mit größerer Erfahrungen auf der Exchange-Managementshell lösen lassen wird:
Bei der Outlook-Terminplanung ist Outlook 2016 ja schon recht zuvorkommend und zeigt die Anzahl an Konflikten für verschiedene Stunden des gewählten Tages automatisch an.
Ich würde mir gerne darüber hinaus alle Tage innerhalb der nächsten 30 Tage ausgeben lassen, auf denen ich zu der gewählten Zeit (Beispiel 11-12 Uhr) mit den gewählten Teilnehmern (Mustermann, Beispielmann, Nochnmann) maximal einen Konflikt habe.
Hat das jemand schon einmal gemacht?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 387509
Url: https://administrator.de/contentid/387509
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
9 Kommentare
Neuester Kommentar
Servus DWW,
mal schnell als Powershell EWS (das mit der benötigten EWS DLL kennst du ja mittlerweile) gescriptet:
(Ohne "Gewehr" da zu wenig Zeit für's Errorhandling )
Viel Spaß
Grüße Uwe
mal schnell als Powershell EWS (das mit der benötigten EWS DLL kennst du ja mittlerweile) gescriptet:
(Ohne "Gewehr" da zu wenig Zeit für's Errorhandling )
# FQDN des Exchange Servers
$EXCHANGESERVER = 'ex.domain.tld'
# Array der teilnehmenden User
$users = 'maxmuster@domain.tld','annamusterfrau@domain.tld'
# Startzeit des Meetings
$starttime = [datetime]'11:00:00'
# Dauer des Meetings
$duration = 60
# zu checkende Tage im Voraus
$daysinadvance = 30
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}
# Funktion zum Verbinden mit dem Exchange EWS Dienst
function ConnectTo-EWS {
param(
[parameter(mandatory=$false)][bool]$UseScriptCredentials = $true,
[parameter(mandatory=$false)][pscredential]$Credential,
[parameter(mandatory=$false)][ValidateScript({Test-Path $_})][string]$ewsdll = "$psscriptroot\Microsoft.Exchange.WebServices.dll",
[parameter(mandatory=$false)][string]$mailbox = $null,
[parameter(mandatory=$true)][string]$server
)
# 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;
}
}
'
# Trust all certs policy dem ServicePointManager zuweisen
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
}catch{}
# EWS DLL laden
Add-Type -Path $ewsdll
# EWS-Service Objekt erstellen
$ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010)
$ews.Url = "https://$server/ews/exchange.asmx"
$ews.UseDefaultCredentials = $UseScriptCredentials
if (!$UseScriptCredentials){
$ews.Credentials = $Credential.GetNetworkCredential()
}
if($mailbox){
$ews.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $mailbox)
}
return $ews
}
# Mit Service verbinden
$svc = ConnectTo-EWS -Server $EXCHANGESERVER
# collection für Teilnehmer erstellen
[Microsoft.Exchange.WebServices.Data.AttendeeInfo[]]$attendees = new-object "System.Collections.Generic.List[Microsoft.Exchange.WebServices.Data.AttendeeInfo]"
# Teilnehmer der Collection hinzufügen
$users | %{
$a = new-object Microsoft.Exchange.WebServices.Data.AttendeeInfo
$a.SmtpAddress = $_
$a.AttendeeType = [Microsoft.Exchange.WebServices.Data.MeetingAttendeeType]::Required
$attendees += $a
}
# Availability Options festlegen
[Microsoft.Exchange.WebServices.Data.AvailabilityOptions]$options = New-Object Microsoft.Exchange.WebServices.Data.AvailabilityOptions
$options.GoodSuggestionThreshold = 49
$options.MaximumNonWorkHoursSuggestionsPerDay = 0
$options.MaximumSuggestionsPerDay = 24
$options.MeetingDuration = $duration
$options.MinimumSuggestionQuality = [Microsoft.Exchange.WebServices.Data.SuggestionQuality]::Good
$options.DetailedSuggestionsWindow = New-Object Microsoft.Exchange.WebServices.Data.TimeWindow((get-date),(get-date).AddDays($daysinadvance))
$options.CurrentMeetingTime = $starttime
$options.RequestedFreeBusyView = [Microsoft.Exchange.WebServices.Data.FreeBusyViewType]::FreeBusy
# FreeBusy mit den Optionen abfragen
$result = $svc.GetUserAvailability($attendees,$options.DetailedSuggestionsWindow,[Microsoft.Exchange.WebServices.Data.AvailabilityData]::FreeBusyAndSuggestions,$options)
# Vorschläge ausfiltern
$suggestions = $result.Suggestions.TimeSuggestions | ?{($_.Quality -eq 'Excellent' -or (($_.Conflicts.FreeBusyStatus | ?{$_ -eq 'Free'}).Count -ge $users.Count-1)) -and $_.MeetingTime.toString('HHmm') -eq $starttime.toString('HHmm') -and $_.MeetingTime.DayOfWeek -in 1..5} | sort MeetingTime | select MeetingTime,@{n='Konflikte';e={($_.Conflicts.FreeBusyStatus | ?{$_ -ne 'Free'}).Count}}
# und darstellen
$suggestions | ft -AutoSize
Grüße Uwe
Zitat von @DerWoWusste:
Stark, das klappt. Wäre es ohne Verrenkungen für dich noch möglich, das auf die Tage Montag bis Freitag zu beschränken?
Done.Stark, das klappt. Wäre es ohne Verrenkungen für dich noch möglich, das auf die Tage Montag bis Freitag zu beschränken?
Zitat von @DerWoWusste:
Schmunzel , ich setz dann schon mal den Helm auf.Zu viele Blumen
Ok, ich werde nächstes mal schreiben"man, nun mach schon... das DAUERT...!"
Natürlich nett gemeint, siehe https://youtu.be/649mr61HHi4?t=11