derwowusste
Goto Top

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?

Content-ID: 387509

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

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

erikro
erikro 24.09.2018 um 15:03:32 Uhr
Goto Top
Moin,

den Knopf "Autoauswahl" in der Planungsansicht kennst Du?

Liebe Grüße

Erik
DerWoWusste
DerWoWusste 24.09.2018 um 15:10:43 Uhr
Goto Top
Hi.

Ja, den kenne ich. Leider berücksichtigt der nicht die vorgegebene Zeit (die ist fix, nur der Tag ist nicht fix).
colinardo
Lösung colinardo 24.09.2018 aktualisiert um 16:23:24 Uhr
Goto Top
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 face-wink)
# 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
Viel Spaß
Grüße Uwe
DerWoWusste
DerWoWusste 24.09.2018 um 16:11:23 Uhr
Goto Top
Moin Uwe.

Stark, das klappt. Wäre es ohne Verrenkungen für dich noch möglich, das auf die Tage Montag bis Freitag zu beschränken?
colinardo
colinardo 24.09.2018 um 16:22:07 Uhr
Goto Top
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.
DerWoWusste
DerWoWusste 24.09.2018 um 16:29:53 Uhr
Goto Top
Passt. Ich bin mal wieder wunschlos glücklich. Herzlichen Dank und großes Kompliment an Deine Künste.
Ich hoffe, ich werde dir irgendwann auch noch helfen können.
colinardo
colinardo 24.09.2018 aktualisiert um 16:38:13 Uhr
Goto Top
Zu viele Blumen face-wink.
Ich hoffe, ich werde dir irgendwann auch noch helfen können.
Tust du schon, deine Wissensbeiträge zu Bitlocker & Co. lese ich immer sehr gerne.
DerWoWusste
DerWoWusste 24.09.2018 um 17:03:12 Uhr
Goto Top
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
colinardo
colinardo 24.09.2018 um 18:10:28 Uhr
Goto Top
Zitat von @DerWoWusste:

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
Schmunzel face-big-smile, ich setz dann schon mal den Helm auf.