代码之家  ›  专栏  ›  技术社区  ›  Jon

需要帮助才能在C_中获取psexec.exe的进程ID?

  •  6
  • Jon  · 技术社区  · 15 年前

    我正在使用下面的代码调用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 回复  |  直到 8 年前
        1
  •  5
  •   Yannick Motton    15 年前

    尝试添加 -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.
    
        2
  •  0
  •   Rob Levine    15 年前

    我认为你不能让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);
            }
        }
    }
    

    [这是一个粗糙的现成的例子,没有异常处理等-就像一个例子]

    上面的代码现在变成了somthing 喜欢

     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());
    
        3
  •  0
  •   mabra    15 年前

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

    必须为每个远程计算机创建wmi查询,才能获取已启动的进程。这可以使用“win32_processstarttrace”类来完成。

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

    Br-马布拉