じょもらな日々

電脳硬化症気味な日記です。まとまった情報は wiki にあります。

2012.7.2 (Monday)

at 23:58  

壁紙変更アプリの改修(UAC対応、Win7での2重起動禁止)   [ICTメモ]

 随分前に自作した「壁紙変更.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()) これで静かになりました。


« tomcat6 on CentOS… Clip to Evernote
HONDAには、ワクワク感を期待す… »
  trackback:    



Go back.