VBAでUAC設定を確認する ― EnableLUAだけで『通知レベル』を決めない

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのUACポリシー一覧とレジストリ対応表を確認し、旧記事の「2つの値だけでUACレベルを特定できる」という単純化を修正しました。

検証ステータス:✅ Microsoft公式仕様確認済み/VBAコードの実機実行は未検証

WindowsのUAC状態をVBAから確認する場合、レジストリを読み取り専用で参照することはできます。ただし、EnableLUAConsentPromptBehaviorAdmin の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レベルを完全特定できるという表現、不要な画面更新停止処理を削除。

文書情報

記事タイトル
VBAでUAC設定を確認する ― EnableLUAだけで『通知レベル』を決めない
作成日
更新日
Source URL
https://papanda925.com/?p=6270

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました