Windowsも64bitが割と定番になってきた今日この頃ですが、相変わらずUAC関連に悩まされることも多いです。これVistaのころから導入されているのに、意外と仕組みをきちんと知らない人が多いようです(自分も含めて)。
ここでいうUAC関連による悩みとは以下の事柄に代表されるかと思います。
- 権限昇格の問題(管理者権限付与ユーザーでも管理者として実行が必要なときがある)
- フォルダのリダイレクト
- レジストリのリダイレクト
これらに悩まされることが面倒で、UACをオフにして常に管理者権限付与したユーザーで操作するという手は言語道断、非常に不味いです。
どうしても管理者として実行させたいプログラムを作るときには、埋め込みマニフェストにて、asInvokerではなく、requireAdministrator を実行レベルに設定しておきましょう。これを適用しておくと常に管理者として実行されます。ただし実行するタイミングで暗転して確認が求められたりしますが・・・。それでもFAQのように、管理者として実行でお願いします、と毎回答えるよりはマシかと思います。
続いてリダイレクトについて。
フォルダがリダイレクトされ、レジストリもリダイレクトされ・・・これらは調査するときには非常に厄介だったりします。
レジストリについては、実はフラグ(KEY_WOW64_32KEYやKEY_WOW64_64KEY)で参照する場所を特定できるようですし、常に意識するようにすればそのうち慣れます。
64bitのレジストリエディタならば、全領域を参照することが出来ますし不具合調査の時にはコレを用いればいいでしょう。
フォルダのリダイレクトについて。
これが個人的には厄介だなと思いました。たとえば64bitのメモ帳を起動したいとき、32bitのプログラムからは普通にやると32bitのメモ帳しか起動出来ないのです。フルバス指定するにしても、C:\Windows\System32\notepad.exe が64bitのメモ帳を指すのですが、これがリダイレクトの対象になって、実際は C:\Windows\SysWow64/notepad.exe になってしまうわけで。
これを断ち切って動かすには、次のようなAPIを用います。
Wow64DisableWow64FsRedirection( PVOID ); Wow64RevertWow64FsRedirection( LPVOID );
これらは見ての通り、リダイレクションを有効・元に戻すという機能を持つAPIです。詳しくはMSDNのヘルプを参照してください。
コレを使って一時的にリダイレクトをオフにしてフルパス指定すれば、多くの場合には32bitプロセスから64bitプロセスを起動するといってことも割と楽に出来るのではないでしょうか。