需要帮助在C#中获取PsExec.exe的进程ID?

时间:2009-12-10 08:38:53

标签: c# wmi psexec

我使用下面的代码来调用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());

3 个答案:

答案 0 :(得分:5)

尝试将-d参数添加到PsExec命令行。

  

不要等待申请   终止。仅使用此选项   非交互式应用程序。

这应该正确地将Process 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.

答案 1 :(得分: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());

答案 2 :(得分:0)

到目前为止,我总结了原来的问题,任务是获取远程机器上已经启动的进程的PID。这是真的?在这种情况下,没有一个答案真的有用。

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

如果您需要更多帮助,请与我们联系。

BR - mabra