2009年3月17日火曜日

Windowsサービスからアプリケーションを起動する

 Windowsサービスから自動でアプリケーションを起動しようとしたところ、起動してもデスクトップに表示されない・・・。

   *   *   *

 よくよく調べてみれば、サービスをSYSTEMユーザーで起動するように構成しているため、そのままアプリケーションを起動すると、SYSTEMユーザーでアプリケーションが起動する。つまりログオンしているユーザーのデスクトップには表示されず、バックグラウンドで実行されるということ。

 .NET frameworkのSystem.Diagnostic.Processクラスを利用して、アプリケーションを起動している
のだけど、アプリケーションの起動ユーザーを指定できるので試してみた。

   *   *   *

 権限がなくてNG・・・。普通のコンソールアプリやアプリケーションからは起動できるので、メソッドの使用方法は間違っていない様子。特定のユーザーでアプリケーションを起動させるコンソールアプリを作成し、サービスからそれをキックしても同様のエラー。コンソールアプリ単体では動作するのに・・・。

 ユーザーの偽装ができないように対策されている様子。まあ、当たり前か。

   *   *   *

 Win32APIを利用して、ユーザーを偽装させて実行させることは可能なようだけど、手順が面倒臭いし、普通のアプリケーションを作成するほうが楽チンなので、必要ならばそちらで対応しようと思う。

   *   *   *

 バックグラウンドでExcelマクロなどを実行できるので、特殊な利用方法には使えるかもしれない。サービスをユーザー権限でインストールするようにすればよいのだけど、複数ユーザーが利用する場合はどのように動作するのだろう。興味深いので、そのうち試してみようかな。

   *   *   *

 System.Diagnostic.Processでユーザーを利用して、プロセスを起動する場合、パスワードが必要になる。受け渡しは、System.Security.Stringクラスを利用するのだが、パスワードの入力を省略させる場合、パスワードを保存する手法にはどのようなものがあるのだろうか。例えばWindowsだとネットワークドライブのパスワードの保存ができるが、内部的にはどのように保存しているのだろう? Windowsでの安全な保存方法(完璧なものはないと思うが)の一般的な方法はあるのだろうか。

   *   *   *

 パスワードつながりで、いつも気になっていることを少し。社内などで認証をしているアプリケーションでは、パスワードの平文がアプリケーションには渡されているわけで、開発している人にはユーザーのパスワードを入手することが簡単。LDAPサーバを立てて、各システムで共用している場合、イントラネットのメールから何から、すべて一つのパスワードで利用できてしまうので、ある意味危険なのかなあ、と思う。とあるシステムの開発担当は、悪意があれば、その社内のすべてのアプリケーションの利用をするためのパスワードを入手することが可能なのではないか。

 同じことがネット上でも言えるかもしれない。たいていのサービスはメールアドレスがユーザIDとなっている。異なるサービスのユーザーIDを共通にすることは多いだろう。パスワードをメールのアカウントと同じにしている人も多いかもしれないが、サービスごとに変えておいたほうが安全かもしれない。

 だらだらと書きなぐり。

0 件のコメント: