説明し忘れていたところの補足。
まず、デモでグダッたところ。NTFS 上でコンパイルし、NTFS 上のみで行き来した .NET 製実行ファイルは、仮想化されません。SaveFiledialog で、Program Files や、Windows 以下に書き込もうとすると、SaveFileDialog が警告メッセージを出します。ZIP 圧縮したあとに解凍したものも、警告が出ます。
が、一旦 FAT (USB メモリなど)にコピーすると、そのための情報が落ちる?ここ、検証必要ですね。
仮想化されると、エクスプローラからは見えません。よって、ログなどをアプリケーションがあるディレクトリに書き込んでいる場合は注意が必要です。.NET アプリであれば昇格しなければ書き込めないし、マニフェストがない(昇格情報がついていない)Win32 アプリの場合は、仮想化されてしまうのでログを見ることが出来ません。
昇格するためのコードは、実はエバンジェリストの松崎さんのところにあるコードと同じです(http://blogs.msdn.com/tsmatsuz/archive/2007/01/25/windows-vista-uac-part-2.aspx)。松崎さんが、自分自身を昇格して実行しているのに対し、昇格して実行する部分を外に出すことで、昇格が必要な機能だけ実行しています。
private void DoElevation(string command, string argument) {
ProcessStartInfo info = new ProcessStartInfo(command, argument);
info.CreateNoWindow = false;
info.WorkingDirectory = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
info.Verb = "runas"; /* ここ */
try {
Process.Start(info);
} catch (Win32Exception ex) {
if (ex.NativeErrorCode != 1223 /* ユーザによる取り消し */) {
throw;
}
}
}
この様に、verb に runas を指定することで、昇格ダイアログが表示されるようになります。XP で実行すると、「別のユーザとして実行」になります。
証明書の偽装については、cmd.exe のコマンド ライン オプションを調べてください(コマンド プロンプト上で cmd /?)。
「昨日書き換えました」というスライドについて、説明しておきます。
ここ、最初は「開発者が情報を提供しなければならない」として、「ヘルプやインフォチップで情報を提供する」と書いていました。しかし、よく考えてみると、他人をだまそうと考えている人が正確なことを書くわけがありません。では、どうしよう?ちょっと待てよ?アクセスを禁止できると言うことは、システムは、アプリケーションが何をしようとしているかわかるわけじゃないか。それなら、システム側が「このアプリケーションは、c:/Windows/System32/comctl32.dll を書き換えようとしています。許可しますか?」と聞くことが出来るんじゃないか?・・・そう考えて、書き換えました。
「この機能は昇格が必要」という、シールドアイコンについては、開発者が追加するとしても、触られるとまずいところを触るのをカットするのは、実はシステムの役目何じゃないか?もっとも、互換性の問題が大きいこと、しょっちゅう昇格ダイアログを表示しなければならなくなることが、そうなっていない原因だとは思いますが。
投稿日時 : 2007年4月30日 20:41