2009-12-10 12 views
6

Sto utilizzando il codice seguente per richiamare PsExec.exe che richiama la mia applicazione console in due server, non sono in grado di accedere al ProcessId dei processi richiamati (le mie app console).Aiuto necessario per ottenere l'ID processo per PsExec.exe in C#?

process.StandardOutput.ReadToEnd()); mi sta solo dando i nomi dei server ma non il contenuto completo.

Potete aiutarmi per favore a ottenere l'id del processo generato da PsExec.exe sui server remoti ??

 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()); 

risposta

0

Non penso che si possa ottenere PsExec per restituire il pid nel modo desiderato.

Tuttavia, ciò che si può fare è scrivere il proprio application starter wrapper come applicazione console e restituire il pid. Puoi quindi fare in modo che PsExec avvii sempre le applicazioni chiamando questo "AppStarter", restituendo così il tuo pid.

Qualcosa sulla falsariga di:

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); 
     } 
    } 
} 

[questo è un esempio di massima e pronta, senza la gestione delle eccezioni, ecc - proprio come un'illustrazione]

Il tuo codice di cui sopra diventa ora somthing come

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()); 
5

Prova ad aggiungere il parametro -d alla linea di comando PsExec.

Non attendere fino all'applicazione terminare. Utilizzare questa opzione solo per le applicazioni non interattive .

Questo dovrebbe restituire correttamente l'ID processo a StandardError.

L'esempio:

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()); 

uscita:

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. 
+0

Spiacente, ho dimenticato di aggiungere il parametro -d nel mio esempio. "Questo dovrebbe restituire correttamente l'ID processo a StandardError." puoi dare qualche campione per favore? –

0

Finora ho understodd alla domanda iniziale, il compito era quello di ottenere il PID dei processi remoetely iniziate sulle macchine remote. È vero? In questo caso, nessuna delle risposte è davvero utile.

È necessario creare query WMI per ciascuno dei computer remoti, per recuperare i processi avviati. Questo può essere fatto usando le classi "Win32_ProcessStartTrace".

Se hai bisogno di ulteriore aiuto, fammi sapere.

br - mabra

+0

'PsExec' restituisce l'ID del processo remoto dopo che è stato avviato correttamente. Stava semplicemente non leggendolo dal flusso corretto (StandardOutput invece di StandardError). –

Problemi correlati