valarmorghulis
Goto Top

Exchange online Powershell - Statistik ausgeben, wie viele Kalendereinträge ein User nach dem heutigen Tag hat

Hallo zusammen,

ich hoffe die Frage gibt es nicht bereits.
Wir haben einen Exchange online und ich hab natürlich die Adminrechte.

Problem:
Wir möchten gerne eine Abfrage per Powershell machen für alle vorhandenen User.
Es soll ausgegeben werden, wie viele Kalendereinträge ein User innerhalb der nächsten 4 Wochen hat. Es soll also eine Anzahl herauskommen, aber am Besten auch noch ohne Serientermine (wenn das geht).


Ich habe leider nicht viel Ahnung davon.
Weiß nur wie ich mich mit dem Exchange online per Powershell verbinden kann.
Hab auch eine Abfrage ergoogelt, die auswirft wie viele sichtbare Elemente ein User im Posteingang hat und wie ich eine csv einlese, in der eben alle Usernamen stehen für den Parameter "-Identity".
Aber mehr weiß ich leider wirklich nicht.

Ich hoffe ihr könnt mir dabei helfen!


Vielen Dank im Voraus und schöne Grüße!
Fabian

Content-Key: 553742

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

Printed on: April 24, 2024 at 04:04 o'clock

Member: Cloudrakete
Cloudrakete Mar 03, 2020 at 13:16:22 (UTC)
Goto Top
Member: ValarMorghulis
ValarMorghulis Mar 03, 2020 at 13:46:13 (UTC)
Goto Top
Hallo!

Erstmal danke für die schnelle Antwort.
Leider kenne ich mich mit APIs gar nicht aus.
Werde es mir aber mal ansehen.


Hintergrund ist folgender:
Wir legen sehr viel Wert darauf, dass unsere Mitarbeiter den Outlook-Kalender effektiv zur Eigenplanung nutzen.
Leider wird das trotz Vorgabe nicht immer gemacht. Um aber einen Ansatz zu finden, welcher Mitarbeiter nochmal Hilfe bei der Selbstplanung braucht hätten wir gerne so eine Auswertung.
Wenn ich eine Liste (am Besten .csv) bekomme, in der Benutzer und Anzahl der Kalendereinträge in den nächsten 4 Wochen steht, kann ich nach den geringsten Einträgen sortieren.
Somit könnten wir regelmäßig prüfen, ob alle Mitarbeiter den Kalender effektiv verwenden oder nicht.
Mitglied: 143127
143127 Mar 03, 2020 at 13:48:10 (UTC)
Goto Top
Member: Cloudrakete
Cloudrakete Mar 03, 2020 at 13:49:48 (UTC)
Goto Top
Ich finde eurer Vorhaben gar nicht gut, vorallem aus der Sicht der Mitarbeiter.
Allen etwas aufzuerlegen, anstatt sie das selbst machen zulassen, ist jetzt nicht die feine Art der Führung.
Ich hätte sofort meine Kündigung eingereicht, wenn mir bekannt wäre, dass jemand meine Nutzung des Kalenders trackt.

Deshalb biete ich keine weitere Hilfe an, sorry.
Member: ValarMorghulis
ValarMorghulis Mar 03, 2020 at 13:59:06 (UTC)
Goto Top
Zitat von @Cloudrakete:

Ich finde eurer Vorhaben gar nicht gut, vorallem aus der Sicht der Mitarbeiter.
Allen etwas aufzuerlegen, anstatt sie das selbst machen zulassen, ist jetzt nicht die feine Art der Führung.
Ich hätte sofort meine Kündigung eingereicht, wenn mir bekannt wäre, dass jemand meine Nutzung des Kalenders trackt.

Deshalb biete ich keine weitere Hilfe an, sorry.


Das ist nicht meine Idee.
Ich muss nur eine Lösung finden.


