Pages

自己紹介

某IT技術情報誌に連載記事を持っていたテクニカルライター。またもや休刊してしまったよ。
Copyright © 2011-2016 Daregada. All rights reserved. Powered by Blogger.

Windows Vista/7のファイル仮想化によりデータファイルが多重化される問題

2011-02-13

Windows Vista/7では、互換性ファイルやVirtualStoreといったファイル仮想化(File Virtualization)の仕組みを知らないと、パワーユーザーほど思わぬところでハマるよ、という話。

Abstract

%ProgramFiles%以下に存在するアプリの設定ファイルを、使い慣れたテキストエディター(秀丸など)で書き換えられる程度にPCに詳しいパワーユーザーは、Windows Vista/7のファイル仮想化について理解しておこう。さもないと、たとえば、
  • テキストエディターで書き換えた設定がアプリに反映されない
  • メモ帳で開くと、書き換える前の設定内容が表示される
  • 再びテキストエディターで設定ファイルを開くと、書き換えた設定内容が表示される
といった状況に直面して、数時間(場合によっては何日も)無駄にすることになる。
理由
設定ファイルを書き換えたテキストエディターがファイル仮想化の対象で、設定ファイルを利用するアプリ(およびメモ帳)がファイル仮想化の対象外であるため
対策
以下のいずれかを行なう
解説
ファイル仮想化が導入された理由と、ファイル仮想化の対象となる条件
まとめ
パワーユーザーなんだから泥を被るか

理由

このような問題が起きるのは、設定ファイルを書き換えたテキストエディターが「ファイル仮想化」(File Virtualization)の対象であり、設定ファイルを利用するアプリ(とメモ帳)がファイル仮想化の対象外である場合だ。

あなたが使っているテキストエディターが、ファイル仮想化の対象であると仮定しよう(条件の詳細は解説を参照)。 ユーザーアカウント制御(UAC)が有効な環境では、(あなたが管理者権限を持っていたとしても)通常の方法で起動したテキストエディターは一般ユーザー権限で動作する。 常識的に考えれば、システムフォルダー("C:\Program Files"など)のような書き込みに管理者権限が必要な場所に置かれたファイルは、一般ユーザー権限で動作するテキストエディターでは書き換えられないはずだ。 しかし、テキストエディターがファイル仮想化の対象であれば、透過的に別の場所にファイルが保存される。つまり、テキストエディターからは、書き換えた設定ファイルが問題なくシステムフォルダーに保存されたように見える。

一方、設定ファイルを参照するアプリがファイル仮想化の対象外であると仮定しよう。このアプリでは、システムフォルダーに置かれた(テキストエディターで書き換えられていない)設定ファイルをそのまま読み込む。つまり、「テキストエディターで書き換えた設定がアプリに反映されない」ということになる。

この状態で、システムフォルダーにある設定ファイルをメモ帳で開くとどうなるか。実は、メモ帳は(とある理由により)ファイル仮想化の対象外なのだ。よって、システムフォルダーに置かれた設定ファイルをそのまま読み込める。つまり、「メモ帳で開くと、書き換える前の設定内容が表示される」わけだ。

混乱してきたユーザーが再度テキストエディターでシステムフォルダーの設定ファイルを開くと、ファイル仮想化により別の場所に保存された「互換性ファイル」(Compatibility files)が代わりに読み込まれる。つまり、「再びテキストエディターで設定ファイルを開くと、書き換えた設定内容が表示される」ということになる。サニティをかけてあげたくなるね。

対策

対策としては、「管理者権限に昇格したテキストエディターを使う」か「ファイル仮想化の対象外となるフォルダーにアプリをインストールしなおす」のいずれかだ。すでにアプリをインストール済みなら前者、これからインストールする(あるいは設定ファイルなどをバックアップして再インストールできる)なら後者を選択しよう。

このほか、「UACそのものを無効にする」とか、「UACを有効にしたまま、ファイル仮想化(およびレジストリ仮想化)だけを無効にする」という方法もあるが、他のアプリに与える影響が大きいだけでなく、セキュリティリスクも高くなるのでお勧めしない。

なお、すでに互換性ファイルを作ってしまったのであれば、以下の作業をする前に互換性ファイルを削除しておこう。ファイルを保存したつもりのシステムフォルダーをエクスプローラーで開いて、上部の"互換性ファイル"ボタンを押してフォルダーを切り替える。互換性ファイルはそのまま消してもよいし、すでに多くの設定を行なったあとなら、カット&ペーストでシステムフォルダーにある(本来の)設定ファイルに上書きしてもいい。すべての互換性ファイルを削除すると、"互換性ファイルボタンは消える。

  • 管理者権限に昇格したテキストエディターで設定ファイルを書き換える方法
    1. スタートボタンでテキストエディターを検索
    2. 右クリックして、"管理者として実行"を選択
    3. システムフォルダーに置かれた設定ファイルを読み込む。一般ユーザー権限で動作しているエクスプローラーからのドラッグ&ドロップは受け付けないので注意しよう
    4. 変更した設定ファイルを上書き保存する。管理者権限に昇格したプロセスはファイル仮想化の対象外なので、問題なく保存できる。
  • アプリをファイル仮想化の対象外なフォルダーにインストールしなおす方法
    1. すでにインストールした後なら、設定ファイルなどを他のフォルダーに待避した上で、いったんアプリをアンインストールする。
    2. アプリをファイル仮想化の対象である下記以外の適当なフォルダーにインストールする
      • %ProgramFiles%...一般的には"C:\Program Files"
      • %ProgramData%...一般的には"C:\ProgramData"
      • %SystemRoot%...一般的には"C:\Windows"
      これら以外ならどこでもいいのだが、"C:\"直下にフォルダーを作ると雑然とするので、"C:\Users\ユーザー名"以下に作成するのがお勧め。
    3. 待避していた設定ファイルなどをインストール先フォルダーにコピーする
    4. テキストエディターでインストール先に置かれた設定ファイルを読み込む
    5. 変更した設定ファイルを上書き保存する。インストール先フォルダーはファイル仮想化の対象外なので、問題なく保存できる

