2009-02-02 11 views
29

Come posso ottenere gli argomenti della riga di comando di un altro processo?Come leggere gli argomenti della riga di comando di un altro processo in C#?

Uso funzioni statiche della classe System.Diagnostics.Process posso ottenere un elenco dei processi in esecuzione, ad esempio per nome:

Process[] processList = Process.GetProcessesByName(processName); 

Tuttavia, non v'è alcun modo per accedere alla riga di comando utilizzata per avviare questo processo. Come si farebbe questo?

+0

si può spiegare ciò che il vostro cercando di fare questo per? Potrebbe aiutare a trovare una soluzione migliore. –

+0

Voglio recuperare gli argomenti della riga di comando per trovare l'istanza corretta di un'applicazione, nel mio caso msiexec. –

+1

Interessante articolo di Raymond Chen: http://blogs.msdn.com/oldnewthing/archive/2009/11/25/9928372.aspx –

risposta

54

Se non si è utilizzato il metodo Start per avviare un processo, la proprietà StartInfo non riflette i parametri utilizzati per avviare il processo. Ad esempio, se si utilizza GetProcesses per ottenere una matrice di processi in esecuzione sul computer, la proprietà StartInfo di ciascun processo non contiene il nome del file originale o gli argomenti utilizzati per avviare il processo. (Fonte: MSDN)

WMI suggerimento di Stuart è una buona:

string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", processName); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery); 
ManagementObjectCollection retObjectCollection = searcher.Get(); 
foreach (ManagementObject retObject in retObjectCollection) 
    Console.WriteLine("[{0}]", retObject["CommandLine"]); 
+0

Grazie di Microsoft a voi e Stuart, sto usando la vostra codice di esempio ora. –

+0

PS: e benvenuto in SO :) –

+1

Grazie. Ho appena realizzato (troppo tardi) che lo stackoverflow è avvincente. – xcud

1

Process.StartInfo restituisce un oggetto ProcessStartInfo che presumibilmente ma non necessariamente ha gli argomenti nella proprietà Arguments.

+1

Non ha nel mio caso :(Potrebbe essere che questo funziona solo se l'altro processo è ospitato nel CLR. –

+5

infatti, la proprietà Arguments è impostata solo se il processo è stato avviato da un processo gestito utilizzando un oggetto ProcessStartInfo. –

5

Se si sta prendendo di mira Windows XP o successivo e si può permettere il sovraccarico di WMI, una possibilità sarebbe quella di cercare il processo di destinazione utilizzando WIN32_Process class di WMI, che ha una proprietà CommandLine.

0

Entrambi i progetti sono tuoi? Potresti modificare l'origine per il processo che stai cercando di esaminare per farti fornire i suoi argomenti da riga di comando, invece di cercare di leggerli da qualche parte al di fuori di quel processo?

+0

No, l'altro processo è msiexec –

Problemi correlati