tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

PowerShell で UAC の状態を取得する

UAC を利用しないのは、現在の Windows 利用においては余り考えられないでしょう。

とはいえ、検証などさまざま状況において、UACを無効にする場合ももちろんあるかと思います。*1

そこで、今回は PowerShell で UACの有効、無効状態を取得してみようと思います。

UAC の取得

レジストリで可能です。

つまり、 (Get|Set|Remove)-ItemProperty 系のCndlet が大活躍です。

レジストリ情報は以下です。

Path : HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
Name : EnableLUA
Value : 1 = 有効, 0 = 無効, 他 = 不明

リモートホストへの実行

基本私のコードは valentia での動作を前提にしているため、リモート動作を考える必要はありません。

valentiaでは、.NETによるリモートレジストリや、Invoke-Command などへのComputer Name での接続も透過的に為されます。

よって、ローカルでPowerShell として 動作する = リモートでも同様に動作します。

コード

GitHub に置いておきます。

PowerShellUtil / Get-UAC

さくっと書きましょう。

function Get-UAC
{
<#
.Synopsis
   Check UAC configuration from Registry
.DESCRIPTION
   This cmdlet will return UAC is 'Enabled' or 'Disabled' or 'Unknown'
.EXAMPLE
   Get-UAC
.EXAMPLE
   Get-UAC -Verbose
#>

    [CmdletBinding()]
    Param
    (
    )

    begin
    {
        $path = "registry::HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System"
        $name = "EnableLUA"
    }

    process
    {
        $uac = Get-ItemProperty $path
        if ($uac.$name -eq 1)
        { 
            Write-Verbose ("Registry path '{0}', name '{1}', value '{2}'" -f (Get-Item $path).name, $name, $uac.$name)
            "Enabled" 
        } 
        elseif ($uac.$name -eq 0) 
        { 
            Write-Verbose ("Registry path '{0}', name '{1}', value '{2}'" -f (Get-Item $path).name, $name, $uac.$name)
            "Disabled" 
        }
        else 
        {
            Write-Verbose ("Registry path '{0}', name '{1}', value '{2}'" -f (Get-Item $path).name, $name, $uac.$name)
            "Unknown"
        }
    }
}

実行結果

UACが有効 = 1 なら、Enabled と表示されます。

Enabled

UACを無効にするぜひはともかく、PowerShell でのレジストリ操作はこれまでに比べてとても便利だと思います。

*1:Windows 7までは私もありました