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

mepcadol  于 2023-05-29  发布在  Shell
关注(0)|答案(4)|浏览(176)

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

weylhg0b

weylhg0b1#

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

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

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

u3r8eeie

u3r8eeie2#

这个答案是优秀的,但是为了未来,做未来的你一个忙,除非你使用相当旧的powershell(在这种情况下,我建议更新!)Get-WMIObject已被Get-CimInstance Hey Scripting Guy reference取代
试试这个

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

xiozqbni3#

如果将以下代码放入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(https://stackoverflow.com/a/17582576/9156059),2(https://social.technet.microsoft.com/Forums/lync/en-US/5eb197e2-aeeb-4eb6-9e5b-9f90966e5d79/win32process-commandline-returning-blank-while-im-not-an-admin?forum=ITCG)):

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

6tdlim6h4#

我使用的是powershell7.1,这似乎是作为脚本属性内置到process对象中的:

> (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。

相关问题