Search code examples
powershellexchange-serverpowershell-2.0powershell-remotingexchange-server-2010

catching Get-ManagementRole exception on non-existent role


try {
    $ErrorActionPreference = "...";  #<- tried all settings 
#   $myRole = Get-ManagementRole $CustomRole;  #<- terminates if role doesnt exist 
    New-ManagementRole $CustomRole -UnScopedTopLevel; #<- same if existent
} catch {
    ...   #<- never happens
}

I need to create a new custom unscoped role if it is not already existent. My problem is that New-ManagementRole just terminates my script if the role is already existing and that Get-ManagementRole cant be used to check for that role because it terminates my script if that role doesnt exist ^^

Both Cmdlets cant be catched with 'catch' (!!??)

er,… any suggestions please…?


Solution

  • So, if your tools doesnt work like you need it to work, build a new tool ;-) …here is some kind of solution:

    if (Test-ManagementRole "MyCustomRole" -Single) {...}

    function global:Test-ManagementRole
    {
    <#
    .SYNOPSIS
    Mit Test-ManagementRole wird überprüft, ob eine Management-Rolle existiert und
    optional, ob sie einem bestimmten Typ entspricht.
    .DESCRIPTION
    Test-ManagementRole (by .rhavin;) überprüft die im System vorhandenen Management-
    Rollen und liefert die Zurück, die den angegeben Kriterien entsprechen.
    .PARAMETER Roles
    Objekt-Array der Management-Rollen. Kann als Pipe übergeben werden. Wird dieser
    Parameter weggelassen, werden alle im System definierten Rollen überprüft.
    .PARAMETER Name
    Der Name der Management-Rolle. Es können Wildcards (z.B. '*mail*') verwendet werden.
    .PARAMETER Type
    Der Typ der Management-Rolle. Es können Wildcards (z.B. '*recover*') verwendet werden.
    .PARAMETER Display
    Wird dieser Switch angegeben, wird ein ausführlicher Text angezeigt,
    ansonsten liefert das Commandlet nur Wahr/Falsch zur weitern Verarbeitung
    zurück.
    .PARAMETER HideFalse
    Wird dieser Switch angegeben, werden nur User, welche zur angegebenen
    Rolle gehören, an die Pipeline weitergegeben bzw. angezeigt.
    .PARAMETER Single
    Wird dieser Switch angegeben, wird der Vorgang bei der ersten Übereinstimmung abgebrochen.
    .EXAMPLE
    Test-ManagementRole -Name *mail* -Type *im* -Display
    Zeigt alle Management-Rollen an, welche 'mail' als Namensbestandteil haben und
    in deren Typ 'im' vorkommt.
    .EXAMPLE
    Test-ManagementRole *Organization* -Single
    Überprüft, ob eine Rolle mit dem Namensbestandteil "organization" existiert.
    #>
    
    param(
    $Name = '*',
    $Type = '*',
    [switch]$Display,
    [switch]$HideFalse,
    [switch]$Single,
    [Parameter(ValueFromPipeline=$true)]$Roles
    )
    
    begin {
        if ($PSCmdlet.MyInvocation.PipelinePosition -eq 1)
        {
            $cmd = "Get-ManagementRole | Test-ManagementRole";
            if ($Name) {$cmd += (' -Name "' + $Name + '"');}
            if ($Type) {$cmd += (' -Type "' + $Type + '"');}
            if ($Display) {$cmd += ' -Display';}
            if ($HideFalse) {$cmd += ' -HideFalse';}
            if ($Single) {$cmd += ' -Single';}
            Invoke-Expression $cmd;
            break;
        }
        $colOldTx = $host.UI.RawUI.ForegroundColor;
        $found = $false;
        if ($Display) {Echo "";}
    }
    
    process {
        if ($Single -and $found) {return $null;}
        function DoTest
        {
            if ($_.Name -like $Name)
            {
                if ($_.RoleType -like $Type) {return 2;}
                return 1;
            }
            return 0;
        }
        $mytest = DoTest;   
        if ($mytest -eq 2)
        {
            $found = $true;
            if ($Display)
            {
                $host.UI.RawUI.ForegroundColor = 'Green';
                Write-Host $_.Name 'ist vom Typ' $_.RoleType;
                return;
            }
            return $true
        }
        if ($HideFalse -or ($mytest -eq 0)) {return $null}
        if ($Display)
        {
            $host.UI.RawUI.ForegroundColor = 'Red';
            Write-Host $_.Name 'ist vom Typ' $_.RoleType;
            return;
        }
        return $false
    }
    
    end {
        if ($Display)
        {
            if (!($found))
            {
                $host.UI.RawUI.ForegroundColor = 'Red';
                Write-Host "Es wurde keine ManagementRolle mit Namen `"$Name`" vom Typ `"$Type`" gefunden.";
            }
            echo "";
        }
        $host.UI.RawUI.ForegroundColor = $colOldTx;
    }
    
    }