tech.guitarrapc.cóm

Technical updates

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までは私もありました