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-Key: 387509

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

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

Member: erikro
erikro Sep 24, 2018 at 13:03:32 (UTC)
Goto Top
Moin,

den Knopf "Autoauswahl" in der Planungsansicht kennst Du?

Liebe Grüße

Erik
Member: DerWoWusste
DerWoWusste Sep 24, 2018 at 13:10:43 (UTC)
Goto Top
Hi.

Ja, den kenne ich. Leider berücksichtigt der nicht die vorgegebene Zeit (die ist fix, nur der Tag ist nicht fix).
Member: colinardo
Solution colinardo Sep 24, 2018 updated at 14:23:24 (UTC)
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
Member: DerWoWusste
DerWoWusste Sep 24, 2018 at 14:11:23 (UTC)
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?
Member: colinardo
colinardo Sep 24, 2018 at 14:22:07 (UTC)
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.
Member: DerWoWusste
DerWoWusste Sep 24, 2018 at 14:29:53 (UTC)
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.
Member: colinardo
colinardo Sep 24, 2018 updated at 14:38:13 (UTC)
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.
Member: DerWoWusste
DerWoWusste Sep 24, 2018 at 15:03:12 (UTC)
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
Member: colinardo
colinardo Sep 24, 2018 at 16:10:28 (UTC)
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.