この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのUACポリシー一覧とレジストリ対応表を確認し、旧記事の「2つの値だけでUACレベルを特定できる」という単純化を修正しました。検証ステータス:✅ Microsoft公式仕様確認済み/VBAコードの実機実行は未検証
WindowsのUAC状態をVBAから確認する場合、レジストリを読み取り専用で参照することはできます。ただし、EnableLUA と ConsentPromptBehaviorAdmin の2値だけを見てWindowsの画面上の「通知レベル」を完全に再現できるとは限りません。UACの動作には複数のポリシーが関係します。
まず見るべき値
Microsoft Learnでは、UAC関連ポリシーのレジストリ値は HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System に整理されています。
EnableLUA:管理者承認モードを含むUAC全体の有効・無効に関わる。ConsentPromptBehaviorAdmin:管理者に対する昇格プロンプトの動作。PromptOnSecureDesktop:昇格要求をセキュアデスクトップに表示するか。ConsentPromptBehaviorUser:標準ユーザーの昇格要求の動作。
そのため、診断ツールでは「UACレベル」という1語へ丸めるより、値を個別に表示した方が誤解が少なくなります。
VBAでは読み取りに徹する
業務用Excelから確認するだけなら、UAC設定を書き換える必要はありません。Win32 Registry APIを使う場合も KEY_READ で開き、取得したDWORD値とAPI戻り値を分けて扱います。
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" ( _
ByVal hKey As LongPtr, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, ByRef phkResult As LongPtr) As Long
Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _
ByVal hKey As LongPtr, ByVal lpValueName As String, ByVal lpReserved As Long, _
ByRef lpType As Long, ByRef lpData As Any, ByRef lpcbData As Long) As Long
Private Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As LongPtr) As Long
#End If
API宣言だけで32bit/64bit差やすべてのOffice世代を吸収できるわけではありません。配布対象のOffice/VBAバージョンでコンパイル確認を行います。
取得失敗と値0を混同しない
DWORD取得に失敗したときに単純に0を返すと、「取得できなかった」のか「本当に0だった」のか区別できなくなります。APIの戻り値を別に確認し、失敗時はエラー状態として扱う設計が安全です。
設定の判定例
EnableLUA=0 ならUAC関連ポリシーが無効化された状態です。EnableLUA=1 の場合、ConsentPromptBehaviorAdmin は0〜5の値で管理者の昇格プロンプト動作を表します。たとえば5は「Windows以外のバイナリに対して同意を求める」既定値です。
ただし、実際の表示や動作は PromptOnSecureDesktop など他の設定にも依存します。診断結果は「UAC有効/無効」と「各ポリシー値」を分けて出すのがおすすめです。
仕事で使うなら
- 設定変更ではなく読み取り専用にする。
- レジストリ取得失敗を正常値に置き換えない。
- ポリシー値を個別に記録し、単純な4段階表示へ無理に変換しない。
- 端末管理ポリシーやIntune/GPOで設定されている可能性も確認する。
公式情報
この記事の更新履歴
- 2026-09-14 追加:PromptOnSecureDesktop等を含む複数ポリシーを分けて確認する考え方を追加。
- 2026-09-14 変更:UAC判定を単一の「レベル」ではなく個別値の診断として再構成。
- 2026-09-14 削除:内部執筆指示、重複H1、2値だけでUACレベルを完全特定できるという表現、不要な画面更新停止処理を削除。
