Windows Vistaで導入されたUACへの対応に関するまとめ.
Program Files, Windowsフォルダ,C:\直下などへ一般ユーザ(および一般ユーザの権限で動作しているアプリケーション)は書き込みを行えない.
互換モードで動作しているアプリケーションが書き込めないフォルダに書き込もうとすると,Virtual Store機能によって各人のPrivate Areaへのアクセスにリダイレクトされる.
アプリケーションの動作権限などはマニフェストに記述することで制御可能.
(1) ユーザ別設定フォルダ(CSIDL_APPDATA\sakura)に.iniがあればそちらを、無ければ.exeと同じフォルダの.iniを読む。
※CSIDL_APPDATAの位置
2k/XP: C:\Documents and Settings\<username>\Application Data
Vista: C:\Users\<username>\AppData\Roaming
(2) Vistaよりも以前のOSでは読み出したときの.iniを更新する(.iniが無い初期起動時は.exeと同じフォルダに.iniを作成)。
→ユーザが自分専用の.iniを手動でユーザ別設定フォルダに置くとマルチユーザ対応になる
(3) Vista以後のOSでは常にユーザ別設定フォルダに.ini保存する。
→自動的にマルチユーザ対応&Virtual Storeへの.ini保存を回避
Vista以外の利用者は(1)(2)により、手動でマルチユーザ化を行わない限り従来と何も変わりません。
既にVista移行しているユーザの場合、バージョンアップ時、
その他、マルチユーザ動作する場合(.iniの保存先がユーザ別設定フォルダになる場合)には、次のようにするのが良いかも。
あと、ついでに簡易ユーザ切替え対応も。
CSIDL_PROGRAM_FILES配下の.exeフォルダとユーザ別設定フォルダをまとめてひとつのフォルダに放り込めば、持ち歩き用外部記憶媒体の出来上がり(これもツール化すればもっと楽になると思います)。
相対パスでファイル(ini以外)を開くときは常に個人ディレクトリ→無ければ実行ファイルの場所と両方チェックする
CSIDL_APPDATA配下のまま、設定画面の[OK]ボタンの左側の空き部分に[設定フォルダ]ボタンを追加してみました(→Patches)。
ボタンを押すとメニューが表示されます。
メニュー項目: [開く] 、[インポート/エクスポートの起点リセット]
[共通設定]-[支援]でmigemo辞書のテキストボックスに相対パスが指定されている場合、[参照]ボタン押下時のフォルダ選択画面の初期表示フォルダを、
従来:カレントディレクトリ
修正:設定フォルダ優先
にしました。
sakura.exe.iniの内容に従う.
設定例
MultiUser=1 UserRootFolder=2 UserSubFolder=sakura_settings
⇒ ex. C:\Documents and Settings\<username>\My Documents\sakura_settings\sakura.ini
設定を保存して終了するオプション ''-WQ'
(sakuraextとの連携用)
ExtendParameter の $I: Iniファイルのフルパス
短縮設定: %AppData%→アプリデータ
旧関数名→新関数名
GetExecutableDir
→GetExedir GetInidir GetInidirOrExedir
FILE fopen_absexe
→FILE _tfopen_absexe
HFILE _lopen_absexe
→FILE *_tfopen_absini
IsLuna
→IsWinXP_or_later
IsWin2000orLater
→IsWin2000_or_later
sakura.exeにはマニフェストを埋め込まない.
ユーザー自身がVista用の外部マニフェストファイルを適用する.
新規ファイル: resource/sakura.exe.manifest
sakuextは関連づけを扱うので管理者権限が必要.
しかし現状のsakuextを再構築できる環境が用意できず,mt.exeによるマニフェストの埋め込みにも対応していない.
そのためAdministrator権限を必要とする別のexeから間接的に呼びだすようにする.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="sakuext.exe" type="win32" /> <!-- Identify the application security requirements. --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator"/> </requestedPrivileges> </security> </trustInfo> </assembly>
現在は外部マニフェスト利用ということにしていますが、
UAC対応化のマニフェストは実行ファイル埋め込むことも可能です。
(ビルド後にmt.exeで埋め込むなど)
Visual Style化も埋め込みにすれば、外部マニフェスト無しでVisual Styleになります。
埋め込み式にしてもWindows XPでは、空の外部マニフェストファイルを実行ファイルと同じフォルダに置けば、Visual Styleを無効化できるようです。
#Vistaでは外部マニフェストでは無効化できないみたいです。
空のsakura.exe.manifest例
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> </assembly>
Vistaで導入された旧アプリケーションとの互換性のための機能.
エディタという特性上任意のファイルを開くことがあり得る.その際権限がないファイルも一見編集できるように見えてしまう.しかし実際には書き換えが行われないため,意図した効果が得られない可能性がある.
マニフェストを与えることでVirtualStoreを無効にした場合,既にvirtual storeに入っている設定ファイル(sakura.ini, RecKey.mac)は見えなくなる.