6

Delphiを使用してWindowsサービスを作成しています。私のサービスがする必要があるのは基本的にプログラムを開くことです。私のコードでは、を使用していWinExec(aux,SW_SHOWNORMAL);ます。サービスを開始して実行すると、何も実行されていないように見えますが、TaskManagerを見ると、サービスを開く必要のあるプログラムがリストにあり、[ユーザー名]列に[SYSTEM]と表示されます。

そのため、プログラムは開いていますが、画面に表示されません。グーグルで調べてみたところ、のような機能が見つかりましたCreateProcessが、使い方がわかりません。私は何が間違っているのですか?

私の悪い英語について申し訳ありません。

4

1 に答える 1

6

CreateProcessAsUser()サービスは常にセッション0で実行されます。サービスによって開始されたプロセスは、サービスが別のセッションでプロセスを実行するために使用しない限り、デフォルトでサービスのセッションで実行されます。

XP以前では、最初にログインしたユーザーもセッション0で実行されます(その後のログインユーザーはセッション1以降で実行されます)。したがって、サービスがインストールされたときにインタラクティブとしてマークされ、UIを持つプロセスを実行している場合、セッション0で実行されているユーザーはUIを見ることができます。

Vista以降では、これは不可能になりました。ユーザーはセッション0で実行されなくなり、サービスをインタラクティブとしてマークできなくなります。これは「セッション0分離」として知られています。CreateProcessAsUser()ユーザーが表示できるように、インタラクティブセッションでUIプロセスを実行するには、サービスで今すぐ使用する必要があります。

詳細については、MSDNを参照してください。

セッション0の分離

セッション0の分離がWindowsのサービスとドライバーに与える影響

サービスからCreateProcessAsUser()を呼び出す

WindowsVista以降のWindowsサービスからインタラクティブプロセスを起動する

CreateProcessAsUser関数

于 2012-08-10T18:47:18.580 に答える