UACではまる

もう何度目だかわからないけど、また同じことでハマったので日記。


Windows Vistaや7に、ApacheMySQLを入れたときのトラブル。
デフォルトでは C:\Program Files\ 以下にインストールされ、設定ファイル(my.iniとかhttpd.conf)も、C:\Program Files\ 以下に入る。
これらの設定ファイルをメモ張で編集するなら問題無い。問題が発生するのは、古いエディタ。manifestに

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
     <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
     </requestedPrivileges>
    </security>
  </trustInfo>

って書かれてないエディタ。


こういうエディタで編集すると、C:\Program Files\ 以下のファイルには書き込む権限が無いのに、書き込めたように見えてしまう。実際には、C:\Program Files\ 以下のファイルは更新されずに、%LOCALAPPDATA%\VirtualStore\Program Files\ 以下にファイルが出力されてる。


面白いことに古いエディタで、C:\Program Files\ 以下のファイルを読み込むと、VirtualStore 以下のファイルが優先的に読み込まれてしまうので、ユーザから見ると C:\Program Files\ 以下のファイルが正常に更新できたように見えてしまう。(ファイルを読み込むアプリも仮想化が有効になっていれば、同じファイルを読みにいくので大きな問題にはならないけど、ApacheMySQLサーバは仮想化が無効になっているので、本物のファイルを読みに行くから問題が起こる...)
manifestでlevel="asInvoker"にしておけばこの動作が無効になるので、期待通りに「アクセス拒否」となって保存が失敗するので安心。


ちなみに、タスクマネージャで「UACの仮想化」というカラムがこれに対応してるっぽいので「かれこれ5年くらいエディタをアップデートしてない...」って人は一度見ておいたほうがいいかも。
あと、アドレスバーから %LOCALAPPDATA%\VirtualStore\Program Files\ を開いて、ファイルが出力されてないか確認するとか。