🥏

Windows UAC と VirtualStore

に公開

はじめに

Windows UAC と、混乱をもたらした互換性機能 VirtualStore について記載します。

テスト環境

ここに記載した情報は、Windows 11 24H2 で動作確認しています。

Windows UAC

概要

https://atmarkit.itmedia.co.jp/ait/articles/1503/19/news131.html

UAC(User Account Control)は、Windows Vista 以降に導入されたセキュリティ機能です。
管理者(Administrators)権限を持つユーザであっても、通常は一般ユーザーと同等の権限で動作し、ソフトウェアが管理者権限を必要とする処理を実行する場合は、昇格ダイアログでの認証ステップを行うメカニズム(管理者承認モード)です。

このような一見面倒な機能が導入された背景は以下の通りです。

  • Windows には、一般ユーザ(Users)と管理者(Administatrs)という分類がありますが、一般ユーザでは Windows の設定変更やソフトウェアのインストールができないため、深く考えずに管理者権限を選択するケースが多かった
  • 管理者権限で PC を使用していると、ウイルスなどに感染した際にシステムが書き換えられたり、スパムメールや DoS 攻撃の踏み台にされたりするなど、被害が拡大するリスクが高まる

このため、管理者についても、既定状態では「管理者権限の利用を一時的に制限(保留)」という状態で動作して、必要に応じて、昇格ダイアログでの認証ステップを踏んで、「本来の管理者権限(機能制限解除)」となるメカニズム(管理者承認モード)を導入することで、セキュリティ保護を実現しています。

昇格ダイアログ

管理者権限で動作させるアプリの場合、manifest で管理者権限昇格を設定します。

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

この設定をしたアプリは起動時に昇格ダイアログが表示されます。

証明書を付与しないと、UAC昇格ダイアログの表示内容が「この不明な発行元からのアプリがデバイスに変更を加えることを許可しますか?」と、疑念を与える表示となってしまいます。

VirtualStore

背景

Windows Vista では、UAC 導入を含めて、アプリケーションモデルの大幅な変革が行われました。

  • マルチユーザ環境への移行
    • Windows XP までは、アプリの設定情報を C:\Windows などに INI ファイルとして配置し、すべてのユーザで共有するモデルが主流でした
    • Windows Vista 以降は、個人情報のセキュリティ確保の観点から、設定情報をユーザごとに管理するモデルが提唱されました

UAC に従うと、C:\Windows 下のファイル更新には管理者権限の昇格が必要となり、既存アプリが動作できなくなるケースが発生します。
このため、Windows XP から Vista への移行を円滑にするための互換性機能として VirtualStore が導入されました。

概要

Windows XP 時代のアプリケーションを救済するため、更新に管理者権限が必要なフォルダ、レジストリを、管理者権限を持たないアプリが更新しようとした場合、VirtualStore(ファイルとレジストリの仮想化)が動作してリダイレクトされます。

  • VirtualStore 弊害
    • VirtualStore が有効だと動作するが、VirtualStore が無効の環境だと本来の UAC に基づいてエラーとなるケースが発生する
    • VirtualStore パスが非常にわかりにくい
    • 本来システム共通のリソースとして動作していたリソースを、VirtualStore では各個人環境にリダイレクトしているので、システム共通のリソースではなくなってしまう

VirtualStore 対象

対象フォルダ

出力パス VirtualStore パス
C:\Program Files %LOCALAPPDATA%\VirtualStore\Program Files
C:\ProgramData %LOCALAPPDATA%\VirtualStore\ProgramData
C:\Windows %LOCALAPPDATA%\VirtualStore\Windows

対象レジストリ

出力パス VirtualStore パス
HKEY_LOCAL_MACHINE\Software HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\

無効化

下記設定を行うことで、システムとして VirtualStore を無効化できます。

レジストリ
キー   :[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
DWORD値:[EnableVirtualization]=(1:有効、0:無効)

発動条件

VirtualStore が有効となる条件を記載します。

  • 仮想化ベースのセキュリティ(VBS:Virtualization-Based Security)が有効
    • Windows 11 Home では、仮想ベースのセキュリティは無効となっているケースが多く、 Pro / Enterprise / Education では既定で有効となっているケースが多い
    • msinfo32 で確認可能
  • レジストリ EnableVirtualization = 1
  • 標準ユーザー権限で実行(管理者権限昇格ではない)
  • 32bitプロセスであること

VirtualStore が有効かは、タスクマネジャー(taskmgr)詳細で、列ヘッダ右クリックして「列の選択」で、「UAC の仮想化」列を表示させることで確認できます。

出典

本記事は、2025/09/01 Qiita 投稿記事の転載です。

Windows UAC と VirtualStore

Discussion