internal/Test-ElevationRequirement.ps1
#ValidationTags#Messaging,FlowControl,Pipeline,CodeStyle# function Test-ElevationRequirement { <# .SYNOPSIS Command that tests, whether the process runs elevated and has to run as such. .DESCRIPTION Command that tests, whether the process runs elevated and has to run as such. Some commands require to be run elevated, when executed against localhost, but not when run against a remote computer. This command handles that test and manages the reaction to it. .PARAMETER ComputerName The computer that is being targeted by the calling command. This most be a localhost variety, for it to be able to fail. .PARAMETER Continue When using the native capability to terminate on fail, this will call continue in non-silent mode. .PARAMETER ContinueLabel When using the native capability to terminate on fail, and using a continue mode, the continue will continue with this label. .PARAMETER SilentlyContinue When using the native capability to terminate on fail, this will call continue in silent mode. .PARAMETER NoStop Does not call stop-function when the test fails, rather only returns $false instead .PARAMETER Silent Replaces user friendly yellow warnings with bloody red exceptions of doom! Use this if you want the function to throw terminating errors you want to catch. .EXAMPLE $null = Test-ElevationRequirement -ComputerName $instance -Continue This will test whether the currently processed instance is localhost and the process is running elevated. If it should have elevation but is not running with elevation: - In silent mode it will termiante with an exception - In default mode, it will continue with the next instance .EXAMPLE if (-not ( Test-ElevationRequirement -ComputerName $instance -NoStop)) { # Do whatever } This will test whether the currently processed instance is localhost and the process is running elevated. If it isn't running elevated but should be, the overall condition will be met and the if-block is executed. #> [CmdletBinding(DefaultParameterSetName = 'Stop')] Param ( [DbaInstanceParameter] $ComputerName, [Parameter(ParameterSetName = 'Stop')] [switch] $Continue, [Parameter(ParameterSetName = 'Stop')] [string] $ContinueLabel, [Parameter(ParameterSetName = 'Stop')] [switch] $SilentlyContinue, [Parameter(ParameterSetName = 'NoStop')] [switch] $NoStop, [bool] $Silent = $Silent ) $isElevated = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $testResult = $true if ($ComputerName.IsLocalHost -and (-not $isElevated)) { $testResult = $false } switch ($PSCmdlet.ParameterSetName) { "NoStop" { return $testResult } "Stop" { if ($testResult) { return $testResult } $splatStopFunction = @{ Message = "Console not elevated, but elevation is required to perform all actions within this command" } if (Test-Bound "Continue") { $splatStopFunction["Continue"] = $Continue } if (Test-Bound "ContinueLabel") { $splatStopFunction["ContinueLabel"] = $ContinueLabel } if (Test-Bound "SilentlyContinue") { $splatStopFunction["SilentlyContinue"] = $SilentlyContinue } . Stop-Function @splatStopFunction -FunctionName (Get-PSCallStack)[1].Command return $testResult } } } |