6

我正在使用以下代码调用 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

到目前为止,我理解了最初的问题,任务是获取远程机器上远程启动进程的 PID。这是真的?在这种情况下,没有一个答案真的很有帮助。

您必须为每台远程计算机创建 WMI 查询,以获取已启动的进程。这可以使用“Win32_ProcessStartTrace”类来完成。

如果您需要更多帮助,请告诉我。

br--马布拉

于 2009-12-27T15:16:52.320 回答
0

我认为您无法让 PsExec 以您想要的方式返回 pid。

但是,您可以将自己的应用程序启动器包装器编写为控制台应用程序,并让它返回 pid。然后,您可以让 PsExec 始终通过调用此“AppStarter”来启动应用程序,从而返回您的 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 回答