如何在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中,您可以通过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。