birdyb
Goto Top

Powershell: Anzahl ungelesener Items auslesen ohne Impersonation

Guten Morgen zusammen,

ich hoffe, Ihr habt die Weihnachtstage gut überstanden.
Um mir die Arbeit etwas zu erleichtern, versuche ich gerade ein Powershell-Script zu erstellen, welches mir die Anzahl der ungelesenen Items in einer (Shared-)Mailbox zu der ich Zugriff habe ausgibt.
Es handelt sich dabei um ein O365-Konto.
Irgendwie scheitere ich aber jetzt schon daran über irgend ein Cmdlet die Anzahl herauszufinden. Ich finde die passende Eigenschaft einfach nicht. Das einzige was ich bei google noch gefunden habe war ein Skript welches allerdings Impersonation-Rechte verlangt und die habe ich und die anderen User, die es vielleicht einsetzen möchten nicht.
Ich habe schon mit Get-Mailbox und Get-MailboxFolder, sowie Get-MailboxStatistics rumprobiert, komme allerdings nicht weiter.

Könnt Ihr mir bitte einen Schubs in die richtige Richtung geben?

Vielen Dank und beste Grüße

Content-ID: 529886

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

142232
Lösung 142232 27.12.2019 aktualisiert um 10:33:06 Uhr
Goto Top
EWS (Exchange Web Services) ist dein Stichwort, und die Eigenschaft heißt UnreadCount
https://www.msxfaq.de/code/ews.htm

Oder Search-Mailbox mit Query isread:false
https://docs.microsoft.com/de-de/powershell/module/exchange/mailboxes/se ...
colinardo
Lösung colinardo 28.12.2019 aktualisiert um 14:34:07 Uhr
Goto Top
Servus Birdy,
nicht erschrecken, der Großteil ist nur für eine Funktion zum Nachladen der benötigten EWS DLL in den Skriptordner, habe ich nur ergänzt damit man es ohne Umwege sofort ausprobieren kann.
Mail-Adresse im Kopf des Skripts noch anpassen.
Das Skript gibt hier im Beispiel nur die Anzahl der ungelesenen Nachrichten der Inbox wieder.
Im Beispiel gibst du die Credentials manuell an, kann man aber auch die Default-Credentials mit denen das Skript ausgeführt wird nehmen. Entsprechende Codestelle sollte selbsterklärend sein.
# Mailbox Mail-Adresse
$mailbox = 'shared@domain.tld'  
# credentials abfragen
$creds = Get-Credential -Message "Bitte Zugangsdaten eingeben die über ausreichend Berechtigungen auf die Mailbox verfügen:"  

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    

# Funktion zum Laden des EWS Assemblies
function Load-EWSLibrary {
    $localpath = "$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 Assembly laden
Load-EWSLibrary

# EWS Service-Object erstellen
$ews = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010)
$ews.AutodiscoverUrl($mailbox)
$ews.UseDefaultCredentials = $false
$ews.Credentials = $creds.GetNetworkCredential()

# Inbox id der Sharedmailbox ermitteln
$inbox = New-Object Microsoft.Exchange.WebServices.Data.FolderId ([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox),$mailbox 

# ungelesene items der Inbox ermitteln
$unreadcount = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($ews,$inbox).UnreadCount

# und das ganze ausgeben
write-host "Inbox unread items: $unreadcount"  
Viel Spaß damit.

Wünsche dir schon mal ein gutes neues Jahr.

Grüße Uwe
BirdyB
BirdyB 28.12.2019 um 14:49:35 Uhr
Goto Top
Hey Uwe,

das ist großartig. Vielen Dank für das Skript und dir auch einen guten Start ins neue Jahr.

VG