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

10 浏览
0 Comments

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

如果我运行notepad.exe c:\\autoexec.bat,\n我如何在PowerShell中的Get-Process notepad中获取c:\\autoexec.bat?\n或者我如何在C#中的Process.GetProcessesByName(\"notepad\");中获取c:\\autoexec.bat

0
0 Comments

问题的出现原因:

这篇文章中的代码是用于在PowerShell中获取进程的命令行信息的。然而,PowerShell本身并没有提供直接获取进程命令行的功能,因此需要使用一些自定义的代码来实现这个功能。

解决方法:

文章中给出了一个解决方法,即在PowerShell的$PROFILE文件中添加一段代码,以扩展Process对象类并使用CommandLine属性来获取进程的命令行信息。代码中使用了不同的平台判断,并根据不同的平台执行相应的命令来获取命令行。其中,对于Windows平台,使用了Get-CimInstance Win32_Process命令来获取命令行;对于Linux/Unix平台,使用了Get-Content命令来获取命令行。

另外,文章还提到了一个注意事项,即在某些情况下,PowerShell已经存在CommandLine属性,因此需要使用Update-TypeData命令时加上-ErrorAction Ignore参数来忽略错误。此外,还可以通过检查属性是否存在来决定是否执行Update-TypeData命令。

最后,文章还给出了一个示例代码,用于演示如何使用上述扩展的Process对象类来查询进程的命令行信息。通过使用get-process命令获取进程对象,并使用select-object命令选择ProcessName和CommandLine属性,就可以获取进程的命令行信息了。

0
0 Comments

问题的出现原因:在使用PowerShell或C#时,需要获取进程的命令行信息,但不清楚如何实现。

解决方法:

1. 首先,需要确保使用的PowerShell版本较新,如果不是最新版本,建议进行更新。

2. 使用Get-CimInstance命令来替代Get-WMIObject命令,以获取进程的信息。Get-CimInstance是Get-WMIObject的替代品,可以提供更好的兼容性和未来的支持。

3. 获取特定进程的命令行信息,可以使用以下命令:

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

注意,使用Get-CimInstance Win32_Process命令时,进程的名称需要包括.exe扩展名,而不同于Get-Process命令。

4. 如果想要使用进程ID来获取命令行信息,可以使用以下命令:

   get-process node | select id,starttime,name,@{Name="CommandLine";Expr={ $filter = "ProcessId = {0}" -f $_.Id; (Get-CimInstance Win32_Process -filter $filter).CommandLine }} | sort starttime | ft -au -wr
   

这个命令将获取名为"node"的进程的ID、启动时间、名称和命令行信息,并按启动时间排序后以表格形式输出。

以上就是在PowerShell或C#中获取进程命令行信息的方法。

0
0 Comments

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

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

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

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

这也涉及到权限方面的问题。PowerShell进程至少需要具有与目标进程相等的权限。因此,一个普通的PowerShell会话无法获取以提升的权限(例如作为管理员)运行的进程的信息。在这种情况下,命令行(响应)将为空。

要确切地说,您需要管理员权限才能访问在另一个用户上下文中运行的进程的信息。作为普通用户,您只能看到在您自己的上下文中运行的进程。

返回的值仍然被截断为一定长度的字符。您可以通过将结果传递给"out-string -Width 2000"或类似的方法来解决这个问题。

只是一个一般的语法注意事项,您也可以使用`| where name -eq $process`而不是`-filter`,在执行之前它们编译的结果是相同的。我更喜欢这种方式,因为它更具扩展性。

使用`-Filter`参数可以在远程主机上进行过滤,如果您使用`-ComputerName`参数在远程计算机上运行`Get-WmiObject`,可以减少通过网络传输的数据量(从而提高性能)。使用`Where-Object`在从远程主机获取所有WMI数据之后在本地进行过滤。但是在本地运行`Get-WmiObject`时,它没有任何区别,就像在这种情况下一样。还要注意,语法`where property value`仅适用于PowerShell v3或更新版本。在此之前,您必须使用`where { $_.property value }`。

为了避免长行截断,您还可以使用`| fl`或`| ft -auto`。

这不需要太多努力就能找到,但为了节省一些按键,如果您已经有了进程ID(例如从查看CPU使用率等),您可以使用`"processid = 1234"`。我使用它来查看在我们的服务器上哪个网站出了问题(有200个`w3wp.exe`进程)。

如果我选择了进程ID而不是命令行,如何将"Selected.System.Management.ManagementObject"类型转换为int32?

这与本问题或答案无关。请提出一个新的问题。

0