2007年02月02日

既存アプリのVista対応・改造計画:4回目「何が問題なのか:その2」

前回、既存アプリが受ける代表的な問題点をあげた。それに対する一般的な対応策を紹介しつつ、実はそれでも問題が残ることを今回は取り上げる。

マシン固有の情報(HKEY_LOCAL_MACHINEレジストリとProgram Filesフォルダ、他にWindowsフォルダも同様)への書き込み制限を解除して書き込み可能にする方法は2つある。

一つはプログラムの互換性プロパティを開いて管理者権限を付与するもの。(下図参照)

互換性プロパティ

管理者権限でログインしている筈なのに何故また管理者権限を付与する必要があるのかと思うかもしれない。UAC(ユーザーアカウント制御)では管理者でも通常は一般ユーザ(Usersグループ)で動いているのである。
Vistaでは下図のようなダイアログを頻繁に見るようになるが、これこそ管理者権限に格上げする表明なのである。

ユーザーアカウント制御

もう一つは、上記プロパティの代わりにマニフェストとよばれる外部ファイルを配置するものだ。
hoge.exeというプログラムがあるとしたら、マニフェストはhoge.exe.manifestという名前になる。(プログラムファイル名).manifestが命名規則になっている。これをプログラムと同じフォルダに配置する。
内容は以下の通り。ファイル名のところを変更するだけで他は共通で使える。(※注)

マニフェスト
requireAdministrator が管理者権限で実行することを要求する。

この処置を施すことで従来通りの動きが保証される。だが、これがまた別の問題を生むのである。
管理者モードに格上げされるのは自動ではない。必ず前述したダイアログで待ったが掛かる。
前回紹介した私のオンラインソフトのExit-WinメルプリTなどは、Windows起動時に自動で起動し常駐するのが通常の使い方である。それなのに人手を介さないと先へ進まないのでは全く使い物にならない。

そこでどうするか。私の考えた一つの方法を次回紹介したいと思う。

※注:VB6のプログラムでもマニフェストは使えるが、ネイティブコンパイルしたEXEでないと使えないので注意。私のオンライソフトでネイティブコンパイルしたのは実は一つもない。というのもVB6のネイティブコンパイルはほとんど効果(速度)が期待できない中途半端なものだからだ。むしろファイルサイズが大きくなって起動に時間が掛かるマイナス面の方が大きいとさえ言える。(これはVB5が出た当時からの私の認識である)




posted by なっちゃん at 00:12| 静岡 ☁| Comment(3) | TrackBack(0) | Windows Vista & 7 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
はじめまして、大変参考になる文章に感謝しています。ところで、質問なのですが、Manifestを使った場合、HKLM下のレジストリキーは更新可能でしょうか。リブート等のAdmin権限が必要なものはManifestで動作するのですが、HKLMだけは変更できなくて困っています。RegSetValueExを使用していて、右クリックからAdmin権限実行では変更できるのですが・・・
Posted by nzm at 2007年03月29日 02:04
もちろん、可能です。
私の自作アプリの中では、とりあえず自動ログオンの部分で確認済みです。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Posted by なっちゃん at 2007年03月29日 12:34
いろいろ試た結果、ソースファイルのフォルダにManifestファイルを作っていなかったのが原因でした。VS2005C++で作っていると自動的にProject\Releaseフォルダにxxx.intermediate.manifestファイルが生成されるのでそのファイルと勘違いしておりました。成功後、Vista上でExeファイルにWindowsのShieldマークが表示されて(XPでは表示されず)、UACも表示可能になりました。
大変ありがとうございました
Posted by NZM at 2007年03月30日 01:32
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。