Uac/Uac.ps1

#region Copyright & License

# Copyright © 2012 - 2022 François Chabot
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#endregion

Set-StrictMode -Version Latest

<#
.SYNOPSIS
   Ensures the current process is running in elevated mode.
.DESCRIPTION
   This command will throw if the current process is not running in elevated mode and will silently complete
   otherwise.
.EXAMPLE
   PS> Assert-Elevated
.EXAMPLE
   PS> Assert-Elevated -Verbose
   With the -Verbose switch, this command will confirm this process is running
   in elevated mode.
.NOTES
   © 2022 be.stateless.
#>

function Assert-Elevated {
   [CmdletBinding()]
   [OutputType([void])]
   param()

   Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
   if (-not(Test-Elevated)) {
      throw 'A process running in elevated mode is required to run this function!'
   }
   Write-Verbose -Message 'Process is running in elevated mode.'
}

<#
.SYNOPSIS
   Returns whether the current process is running in elevated mode.
.DESCRIPTION
   This command will return $true if the current process is running in elevated mode, or $false otherwise.
.EXAMPLE
   PS> Test-Elevated
.NOTES
   © 2022 be.stateless.
#>

function Test-Elevated {
   [CmdletBinding()]
   [OutputType([bool])]
   param()

   Resolve-ActionPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
   # only if OS is later than XP (i.e. from Vista upward), i.e. if ([System.Environment]::OSVersion.Version.Major -gt 5)
   $wid = [System.Security.Principal.WindowsIdentity]::GetCurrent()
   [bool]( ([Security.Principal.WindowsPrincipal] $wid).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) )
}

