随分前に自作した「壁紙変更.NETアプリ」に、Windowsのイベントログに書き込む機能があります。初回の書き込み時にはイベントソース新規作成をしており、その時だけ管理者権限が必要です。しかし、当アプリではそのケアができておらず、管理者以外が初回実行するとヘンテコなエラーが表示されるだけでした。それに、Windows VISTA/7のUACにも対応してませんでしたし。なので、対応してみることにしました。
それと、それなりのバイトサイズをインターネット越しにAJP連携するとかなり時間がかかることがわかり、当アプリもその影響を受けました。アプリを連続起動すると、前のプロセスが終わる(壁紙が変更される)前に、次のプロセスが起動する(壁紙を更に変更しようとする)ので、これはマズイことにようやく気づいたと。複数起動を禁止すべきだろうと。でも、Win7だとちょっと気をつけないといけないようで…
1) 管理者権限をもっているかどうかの判定 (WinXP/7)
bool IsAdministrator() とか、こんな感じなんですね。Administratorかどうか判定しているだけですが、「WindowsPrincipalオブジェクトを作成する」ってのが発想できないところかなぁ…。WindowsIdentityでRole判定できてもよさそうな?
2) 必要なときのみ、UACの昇格確認ダイアログを表示する。(Win7)
"runas"実行するだけで、「管理者として実行」したのと同様の動作になるようですね。(void RestartApplication()) へぇ~
3) .NETアプリの2重起動の禁止 (WinXP/7)
以前までと同様、Mutexを使って実装したら、Windows7で実行した際に、Application Crashと同じ現象が発生してしまいました。つまり、「解決策を探しています」的なダイアログが表示されて、イベントログにcrashが記録されます。ちゃんとreleaseしてるけどなぁ…。
2重起動しようとする度に、crashログを残してもしょうがないので、同じプロセス名のある/なしで判定する実装に変更。(Main()) これで静かになりました。