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 に置いておきます。
さくっと書きましょう。
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までは私もありました