俺#

新潟市でIT業を営むおっさんのブログ。

ソフトをWindows VistaのUACにスマートに対応させる

とにかくVista対策としてUser Account Control(UAC)への対応が早急に必要である事は判った。まぁ、XP以前の「制限ユーザー」でも動作する「行儀の良いアプリ」は、インストールさえできればVistaでそのまま動くハズなのだが、世のソフトのほとんどはそうなってないという現実。DOSで育ったプログラマにはセキュリティなんてメンドウな事この上ないしな(^^;

まず、アプリを丸ごと「要管理者権限」にしちゃう方法。常に管理者権限が必要な、行儀良くしたくでも出来ないインストーラや設定変更ツールの類はこれでオーケーだろう。アイコンに「盾」マークがオーバーラップされ、ユーザーが「管理者で実行」しなくても「許可」ダイアログが出るようになる。方法は既に日本語リソースが先人によって公開されている。

http://tipsofvb.net/blogs/tips/archive/2006/10/15/398.aspx
http://www.yoshibaworks.com/ayacy/inasoft/talk/h200610a.html

これはこれでコンパイルの必要もなくお手軽なのだが、フツーのアプリのプロセスを丸ごと管理者に昇格してしまうのはアレだ。必要なときだけ昇格したくなるのが筋であろう。Vistaを使っていると、そこかしこにカラフルな「盾」マークの付いたボタンが出てきて、押下すると例の「許可」ダイアログが表示されるのに気づく。これと同じ処理を自分のアプリに実装する方法である。

http://www.microsoft.com/downloads/details.aspx?FamilyID=ba73b169-a648-49af-bc5e-a2eebb74c16b&DisplayLang=en

C#ではなく、C++のサンプルコードが満載なのが嬉しい。ご丁寧に「盾」のアイコンリソースの読み込み方法までサンプルが(笑。ちなみにmanifestの記述についても解説があったり、タスクスケジューラにタスクを登録するサンプルがあったりする。最も知りたい「昇格」の方法だが、

.....When the application detects that one of these buttons has been selected, it has the following two choices:

The application launches a second program using ShellExeucute() to perform the administrative task. This second program would be marked with a requestedExecutionLevel of requireAdministrator, thus causing the user to be prompted for approval. This second program would be running with a full administrator access token and would be able to perform the desired task.

OR

The application launches a COM object using CreateElevatedComObject(). This API would launch the COM object with a full administrator access token following approval, and this COM object would be able to perform the desired task.

というわけで「今のプロセスを動的に昇格したり降格したり」することは出来ないらしい。今までのコードに昇格処理を挿むだけじゃないのかー。メンドウくせぇ(苦笑。該当箇所をCOMでラップしてCreateElevatedComObject()するのが一番スッキリするかなぁ。ちなみにCreateElevatedComObject()はAPIではなくてドキュメント内にソースがあるので、コピペすれば良さそうだ。