src/Admin.ps1
<# .DESCRIPTION Test if the current user has admin privileges. #> function Test-Admin() { if ($IsWindows) { $principal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } return 0 -eq (id -u) } <# .DESCRIPTION Invoke the current script or specified function with elevated privileges. .PARAMETER Function The function name to invoke. .PARAMETER NoExit The new powershell window will not exit when the process completes. .PARAMETER Arguments Additional arguments passed to the script or function. #> function Invoke-Privileged() { [CmdletBinding()] param ( [string]$Function, [switch]$NoExit, [Parameter(ValueFromRemainingArguments)] [string]$Arguments ) if ((Test-Admin) -or -not $IsWindows) { return } $isVerbose = $PSBoundParameters['Verbose'] -eq $true $isDebug = $PSBoundParameters['Debug'] -eq $true $PSBoundParameters.Remove('Function') 1> $null $PSBoundParameters.Remove('NoExit') 1> $null $PSBoundParameters.Remove('Verbose') 1> $null $PSBoundParameters.Remove('Arguments') 1> $null $PSBoundParameters.Remove('Debug') 1> $null $boundArgs = ($PSBoundParameters.GetEnumerator() | ForEach-Object { "-$($_.Key) $($_.Value)" }), ($isVerbose ? '-Verbose' : ''), ($isDebug ? '-Debug' : '') -join ' ' if ($Function) { Start-Process -FilePath 'pwsh' -Verb 'RunAs' -ArgumentList ($NoExit ? '-NoExit': ''), '-Command', ". $($MyInvocation.PSCommandPath); $Function $boundArgs $Arguments" } else { Start-Process -FilePath 'pwsh' -Verb 'RunAs' -ArgumentList ($NoExit ? '-NoExit': ''), $MyInvocation.PSCommandPath, $boundArgs, $Arguments } } |