chris123
Goto Top

Regeln von OOF mit PS anzeigen

Hallo zusamen,

ich möchte die hinterlegten Regen bei Abwesenheitsbenachrichtigungen anzeigen. Mit "Get-MailboxAutoReplyConfiguration" werden mir sämtliche Informationen angezeigt. Nicht aber welche Regel für die Abwensenheitsbenachrichtung angewendet wird.

rule

Mit "Get-Mailbox -Identity „User“ | Get-InboxRule" bekomme ich zwar alle allgemeinen Regeln angezeigt, nicht aber die aus der Abwesenheitsbenachrichtigung.

Gibt es eine Möglichkeit sich diese Regeln ausgegeben zu lassen?

Vielen Dank!
Chris

Content-ID: 1742276828

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

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

chris123
chris123 20.01.2022 um 08:21:48 Uhr
Goto Top
Es geht um Exchange und Outlook 2016
MrCount
MrCount 20.01.2022 um 08:32:18 Uhr
Goto Top
chris123
chris123 20.01.2022 um 08:44:46 Uhr
Goto Top
Leider bringt mich das nicht weiter. Auch wenn ich mit dem Parameter "-ResultSize unlimited" arbeite, werden die Regeln nicht angezeigt.
colinardo
Lösung colinardo 20.01.2022 aktualisiert um 12:38:27 Uhr
Goto Top
Servus.
mit der Hilfe von Powershell und den Exchange Webservices (EWS) z.B. bekommst du alle Regeln erfasst, oder auch mit MFCMAPI, siehe Deaktivieren einer Out-of-Office-Rule eines anderen Postfachs

Nicht erschrecken, das sind meine universellen Funktionen zum Abruf von Ordnern und Items per EWS, dewegen etwas länger. Angabe von Exchange Server und Mailbox , sind ganz unten zu finden.
Zu beachten sind die Anzugebenden Credentials, wenn man diese für eine andere mailbox als seine eigene abfragen möchte muss man entweder Application Impersonation Rechte auf dem Exchange besitzen oder die Credentials der Zielmailbox angeben.
$ErrorActionPreference = 'Stop'  
# Accept TLS protocols
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::GetNames([System.Net.SecurityProtocolType]) 

