Uac/Uac.ps1

#region Copyright & License

# Copyright © 2012 - 2020 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
    © 2020 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
    © 2020 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
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU36b2yMLlOexfitSBEwQs8hC1
# cgegggVMMIIFSDCCAzCgAwIBAgIJAJkr3mJdTBkUMA0GCSqGSIb3DQEBCwUAMEEx
# 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
# DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUw6jHHEgQCg26s5i2f2cPES2z
# 08gwDQYJKoZIhvcNAQEBBQAEggIAd231uNK7nK3a5+KzlVhkTR8137RwMTUMGhr4
# 1PDDHjxZyhCRkCMt4eqCfj2zo8kE766XFgXcICuRQtmoriSj5eNbRgeBn9d9P8G8
# +Z/j+LDPbo6Pu69ECsg3wJDUqyh3vk3wzyEcCJAW49Zx9lrd12jDwe36KiJNyqjo
# LHjgKHJLJzTTNKT+Wjuvaj5wpIUQ/wINu3O7yPu7qizv7VLn150+bjXN5ufaIFjM
# h58VnCCnbQTbN/27mydTAjliKZgCi1exGV5cdBMcCf9iQODJkHlEfUq6WIcpEPCH
# kfWYZrwOr0ubDyLr66rD5auWokQ27ZP60XllrakOQt98pWR0YsD2dP94/C0u4q2b
# L0+MCwLkQhZzKCiOH3apss2IwvYrkaYG/8ha2y12o+ZI10utBcuw+h2qTqs1dGEv
# oBV5kuSxBr5FGntSS9qNkd+uJbDH0c6K+ul7rjHGLxzFu53ZbK2bbQaszLCBY+rM
# uzhpntIwkuVirNQO0TE2tOsualP5JENKwYYCbLUKFkSjA1nExfQ38fM3FfO4IBn7
# Dvam73cNrJHn2gW/jwiW4ZR3K3cCQNPVywUV9WZHJd98aqkr7z5kv6H1GzWnoZ4z
# WVDNFrPtLBnaXcH5IHGxc8kgI8/tpKUiH0XddSHB6hEVGnducUjB0rYK8n0Vjwkr
# XiyfMPE=
# SIG # End signature block