Außerdem hat es ja keine negativen Auswirkungen.
Die Absicht dahinter ist den Mitarbeitern zu helfen, sich besser zu organisieren.
Nicht jeder kann das einfach so.
Member: colinardo
colinardo Mar 03, 2020, updated at Mar 08, 2020 at 09:32:17 (UTC)
Goto Top
Servus Fabian, willkommen auf Administrator.de!
Mit etwas EWS ist das auch kein Problem.
Variablen im Kopf anpassen und Hinweise auch zur Formatierung der CSV mit den Usern beachten.
(Achtung für die Abfrage fremder Mailboxen sind Impersonation-Rechte für den Account erforderlich der das Skript ausführt! Falls das für dich bömische Dörfer sein sollten, beliest du dich hier.) p.s. Und immer schön die DSGVO beachten face-wink!
<#
    @colinardo (Administrator.de)
    Anzahl Kalendereinträge (ohne Serientermine) von Usern in einem bestimmtem Zeitraum abfragen und in CSV exportieren
    (Achtung, arbeitet mit Impersonation da fremde Mailboxen abgefragt werden! User der die Abfrage durchführt muss in diesem Fall über Impersonation Berechtigungen verfügen um fremde Mailboxen abfragen zu können)
#>

# == Variablen ===========================
# Von Datum
$startDate = (get-date).Date
# bis Datum
$endDate = $startDate.AddMonths(1)
# CSV Ausgabedatei
$csvexport = "$psscriptroot\export.csv"  
# Pfad zur CSV der Benutzer
# Sollte so organisiert sein
<# 
"Mail"  
"userA@domain.tld"  
"userB@domain.tld"  
"userC@domain.tld"  
#>

$csvusers = "$psscriptroot\users.csv"   
# =========================================

# Funktion zum Laden des EWS Assemblies
function Load-EWSLibrary {
    if ($psscriptroot -eq ''){  
         $localpath = Join-Path $env:TEMP "Microsoft.Exchange.WebServices.dll"  
    }else{
         $localpath = Join-Path $PSScriptRoot "Microsoft.Exchange.WebServices.dll"  
    }
    if(!(Test-Path $localpath )){
        Add-Type -A System.IO.Compression.FileSystem
        $tmp = "$env:TEMP\$([IO.Path]::GetRandomFileName())"  
        write-host "Downloading and extracting required 'Microsoft.Exchange.WebServices.dll' ... " -F Green -NoNewline  
        try{
            (New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/Exchange.WebServices.Managed.Api/2.2.1.2', $tmp)  
            $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
            $zip.Entries | ?{$_.Fullname -eq 'lib/net35/Microsoft.Exchange.WebServices.dll'} | %{  
                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
            }
            write-host "OK" -F Green  
        }catch{
            throw "Error downloading required EWS Library / Error: $($_.Exception.Message)"  
        }finally{
            if ($zip){$zip.Dispose()}
            del $tmp -Force -EA SilentlyContinue
        }
    }
    Add-Type -Path $localpath
}

# EWS DLL laden
Load-EWSLibrary

# EWS Objekt erstellen
$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010)
# view mit Start und Enddatum erstellen
$view = New-Object Microsoft.Exchange.WebServices.Data.CalendarView $startDate, $endDate

# csv mit den Usern importieren
$users = Import-CSV $csvusers -Delimiter ";"  

$meetingdata = foreach($user in $users){    
    $service.AutoDiscoverUrl($user.Mail)
    $service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId ([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $user.Mail)
    
    # items suchen
    $result = $service.FindAppointments([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,$view)

    # Anzahl an Items im Kalender auflisten
    [pscustomobject]@{User = $user.Mail;Count = ($result.items | ?{$_.IsRecurring -eq $false}).Count}
}

# daten in csv exportieren
$meetingdata | export-csv $csvexport -Delimiter ";" -NoType -Encoding UTF8  

# csv öffnen
start $csvexport

Ausgabe erfolgt dann in eine CSV nach folgendem Schema
"User";"Count"  
"userA@domain.tld";"3"  
"userB@domain.tld";"0"  
Viel Spaß

Grüße Uwe

p.s. Persönliche Anpassungen => PN
Member: colinardo
colinardo Mar 06, 2020 updated at 14:58:22 (UTC)
Goto Top
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren nicht vergessen. Merci.