3

現在、SYSTEM アカウントで実行されている Windows サービスから制限付きユーザーとしてプロセスを起動するために、C# から P/Invoke を使用して CreateProcessAsUser で遊んでいます。

私の目的は、オフィスのユーザーから情報を取得する必要があるアプリを起動するサービスを用意することです (フォアグラウンドで実行されているプロセス、アイドル状態の時間など)。問題は、このアプリがユーザーの特権で実行されている場合...まあ、彼はそれを閉じることができるということです. 別のアプリから通常のプロセスのように実行している場合、このリスポーンを次のように制御できます。

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = ExePath;
psi.UseShellExecute = false;

Process p = new Process();
p.StartInfo = psi;
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(LaunchAgain);
p.Start();

しかし、このように、私の問題は、no-respawn-closable-by-user-app を使用する代わりに、2 つの app-closable-by-user を使用することです (ただし、そのうちの 1 つがもう 1 つを再生成します:P)。

CreateProcessAsUserによって作成されたプロセスが強制終了または終了されたときに何らかのアクションを開始するために「監視」できるかどうかを知る方法があることをご存知ですか?

PD: もちろん、どんな種類の改善や別のアプローチも提案しないでください。

4

2 に答える 2

1

2 つのこと - CreateProcessAsUser にはlpProcessInformation、新しいプロセスに関するデータを受け取るパラメーターがあります。その後、プロセス ハンドルを待つことができます。または、Process.GetProcessById(...) によって C# プロセス クラスを作成し、上記のスニペットのように使用することもできます。

OTOH、あなたのサービスから直接機能を実行する方が簡単かもしれません(情報を収集します-私がそれを正しく理解していれば)。

于 2013-05-24T10:19:52.377 に答える
1

私は最終的にそれを解決することができました:

ProcessRunner runner = new ProcessRunner(Path, hSessionToken);
runner.Run();
this.Launch(context);

そして、私の ProcessRunner クラスでは、次のようなものを使用しました:

CreateProcessAsUser(this.mSessionTokenHandle, this.mApplicationPath, this.CommandLine, IntPtr.Zero, IntPtr.Zero, 0, creationFlags, envBlock, this.WorkingDirectory, si, pi);
ProcessWaitHandle waitable = new ProcessWaitHandle(pi.hProcess);
if (waitable.WaitOne())
{
    return;
}  

WaitOneはシグナルを受け取ると true を返すためです。

これは、待機ハンドルをいじる私のクラスです。

internal class ProcessWaitHandle : WaitHandle
{
    public ProcessWaitHandle(IntPtr processHandle)
    {
        this.SafeWaitHandle = new SafeWaitHandle(processHandle, false);
    }
}

ハンドルを操作するというアイデアをくれた JeffRSon に感謝します。

于 2013-05-27T17:30:57.303 に答える