89 votes

Comment obtenir des informations sur la ligne de commande d'un processus en PowerShell ou en C# ?

Par exemple, si je lance notepad.exe c:\autoexec.bat ,

Comment puis-je obtenir c:\autoexec.bat en Get-Process notepad dans PowerShell ?

Ou comment puis-je obtenir c:\autoexec.bat en Process.GetProcessesByName("notepad"); en C# ?

147voto

Ansgar Wiechers Points 38466

Dans PowerShell, vous pouvez obtenir la ligne de commande d'un processus via WMI :

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

Notez que vous devez disposer des privilèges d'administrateur pour pouvoir accéder à ces informations sur les processus s'exécutant dans le contexte d'un autre utilisateur. En tant qu'utilisateur normal, vous n'avez accès qu'aux processus s'exécutant dans votre propre contexte.

51voto

PsychoData Points 255

Cette réponse est excellente, cependant, pour des raisons de sécurité et pour vous rendre service à l'avenir, à moins que vous n'utilisiez un vieux powershell (dans ce cas, je recommande une mise à jour !) Get-WMIObject a été remplacé par Get-CimInstance. Hey référence Scripting Guy

Essayez ceci

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

9voto

Marty Points 116

Si vous mettez le code suivant dans votre fichier powershell $profile, vous pouvez étendre de façon permanente la classe d'objets "process" et utiliser la propriété "CommandLine".

exemple :

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

code :

$TypeData = @{
    TypeName = 'System.Diagnostics.Process'
    MemberType = 'ScriptProperty'
    MemberName = 'CommandLine'
    Value = {(Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine}
}
Update-TypeData @TypeData

8voto

J'utilise powershell 7.1 et cela semble être intégré dans l'objet processus maintenant comme une propriété scriptée :

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

Il est intéressant de noter que vous pouvez visualiser son implémentation et voir qu'elle utilise partiellement la réponse de 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"
                        }
                    ;}

L'exécution de Get-Member sur un processus montre qu'il s'agit d'une instance de System.Diagnostics.Process mais qu'il a plusieurs propriétés qui sont scriptés.

Les autres propriétés sont FileVersion, Path, Product, et ProductVersion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X