Win32: サービスプロセスからアプリケーションを起動する方法

サービスプロセスは、デフォルトでは "SYSTEM" ユーザで動作する。このため、ドメインへのログオンが行えなかったり、サービスプロセスから起動したアプリケーションが想定どおりに動いてくれない場合がある。
例えば、サービスプロセスから Word を起動すると、Word は「あ、このユーザで起動されるのは初めてだ」と判断し、ユーザの名前やイニシャルを聞いてくる。したがって、サービスプロセスがその後 Word に何らかの操作をしようとしても、動いてくれない、なんてことが起こる。
これを避けるためには、サービスプロセス自体を特定のユーザで動作するよう設定するか、サービスから別プロセスを起動するときに、サービス自身がユーザを切り替えておく必要がある。Windows 標準で後者を実装している例に、「タスク」がある。新規のタスクを作成すると、どのユーザで実行するか (具体的には、ユーザ名とパスワード) を入力する。
これをやるにはどうすればいいかというと、UNIX の su コマンドと同じような処理をすることになる。一旦その特定ユーザでログインした状態になってから、子プロセスを起動する、という手順。詳しい手順については、Borland のサイトに C++ Builder の Tips として公開されている、以下の文書が参考になる。

C++Builder Tips - Windows NT の Substitute User
http://www.borland.co.jp/tips/cbuilder/cb014/