6

以下のコードを使用して、2 つのサーバーでコンソール アプリケーションを呼び出す PsExec.exe を呼び出しています。呼び出されたプロセス (コンソール アプリ) の ProcessId を取得できません。

process.StandardOutput.ReadToEnd()); サーバー名のみを提供していますが、完全なコンテンツは提供していません。

リモート サーバー上の PsExec.exe によって生成されたプロセス ID を取得する方法を教えてください。

        Process process = new Process();
        ProcessStartInfo psi = new ProcessStartInfo(@"PsExec.exe");
        psi.UseShellExecute = false;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.RedirectStandardInput = true;
        psi.WindowStyle = ProcessWindowStyle.Minimized;
        psi.CreateNoWindow = true;
        psi.Arguments = @"-i -u Username -p xxxxxx \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000";
        process.StartInfo = psi;
        process.Start();

        Console.WriteLine(process.StandardOutput.ReadToEnd());
4

3 に答える 3

5

-dパラメータを PsExec コマンドラインに追加してみてください。

アプリケーションが終了するのを待ちません。このオプションは、非対話型アプリケーションにのみ使用してください。

これにより、プロセス ID が StandardError に正しく返されるはずです。

例:

ProcessStartInfo psi = new ProcessStartInfo(
    @"PsExec.exe",
    @"-d -i -u user -p password \\server C:\WINDOWS\system32\mspaint.exe")
                           {
                               UseShellExecute = false,
                               RedirectStandardOutput = true,
                               RedirectStandardError = true,
                               RedirectStandardInput = true,
                               WindowStyle = ProcessWindowStyle.Minimized,
                               CreateNoWindow = true
                           };
Process process = Process.Start(psi);

Console.WriteLine(process.StandardError.ReadToEnd());

出力:

PsExec v1.94 - Execute processes remotely
Copyright (C) 2001-2008 Mark Russinovich
Sysinternals - www.sysinternals.com

C:\WINDOWS\system32\mspaint.exe started with process ID 5896.
于 2009-12-10T09:04:23.400 に答える
0

PsExec に pid を希望どおりに返してもらうことはできないと思います。

ただし、できることは、独自のアプリケーション スターター ラッパーをコンソール アプリケーションとして記述し、これに pid を返すようにすることです。次に、この「AppStarter」を呼び出して PsExec に常にアプリケーションを開始させ、pid を返すことができます。

次のようなもの:

namespace AppStarter
{
    class Program
    {
        static void Main(string[] args)
        {
            Process process = new Process();
            ProcessStartInfo psi = new ProcessStartInfo(args[0]);
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            psi.RedirectStandardInput = true;
            psi.Arguments = string.Join(" ", args, 1, args.Length - 1);
            process.StartInfo = psi;
            process.Start();
            Console.WriteLine("Process started with PID {0}", process.Id);
        }
    }
}

[これは大まかな例であり、例外処理などはありません - 単なる例として]

上記のコードは次のようになります

 Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(@"AppStarter.exe");
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.RedirectStandardInput = true;
    psi.WindowStyle = ProcessWindowStyle.Minimized;
    psi.CreateNoWindow = true;
    psi.Arguments = @"PsExec.exe -i -u Username -p 26.06.08 \\server1,server2 C:\data\GridWorker\GridWorker.exe 100000";
    process.StartInfo = psi;
    process.Start();

    Console.WriteLine(process.StandardOutput.ReadToEnd());
于 2009-12-10T08:56:43.253 に答える
0

これまでのところ、元の質問を理解しました。タスクは、リモート マシンでリモートで開始されたプロセスの PID を取得することでした。これは本当ですか?この場合、どの答えも本当に役に立ちません。

開始されたプロセスを取得するには、リモート コンピュータごとに WMI クエリを作成する必要があります。これは、「Win32_ProcessStartTrace」クラスを使用して行うことができます。

さらにサポートが必要な場合はお知らせください。

br--マブラ

于 2009-12-27T15:16:52.320 に答える