解説

Windows Vista/7で導入された「ファイル仮想化」(File Virtualization)は、システムフォルダーにデータファイルを保存する旧いデザインのアプリ(レガシーアプリ)を、「ユーザーアカウント制御」(UAC)環境で問題なく動作させるために暫定的に導入された、ファイルの自動リダイレクト機能だ。

UACが有効な環境では、管理者権限を持つユーザーであっても、通常は一般ユーザー権限でアプリを実行する。システムフォルダー("C:\Program Files"など)以下のファイルは、一般ユーザー権限では書きこめないため、そのままではレガシーアプリが正常に動作しなくなる。そこで、ファイル仮想化によって、レガシーアプリがシステムフォルダー以下に書き込もうとしたデータファイル(実行ファイルやDLLは対象外)を、ユーザーごとに用意された別のフォルダーに切り替えて「互換性ファイル」(Compatibility files)として保存する。以後、レガシーアプリによるデータファイルへのアクセスは、ファイル仮想化により透過的に互換性ファイルに切り替えられる。

リダイレクト先のフォルダーなどの詳細は、Googleなどで「ファイル仮想化」「互換性ファイル」「VirtualStore」あたりをキーワードとして検索すればいくらでも出てくるので、ここでは述べない。

さて、実行中のアプリ(プロセス)がファイル仮想化の対象となるには、以下の条件をすべて満たしている必要がある。

  • 条件1...プロセスが管理者権限に昇格していないこと
  • 条件2...32ビットのインタラクティブな(GUIを持つ)プロセスであること
  • 条件3...実行ファイルが、(Vista以降に導入された)マニフェストによる実行権限要求(requestedExecutionLevel)を持っていないこと

XP以前に作成されたレガシーアプリのほとんどは条件2,3を満たすため、一般ユーザーとして実行すれば(条件1も満たして)ファイル仮想化の対象となる。なお、Vista対応を謳っていても、後方互換性を考慮してマニフェストで実行権限要求を行なっていないアプリも存在する(32ビット版の秀丸など)。これらのアプリでも、右クリックメニューやプロパティの設定で「管理者として実行」するよう指定した場合は、条件1を満たさないのでファイル仮想化の対象外となる。

よく誤解されるのは条件3だ。マニフェストによる実行権限要求(requestedExecutionLevel)の内容は、"requireAdministrator"(管理者権限)である必要はなく、"asInvoker"(一般ユーザー権限)と指定されていてもいい。 たとえば、Windows Vista/7付属のメモ帳は、マニフェストで一般ユーザー権限が指定されている。条件3を満たさないので、メモ帳はファイル仮想化の対象外だ。つまり、システムフォルダーに置かれたファイルを一般ユーザー権限のまま読み込める。ただし、書き込み権限がないことに変わりはないので、変更内容を上書き保存できない。

実行中の各プロセスが、ファイル仮想化の対象かどうかを判別するには、タスクマネージャーやProcess Explorer(日本語化)といった、実行中のプロセス一覧を表示するツールを利用すればいい。タスクマネージャーの場合は、[表示]-[列の選択]でダイアログを開き、「ユーザーアカウント制御(UAC)の仮想化」をチェックすれば、[プロセス]ページのプロセス一覧にUACの仮想化欄が追加される。 Process Explorer(日本語化されたもの)では、[表示]-[列の選択]でダイアログを開き、[Process Image]ページの「仮想化」をチェックすればいい。

まとめ

Googleで「ファイル仮想化」などを実際に検索してみた人は、「おれの数時間を返せ」的な恨み辛みを述べるパワーユーザーのブログを数多く目にしたと思う。私もVistaで初めてファイル仮想化に遭遇したときには、調査も含めて数時間を無駄にした。

しかし、ファイル仮想化自体は、XP以前のレガシーアプリをVista以降で問題なく動作させるための暫定的な仕組みであり、設定ファイルがどこに保存されているかもわからないようなレベルのユーザーにとっては、「ファイルを保存できません」のようなメッセージを表示するよりはよっぽど親切な設計だ。

Microsoftは、Windows 95で「Sim City for Windows 3.1を動かすためだけにメモリ割り当てに特殊モードを用意する」とか、「Windows 3.1用アプリのコードをメモリーに読み込んだ後で動的にパッチ当てしてしまう」ぐらい後方互換性に躍起になるのがポリシーなので、ファイル仮想化のアプローチは当然とも言える。

おそらく、システムフォルダーの設定ファイルを一般ユーザー権限で書き換えられたことを不思議に思ったり、そのフォルダーのウィンドウに表示された「互換性ファイル」の表示にピンときたり、32ビット版秀丸用の外部マニフェストを自作しちゃったり、ローカルグループポリシーエディタ(あるいはレジストリエディタ)でUACを有効にしたままファイル仮想化を無効にしたりするのは、それだけの能力を持ったパワーユーザーの役目なんだろう。

0 件のコメント:

コメントを投稿