# SIG # Begin signature block
# MIII0QYJKoZIhvcNAQcCoIIIwjCCCL4CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUMb/l7bRWcBrKTpdO0kw/kBSg
# 0L+gggVMMIIFSDCCAzCgAwIBAgIJAJkr3mJdTBkUMA0GCSqGSIb3DQEBCwUAMEEx
# PzA9BgNVBAMeNgBpAGMAcgBhAGYAdABzAG8AZgB0AHcAYQByAGUAQABzAHQAYQB0
# AGUAbABlAHMAcwAuAGIAZTAeFw0yMTA2MjUxNDEyMjNaFw00MTA2MjAxNDEyMjNa
# MEExPzA9BgNVBAMeNgBpAGMAcgBhAGYAdABzAG8AZgB0AHcAYQByAGUAQABzAHQA
# YQB0AGUAbABlAHMAcwAuAGIAZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAOeqdUHBv7sxSeX3aj6yPKj7PAvs8izpVXjyEBl5aR8mQneVcXuF53AH7EW1
# 6E5p4+Az5pJPGUD5c3tXhiGMF7vgLhQjO6hlaVBRIqiIYHikNLwMNy6YBMc/QQYM
# rPhqHEFsZ53dkBIIj3M8e3kFcTFA09n25yDtTPDab4nd9yUhc9Qc8+nfpIzfYsoP
# 1pZ3nCzhw6hN2/44v1dkQrG3dRYwt+px65p6NPNZWEJpt4VCJjIFh+lBYJdxm9d4
# X/rAnlHIkbv7liOavWDzgHVabS3hdAWtcDmynm+7+FcZDFqPWNCl3e4SS7xe4s/R
# CKFKA0IsfKkSk9YJlLgeSQIEXUOOWXJAGaLqnRD8xWLZsc4Oi9GZg7XV1mv/S88c
# oztXnwtAN3OOlRKBh2QbomMgxeMO0GvsLE/cq5Q/YKAoz+KGr/7LcZq9jzQ8IPus
# ZvWLeDXmxPiwJjpZc1koLgfGIEX2NStQTT3QmacWr9thrWcKvI+4uBmI4exS9B4a
# R3nV91w5EY+2RoYsHqej9LWwNamO96+jMX9pxprTX+EkLUuMAikw/po8sBC9MUUn
# 5pMWmUv7DCtQOLGGBDDMMMkn4ZcjpCEEdPGHRKfqNnD27ssGtDjiNzfQrsm67toU
# bBwUF+gyJq/YckWquYJhA9ZOFWEADuIwGnsOzsoRvuQyY+p9AgMBAAGjQzBBMA4G
# A1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDAzAXBgNVHREEEDAO
# ggxzdGF0ZWxlc3MuYmUwDQYJKoZIhvcNAQELBQADggIBACithYM3qckZRc9+Xbfu
# a6gWr3HwjrW+FHKgjfrcOm8ZnLVapb9xFqsqrRQqd3RXWQDINEGrtI2rSfrzyfoK
# UiTgldIfQNP1ZcGY229d++90t3hdo2mlt05hjYlbMENloJHpsEP0vQZmwOcEimCT
# ex1pymYM+P9pj3j8UD1PT1eIZot6or8fBRl63UybyDSrM7L4UOkkAOniKxWy5pW6
# 6duS8SR+SZpr3Bv44NyXPj0Nv+MIpLmsLrd7XPBFmnGxzY01ZO9vzi9KEhM2wT5i
# jPqHDNOvfPiADtAa+EyUBzdJiqy9heCz/TMZQgMWGwtfqJNxWZmsHcha2anW4Qt+
# mzrLO4GojWoVog9uVSAq+l0a+YQsd1u1kUmm4vgZCFyUA+lEp4LkI7ca2VBHkLPD
# w+u2DoDMRiqFPZjO7BCKjGc0jj9B/qGR3JVt+tqDdB621xXf2YGF2oFvxZQ/keGt
# 0ujfJ+JwN3nCulDAA4773q6KUnfykyrvAgITNbRJL6TngeRKtw9VIJBPxzqMzLpV
# 5ggXNituwLaD1CCBJ1oo9DZHpL9gplXp1wGrelJOTiJhh+pdNsPtRH7CrranWa5h
# LFLuigqin0eewQ5giJ1VaiBVEseOmiZog+27UpFIv40aDzgGL3YxB/Mu0ojwrQtp
# WLmqJCmWnR5qxOm0yK+zNWe0MYIC7zCCAusCAQEwTjBBMT8wPQYDVQQDHjYAaQBj
# AHIAYQBmAHQAcwBvAGYAdAB3AGEAcgBlAEAAcwB0AGEAdABlAGwAZQBzAHMALgBi
# AGUCCQCZK95iXUwZFDAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAA
# oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4w
# DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUgIRUZSsO9tGSk3gKrjRyu6gT
# OCswDQYJKoZIhvcNAQEBBQAEggIAv9K6pYtzkYbrTvwAwBiR55hmgf1KoVC4wBqg
# ZF8079ndEZmCHZ1k5abk5O/ABGZr0P5IL6aKWV+4NE2+zn3n1j94ZLQtD3cNXoLJ
# 3DcESIaAOUjDR6+hrSdFxTmg2V7W2DR59MfZY4OWzOum0cB2pZY5UXeAiGOBtJBa
# WwM1O0cyLdtc/Uk1y+6fUagszfmApMoF+XxK3HXI0/XZLnaUlSE5w4cPEDH1Sr7w
# d6vuCUAoAjK2pGUiDW5vCkyLPFNZGHfXoUaYCSV4hNmjwlHv+MZJdM1UbDic8ttW
# DLOUBJBIOTuq+mYIusWyYn0doKkFlSj80va9y01nz4lcmXg7jbiaVBWP0NbthZv8
# X78mV+fHcQrxEwes+5VuvQfuYhCIbBvEK1/LAuK14z0/dCXU0mPEXANFSmo3eLwQ
# TqBjsvPF9Bz5VBXRBVuliCH23Fcc205VvDq52pVEvcYZfq8un7NG8dZOexv0vGco
# hK+nrjv2FUs9BR9MMdZdNK+m+DlkC/dIhn3E6M3p7Y3qyJWExURLkIQHbktMMmAE
# NM119p1ObPohlXQa44Qtzg08f6nc/LjkfwayLmCvlRe253g1b17kav8+HpIkPZpa
# 8/av1DhmKlnTk75qmQdZJIfIlzLqVLx/suFlFUuEztJLiVwz/dnZKPrhSDxxX6hD
# TlN8J44=
# SIG # End signature block