Windowsサービスから指定したユーザーでプロセスを起動する(解決編) ― 2007年12月14日 15時50分38秒
この前書いた「Windowsサービスから指定したユーザーでプロセスを起動する 」ですが、やっと解決しました。その方法は以下の通りです。
- ユーザーを指定してプロセスを実行するのにCreateProcessWithLogonWを使用する。
- CreateProcessWithLogonWの引数dwLogonFlagsにはLOGON_WITH_PROFILEを使用する。
- CreateProcessWithLogonWの引数のSTARTUPINFOに次のように指定する。
startInfo.lpDesktop = "winsta0\\default";
CreateProcessWithLogonW自体の使い方については検索すればいろいろ出てくると思います。 とりあえずCodeProjectにサンプルコードが掲載されていたのでこれを見てください。
重要なのはlpDesktopに指定した"winsta0\\default"です。このうちwinstat0はステーション、defaultはデスクトップを指定する文字列です。 ステーションとはここを見ると詳しく解説されています。 簡単に言うとステーションとはユーザーごとに用意されたオブジェクトで、デスクトップはステーションに含まれるオブジェクトの内の1つで、表示画面をつかさどります。 Windowsサービスはふつうのアプリとは違う特殊なステーション・デスクトップ上で動作しているため、サービスから起動したアプリはその特殊なステーションを引き継いでしまいきちんと動作しない物と思われます。
