例如:如果我跑步notepad.exe c:\autoexec.bat
,
我怎样才能c:\autoexec.bat
在Get-Process notepad
PowerShell中?
或者我怎样才能c:\autoexec.bat
在Process.GetProcessesByName("notepad");
C#中?
在PowerShell中,你可以通过WMI获取进程的命令行:
$process = "notepad.exe"
Get-WmiObject Win32_Process -Filter "name = '$process'" | Select-Object CommandLine
请注意,你需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为普通用户,只有在你自己的上下文中运行的进程才对你可见。
也有一个权限方面。Powershell进程需要具有至少等同于目标进程的权限。因此,常规Powershell会话将无法获取运行提升的进程(例如,管理员)的此类信息。在这种情况下,CommandLine(响应)将为空白。
@CJBS确切地说,您需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为普通用户,只有在您自己的上下文中运行的进程才对您可见。
该值仍然被截断为一定长度的字符。您可以通过将结果传递到“ out-string -Width 2000”或类似的方法来解决该问题。
@mbrownnyc using
-Filter
如果在Get-WmiObject
远程计算机上运行(使用-ComputerName
参数),则会在远程主机上进行过滤,从而减少了通过网络传输的数据量(从而提高了性能)。从远程主机获取所有WMI数据Where-Object
后,在本地使用筛选器。但是,像在这种情况下一样,在本地运行时并没有什么区别。另请注意,该语法仅在PowerShell v3或更高版本中有效。在此之前,您必须使用。Get-WmiObject
where property <op> value
where { $_.property <op> value }
这并不需要花太多时间,但是可以节省一些按键操作,如果您已经有了进程ID(例如查看CPU使用情况等),就可以使用
"processid = 1234"
-我用它来查看哪个网站正在流氓我们的服务器(有200个w3wp.exe
进程)