如何在PowerShell或C#中获取进程的命令行信息

本文关键字:取进程 获取 命令行 信息 PowerShell | 更新日期: 2023-09-27 18:21:41

例如:如果我运行notepad.exe c:'autoexec.bat

如何在PowerShell中的Get-Process notepad中获取c:'autoexec.bat

或者如何在C#中的Process.GetProcessesByName("notepad");中获取c:'autoexec.bat

如何在PowerShell或C#中获取进程的命令行信息

在PowerShell中,您可以通过WMI获取进程的命令行:

$process = "notepad.exe"
Get-WmiObject Win32_Process -Filter "name = '$process'" | Select-Object CommandLine

请注意,您需要管理员权限才能访问有关在另一个用户上下文中运行的进程的信息。作为一个普通用户,它只对在您自己的上下文中运行的进程可见。

这个答案很好,但对于未来的探索和帮助未来的你来说,除非你使用的是非常旧的powershell(在这种情况下,我建议更新!)Get-WMIObject已经被Get-CimInstance Hey Scripting Guy引用取代

试试这个

$process = "notepad.exe"
Get-CimInstance Win32_Process -Filter "name = '$process'" | select CommandLine 

如果在powershell $PROFILE文件中放入以下代码,则可以永久扩展Process对象类并使用CommandLine属性:

$TypeData = @{
    TypeName   = [System.Diagnostics.Process].ToString()
    MemberType = [System.Management.Automation.PSMemberTypes]::ScriptProperty
    MemberName = 'CommandLine'
    Value = {
        if (('Win32NT' -eq [System.Environment]::OSVersion.Platform)) { # it's windows
            (Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine
        } elseif (('Unix' -eq [System.Environment]::OSVersion.Platform)) { # it's linux/unix
            Get-Content -LiteralPath "/proc/$($this.Id)/cmdline"
        } elseif (('MacOSX' -eq [System.Environment]::OSVersion.Platform)) { # it's macos
            # ???
        }
    }
}
Update-TypeData @TypeData -ErrorAction Ignore

注意:Update-TypeData是用-ErrorAction Ignore调用的,因为在pwsh中(至少在7.3.4版本上),CommandLine已经存在;-EA Ignore抑制错误。作为替代方案,您可以检查属性是否存在,并仅在缺少属性的情况下执行Update-TypeData

用作值的脚本块取自pwsh 7.3.4内部实际使用的内容,也适用于Windows Powershell(其中不存在$IsWindows等)。

您可以通过在pwsh 7.3.4:(([System.Diagnostics.Process]@{}) | gm | ? { $_.Name -ieq 'commandline' }) | select -expand Definition中运行以下命令来获取脚本块中的代码。

然后,您可以可靠地查询命令行(iif您拥有正确的权限,对于查询的进程,请参阅[1],[2]):

get-process notepad.exe | select-object ProcessName, CommandLine

我使用的是powershell 7.1,这似乎是作为脚本属性内置到流程对象中的:

> (Get-Process notepad)[0].CommandLine
"C:'WINDOWS'system32'notepad.exe"

有趣的是,您可以查看它的实现,并看到它部分使用了来自PsychoData:的答案

($process | Get-Member -Name CommandLine).Definition
System.Object CommandLine {get=
                        if ($IsWindows) {
                            (Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine
                        } elseif ($IsLinux) {
                            Get-Content -LiteralPath "/proc/$($this.Id)/cmdline"
                        }
                    ;}

在进程上运行Get Member表明它是System.Diagnostics.process的一个实例,但它有几个脚本化的属性。

其他属性包括FileVersion、Path、Product和ProductVersion。