Dirk Vollmar
Dirk Vollmar

Reputation: 176259

How to read command line arguments of another process in C#?

How can I obtain the command line arguments of another process?

Using static functions of the System.Diagnostics.Process class I can obtain a list of running processes, e.g. by name:

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

However, there is no way to access the command line used to start this process. How would one do that?

Upvotes: 33

Views: 36003

Answers (5)

colin lamarre
colin lamarre

Reputation: 1785

You can extend the Process class.

public static class ProcessExtensions
{
    public static string GetCommandLine(this Process process)
    {
        try
        {
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id))
            {
                using (ManagementObjectCollection objects = searcher.Get())
                {
                    return objects.Cast<ManagementBaseObject>().SingleOrDefault()?["CommandLine"]?.ToString();
                }
            }
        }
        catch
        {
            return "";
        }
    }
}

Upvotes: 2

plinth
plinth

Reputation: 49199

Process.StartInfo returns a ProcessStartInfo object that allegedly but not necessarily has the arguments in the Arguments property.

Upvotes: 0

xcud
xcud

Reputation: 14732

If you did not use the Start method to start a process, the StartInfo property does not reflect the parameters used to start the process. For example, if you use GetProcesses to get an array of processes running on the computer, the StartInfo property of each Process does not contain the original file name or arguments used to start the process. (source: MSDN)

Stuart's WMI suggestion is a good one:

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"]);

Upvotes: 58

JMD
JMD

Reputation: 7377

Are both projects yours? Could you modify the source for the process you're trying to examine to make it give you its command-line arguments, rather than trying to read them from somewhere outside of that process?

Upvotes: 0

stuartd
stuartd

Reputation: 73303

If you're targeting Windows XP or later and you can afford the overhead of WMI, a possibility would be to look up the target process using WMI's WIN32_Process class, which has a CommandLine property.

Upvotes: 5

Related Questions