function ConnectTo-EWS {
    param(
        [parameter(mandatory=$false)][bool]$UseScriptCredentials = $true,
        [parameter(mandatory=$false)][pscredential]$Credential,
        [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
    Load-EWSLibrary

    # 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()
    }
    return $ews
}
# Funktion zum Laden des EWS Assemblies
function Load-EWSLibrary {
    if($psscriptroot -ne ''){  
        $localpath = join-path $psscriptroot 'Microsoft.Exchange.WebServices.dll'  
    }else{
        $localpath = join-path $env:TEMP 'Microsoft.Exchange.WebServices.dll'  
    }
    $tmp = '';$zip = $null  
    try{
        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  
            (New-Object System.Net.WebClient).DownloadFile('https://www.nuget.org/api/v2/package/Exchange.WebServices.Managed.Api', $tmp)  
            $zip = [System.IO.Compression.ZipFile]::OpenRead($tmp)
            $zip.Entries | ?{$_.Fullname -eq 'lib/net35/Microsoft.Exchange.WebServices.dll'} | %{  
                [System.IO.Compression.ZipFileExtensions]::ExtractToFile($_,$localpath)
            }
            Unblock-File -Path $localpath
            write-host "OK" -F Green  
        }
        Add-Type -Path $localpath
    }catch{
        write-error "Error downloading required EWS Library / Error: $($_.Exception.Message)"  
    }finally{
        if ($zip){$zip.Dispose()}
        if($tmp -ne ''){del $tmp -Force -EA SilentlyContinue}  
    }
}
# Funktion zum definieren eines bestimmten Ordners
function Get-EWSFolder{
    param(
        [parameter(mandatory=$true)][Microsoft.Exchange.WebServices.Data.WellKnownFolderName]$storeroot,
        [parameter(mandatory=$false)][string]$mailbox,
        [parameter(mandatory=$false)][string]$path = "",  
        [parameter(mandatory=$true)][ValidateNotNullOrEmpty()][Microsoft.Exchange.WebServices.Data.ExchangeService]$service
    )
    # rekusiver Skriptblock zum Suchen eines Ordnerpfades
    $findfolder = {
        param(
            [string]$mailbox,
            $id,
            [string]$subpath
        )
        # bind folder to specific mailbox only when parameter is not empty and not public folder root
        if($mailbox -ne "" -and $id -ne [Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::PublicFoldersRoot){  
            $id = New-Object Microsoft.Exchange.WebServices.Data.FolderId $id,$mailbox
        }

        if ($subpath -ne ""){  
            $parts = $subpath.Split("\")  
            $view = New-Object Microsoft.Exchange.WebServices.Data.FolderView(1)
            $view.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Shallow
            $view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
 
            $f = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName,$parts)
            $result = $service.FindFolders($id,$f,$view)
            
            if ($result.TotalCount -gt 0){
                if ($parts.Count -gt 1 ){
                    & $findfolder -id $result.Folders.Id -subpath $subpath.Split("\",2)[-1]  
                }else{
                    return $result.Folders
                }        
            }else{
                throw "Search returned no results for path subpart '$($parts)'."  
            }
        }else{
            return ([Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$id))
        }

    }
    return (& $findfolder -mailbox $mailbox -id $storeroot -subpath $path)
}

function Get-EWSFolderItems {
    param(
        [parameter(mandatory=$true,ValueFromPipelineByPropertyName=$true)]$id,
        [parameter(mandatory=$false)][int]$maxitems = 10000,
        [parameter(mandatory=$false)][Microsoft.Exchange.WebServices.Data.PropertySet]$propset = $null,
        [parameter(mandatory=$false)][Hashtable]$filter = $null,
        [parameter(mandatory=$false)][ValidateSet('And','Or')][Microsoft.Exchange.WebServices.Data.LogicalOperator]$filterLogicalOperator = 'And',  
        [parameter(mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][ValidateNotNullOrEmpty()][Microsoft.Exchange.WebServices.Data.ExchangeService]$service,
        [parameter(mandatory=$false)][Microsoft.Exchange.WebServices.Data.ItemTraversal]$traversal = [Microsoft.Exchange.WebServices.Data.ItemTraversal]::Shallow

    )
    $result = $null
    $moreItems = $true
    $resultSet = @()

    $view = New-Object Microsoft.Exchange.WebServices.Data.ItemView($maxitems)
    $view.Traversal = $traversal
    if ($propset -ne $null){
        $view.PropertySet = $propset
    }else{
        $view.PropertySet = New-Object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
    }
    if ($filter -ne $null){
        $filterCollection = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+SearchFilterCollection
        $filterCollection.LogicalOperator = $filterLogicalOperator
        $filter.GetEnumerator() | %{
            $itm = $_
            if ($itm.Value -is [hashtable]){
                switch($itm.Value.Operator){
                    ">" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThan($itm.Key,$itm.Value.Value)))}  
                    "<" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThan($itm.Key,$itm.Value.Value)))}  
                    "<=" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsLessThanOrEqualTo($itm.Key,$itm.Value.Value)))}  
                    ">=" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsGreaterThanOrEqualTo($itm.Key,$itm.Value.Value)))}  
                    "!=" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsNotEqualTo($itm.Key,$itm.Value.Value)))}  
                    "=" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo($itm.Key,$itm.Value.Value)))}  
                    "contains" {$filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+ContainsSubstring($itm.Key,$itm.Value.Value)))}  
                }
            }else{
                $filterCollection.Add((New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo($_.Key,$_.Value)))
            }
        }
        while($moreItems){
            $result = $service.FindItems($id,$filterCollection,$view)
            if ($result.TotalCount -gt 0){
                $resultSet += $result.Items
            }
            $view.Offset = $result.NextPageOffset
            $moreItems = $result.MoreAvailable
        }
    }else{
        while($moreItems){
            $result = $service.FindItems($id,$view)
            if ($result.TotalCount -gt 0){
                $resultSet += $result.Items
            }
            $view.Offset = $result.NextPageOffset
            $moreItems = $result.MoreAvailable
        }
    }
    
    if ($resultSet.Count -gt 0){
        return $resultSet
    }
}

# Mit Service verbinden
$svc = ConnectTo-EWS -Server "ex.domain.tld" -UseScriptCredentials $false -Credential (New-Object PSCredential('MYUSER',(ConvertTo-SecureString 'GEHEIM' -AsPlainText -Force)))  

# alle Regeln (inkl. OOF-Regeln) der Inbox einer bestimmten Mailbox abfragen
$result = Get-EWSFolder -mailbox 'user@domain.tld' -storeroot Inbox -service $svc | Get-EWSFolderItems -filter @{[Microsoft.Exchange.WebServices.Data.ItemSchema]::ItemClass = "IPM.Rule.Message"} -traversal Associated  
$result

Grüße Uwe
chris123
chris123 20.01.2022 um 12:33:57 Uhr
Goto Top
Vielen Dank, das hat mir geholfen. Ich werde MFCMAPI nutzen. Visual Studio habe ich leider nicht.
colinardo
colinardo 20.01.2022 aktualisiert um 12:39:05 Uhr
Goto Top
Zitat von @chris123:

Vielen Dank, das hat mir geholfen. Ich werde MFCMAPI nutzen. Visual Studio habe ich leider nicht.
Wie kommst du auf Visual Studio? Das oben ist reiner Powershell-Code und lädt nur die EWS DLL, VS überflüssig face-smile.