Menu

UAC

develop (84)
novice123

User Account Control (UAC)

Windows Vistaで導入されたUACへの対応に関するまとめ.

概略

Program Files, Windowsフォルダ,C:\直下などへ一般ユーザ(および一般ユーザの権限で動作しているアプリケーション)は書き込みを行えない.

互換モードで動作しているアプリケーションが書き込めないフォルダに書き込もうとすると,Virtual Store機能によって各人のPrivate Areaへのアクセスにリダイレクトされる.

アプリケーションの動作権限などはマニフェストに記述することで制御可能.

仕様(A)

  • Ver5.0未満のOS(Win95/98/Me/NT4.0)では従来どおり、常に.exeと同じフォルダに.iniを保存する。
  • Ver5.0以降のOSでもCSIDL_PROGRAM_FILES以外(外部記憶媒体etc.)から起動した場合は、.exeと同じフォルダに.iniを保存する。
  • Ver5.0以降のOSでCSIDL_PROGRAM_FILESから起動した場合のみ以下のように.iniのRead/Writeを機能拡張する。

.iniの読出し

(1) ユーザ別設定フォルダ(CSIDL_APPDATA\sakura)に.iniがあればそちらを、無ければ.exeと同じフォルダの.iniを読む。

※CSIDL_APPDATAの位置

2k/XP: C:\Documents and Settings\<username>\Application Data

Vista: C:\Users\<username>\AppData\Roaming

.iniの保存

(2) Vistaよりも以前のOSでは読み出したときの.iniを更新する(.iniが無い初期起動時は.exeと同じフォルダに.iniを作成)。

→ユーザが自分専用の.iniを手動でユーザ別設定フォルダに置くとマルチユーザ対応になる

(3) Vista以後のOSでは常にユーザ別設定フォルダに.ini保存する。

→自動的にマルチユーザ対応&Virtual Storeへの.ini保存を回避

従来仕様から新仕様へのバージョンアップ時動作

Vista以外の利用者は(1)(2)により、手動でマルチユーザ化を行わない限り従来と何も変わりません。

既にVista移行しているユーザの場合、バージョンアップ時、

  • (1)で、.exeと同じフォルダの.iniを読もうとしてVirtual Storeから最新の.iniが読まれる
  • (3)で、更新後の.iniがユーザ別設定フォルダに保存される
  • 以後、ユーザ別設定フォルダの.iniが使われる
    ということになります。

その他、マルチユーザ動作する場合(.iniの保存先がユーザ別設定フォルダになる場合)には、次のようにするのが良いかも。

  • .iniだけでなく、ユーザ指定アイコン、マクロ等の相対位置の基準もユーザ別設定フォルダにする
  • 各種設定のimport/export時など、ファイルダイアログを表示する際の初期表示はCSIDL_MYDOCUMENTSにする
    (CSIDL_PROGRAM_FILESへの保存を促すようなことは避ける)

あと、ついでに簡易ユーザ切替え対応も。

CSIDL_PROGRAM_FILES配下の.exeフォルダとユーザ別設定フォルダをまとめてひとつのフォルダに放り込めば、持ち歩き用外部記憶媒体の出来上がり(これもツール化すればもっと楽になると思います)。

その他の設定ファイル

相対パスでファイル(ini以外)を開くときは常に個人ディレクトリ→無ければ実行ファイルの場所と両方チェックする

  • 辞書ファイル(キーワードヘルプ)
  • ルールファイル
  • 外部ヘルプ
  • 外部HTMLヘルプ
  • キーワードヘルプ(辞書ファイルの当該箇所へジャンプ)
  • マクロフォルダ(Save, Load)
  • アイコンビットマップ(my_icons.bmp)の読み込み
  • migemo DLL
  • migemo辞書
  • 共通設定の「参照」ボタン
    • 外部ヘルプ1
    • Migemo DLL
    • Migemo辞書
    • キーワードリストのImport/Export(インポートフォルダ設定を使う)
    • マクロフォルダ(DropDownによる候補表示含む)
  • タイプ別設定の「参照」ボタン
    • アウトライン解析ルールファイル
    • 補完ファイル
    • 外部ヘルプ
    • 外部HTMLヘルプ
    • キーワードヘルプ
    • 辞書の参照
    • 辞書存在チェック
    • インポート時の辞書存在チェック
  • マクロ実行
  • キーボードマクロ保存先

CSIDL_APPDATA配下のまま、設定画面の[OK]ボタンの左側の空き部分に[設定フォルダ]ボタンを追加してみました(→Patches)。

ボタンを押すとメニューが表示されます。

メニュー項目: [開く] 、[インポート/エクスポートの起点リセット]

[共通設定]-[支援]でmigemo辞書のテキストボックスに相対パスが指定されている場合、[参照]ボタン押下時のフォルダ選択画面の初期表示フォルダを、

従来:カレントディレクトリ

修正:設定フォルダ優先

にしました。

仕様(B)

dev#4858

  • Ver5.0未満のOS(Win95/98/Me/NT4.0)では従来どおり、常に.exeと同じフォルダに.iniを保存する。
  • Ver5.0以降のOSでsakura.exeと同じディレクトリに''sakura.exe.ini''がある場合,その内容に従って設定ファイルの場所を決める.

.iniの読出し

sakura.exe.iniの内容に従う.

  • MultiUser: マルチユーザ設定にする/しない
    • 0:マルチユーザ設定にしない(デフォルト)※0指定時はMultiUser以外の指定は無効
    • 1:マルチユーザ設定にする
  • UserRootFolder: 基準となるパスの指定
    • 0:アプリケーションデータフォルダ(デフォルト) ex. C:\Documents and Settings\<username>\Application Data
    • 1:ユーザのルートフォルダ ex. C:\Documents and Settings\<username>
    • 2:ドキュメントフォルダ ex. C:\Documents and Settings\<username>\My Documents
    • 3:デスクトップフォルダ ex. C:\Documents and Settings\<username>\デスクトップ
  • UserSubFolder: サブフォルダ名
    • デフォルトはsakura

設定例

MultiUser=1
UserRootFolder=2
UserSubFolder=sakura_settings

⇒ ex. C:\Documents and Settings\<username>\My Documents\sakura_settings\sakura.ini

実装

patches#1721425

  • MultiUser1_x : 仕様(A)の実装
  • MultiUser2 : 仕様(B)の実装

関連する仕様変更

設定を保存して終了するオプション ''-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

UAC関連新規関数

  • InidirIsExedir()
  • CShareData::GetIniFileName()
  • CShareData::IsPrivateSettings()
  • COsVersionInfo::IsWinVista_or_later()

マニフェストの埋め込み

sakura.exeにはマニフェストを埋め込まない.

ユーザー自身がVista用の外部マニフェストファイルを適用する.

新規ファイル: resource/sakura.exe.manifest

sakuext

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に関するTips

現在は外部マニフェスト利用ということにしていますが、

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>

VirtualStore

Vistaで導入された旧アプリケーションとの互換性のための機能.

  • マニフェスト有り→Windows Vista対応アプリとみなされる→VirtualStore OFF
  • マニフェスト無し→Windows Vista以前のアプリとみなされる→VirtualStore ON

VirtualStoreがONの場合の問題点

エディタという特性上任意のファイルを開くことがあり得る.その際権限がないファイルも一見編集できるように見えてしまう.しかし実際には書き換えが行われないため,意図した効果が得られない可能性がある.

マニフェストを与えることでVirtualStoreを無効にした場合,既にvirtual storeに入っている設定ファイル(sakura.ini, RecKey.mac)は見えなくなる.

参考リンク


Related

Wiki: DesignReview

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.