How to Retrieve Command Line Arguments for a Running Process by PID in Windows


2 views

When troubleshooting or monitoring Windows systems, developers often need to identify the exact command that launched a particular process. This becomes crucial when:

  • Debugging long-running processes
  • Identifying malicious processes
  • Auditing system activity
  • Analyzing process dependencies

Windows provides several built-in methods to examine process command lines:

1. Using WMIC (Windows Management Instrumentation Command-line)

wmic process where processid="[PID]" get commandline

Example for PID 1234:

wmic process where processid="1234" get commandline

2. PowerShell Approach

For more flexibility, use PowerShell:

Get-WmiObject Win32_Process -Filter "ProcessId = [PID]" | Select-Object CommandLine

Or the newer Get-CimInstance:

Get-CimInstance Win32_Process -Filter "ProcessId = [PID]" | Select-Object CommandLine

For developers needing to integrate this functionality into applications:

using System;
using System.Management;

class ProcessCommandLine
{
    static void Main(string[] args)
    {
        int pid = int.Parse(args[0]); // Get PID from command line
        string query = $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {pid}";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        
        foreach (ManagementObject obj in searcher.Get())
        {
            Console.WriteLine(obj["CommandLine"]);
        }
    }
}

Microsoft's Sysinternals suite offers powerful alternatives:

pslist -x [PID]  // Shows extended information including command line
or
handle -p [PID]  // Provides detailed process information

Be aware that:

  • Administrative privileges are typically required
  • Some processes might hide their command line arguments
  • Anti-virus software might flag command-line queries as suspicious

For database administrators, here's how to check SQL Server processes:

// Find all SQL Server processes
Get-WmiObject Win32_Process -Filter "name like '%sqlservr%'" | 
    Select-Object ProcessId, CommandLine | 
    Format-Table -AutoSize

While this article focuses on Windows, similar functionality exists on Linux/macOS:

ps -p [PID] -o args  # Linux/macOS equivalent

When monitoring processes on Windows systems, you'll often find yourself needing to go beyond simple process names and PIDs. Unlike Unix-like systems where ps -ef readily shows full command lines, Windows requires different approaches depending on your access level and tools available.

For quick checks without installing additional software:

wmic process where "ProcessID=1234" get CommandLine

Replace 1234 with your target PID. This works well for most scenarios but has character limit constraints.

A more modern solution using PowerShell:

Get-WmiObject Win32_Process -Filter "ProcessId = 1234" | Select-Object CommandLine

Or the newer alternative:

Get-CimInstance Win32_Process -Filter "ProcessId = 1234" | Select-Object CommandLine

For basic information (though limited to visible processes):

tasklist /v /fi "PID eq 1234"

For developers needing to implement this in applications, here's a C# example:

using System;
using System.Management;

class Program {
    static void Main() {
        int pid = 1234; // Replace with target PID
        string query = $"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {pid}";
        
        using (var searcher = new ManagementObjectSearcher(query)) {
            foreach (ManagementObject obj in searcher.Get()) {
                Console.WriteLine(obj["CommandLine"]);
            }
        }
    }
}

When built-in tools don't suffice:

  • Process Explorer (Sysinternals): Shows complete command lines in UI and CLI
  • Process Hacker: Open-source alternative with detailed process information

Be aware that:

  • Protected/system processes may not reveal command lines
  • Some processes may have already cleared their command line arguments
  • Malware often hides or tampers with this information

Just as you'd query v$session in Oracle or sys.dm_exec_sessions in SQL Server for active queries, the Windows equivalents require either WMI queries (shown above) or API calls through languages like C++ or C#.