Windowsサービスから指定したユーザーでプロセスを起動する(解決編)2007年12月14日 15時50分38秒

この前書いた「Windowsサービスから指定したユーザーでプロセスを起動する 」ですが、やっと解決しました。その方法は以下の通りです。

  • ユーザーを指定してプロセスを実行するのにCreateProcessWithLogonWを使用する。
  • CreateProcessWithLogonWの引数dwLogonFlagsにはLOGON_WITH_PROFILEを使用する。
  • CreateProcessWithLogonWの引数のSTARTUPINFOに次のように指定する。
startInfo.lpDesktop = "winsta0\\default";

CreateProcessWithLogonW自体の使い方については検索すればいろいろ出てくると思います。 とりあえずCodeProjectにサンプルコードが掲載されていたのでこれを見てください。

RunAs Class

重要なのはlpDesktopに指定した"winsta0\\default"です。このうちwinstat0はステーション、defaultはデスクトップを指定する文字列です。 ステーションとはここを見ると詳しく解説されています。 簡単に言うとステーションとはユーザーごとに用意されたオブジェクトで、デスクトップはステーションに含まれるオブジェクトの内の1つで、表示画面をつかさどります。 Windowsサービスはふつうのアプリとは違う特殊なステーション・デスクトップ上で動作しているため、サービスから起動したアプリはその特殊なステーションを引き継いでしまいきちんと動作しない物と思われます。