web-dev-qa-db-fra.com

Étant donné un PID sous Windows - comment trouver l'instruction de ligne de commande qui l'a exécuté?

Sur une base de données, je peux obtenir une liste de tous les processus en cours d'exécution et la commande sql qui les a lancés.

Je voudrais faire une chose similaire sur une boîte Windows.

Je peux obtenir la liste des processus, mais pas la ligne de commande qui les a lancés.

Ma question est: Étant donné un PID sous Windows - comment trouver l'instruction de ligne de commande qui l'a exécuté?

Hypothèses:

  • Windows 7 et serveurs équivalents
27
Hawkeye

Powershell et WMI.

Get-WmiObject Win32_Process | Select ProcessId,CommandLine

Ou

Get-WmiObject -Query "SELECT CommandLine FROM Win32_Process WHERE ProcessID = 3352"

Notez que vous devez avoir des autorisations pour accéder à ces informations sur un processus. Vous devrez donc peut-être exécuter la commande en tant qu'administrateur si le processus que vous souhaitez connaître s'exécute dans un contexte privilégié.

37
Ryan Ries

Vous pouvez utiliser le sous-système WMI à l'aide de WMIC.EXE pour accéder à ces informations. En supposant un PID de 600:

wmic.exe path Win32_Process where handle='600' get name, commandline  /format:list

Vous pouvez également rechercher un nom ou une autre caractéristique du processus. Utilisez cette commande pour répertorier tous les attributs:

wmic.exe path Win32_Process get  /format:list
21
RobW

Les autres réponses sont certainement de bonnes options qui vous serviront bien dans un système automatisé en raison de leur nature en ligne de commande (et je vois sur l'étiquette que c'est ce que vous vouliez). Bien sûr, certaines personnes pourraient vouloir explorer ce type d'informations avec une interface graphique, voici donc une alternative dans ce sens.

Process Explorer est un outil Sysinternals géré par Microsoft. Il peut afficher la ligne de commande du processus dans la boîte de dialogue des propriétés du processus ainsi que le parent qui l'a lancé, bien que le nom de ce processus ne soit plus disponible. Voici la boîte de dialogue des propriétés du processus:

process properties dialog

Si vous souhaitez une piste d'audit plus détaillée du moment où un processus a été lancé et dans quelles conditions, vous pouvez vous tourner vers un autre outil Sysinternals appelé Process Monitor. Ici, vous pouvez filtrer les événements "Processus démarré", en savoir plus sur l'environnement dans lequel le processus a été lancé et voir quels autres événements se sont produits à cette époque. C'est un programme assez puissant. Voici la boîte de dialogue des propriétés de l'événement:

event properties dialog

16
Corrodias

Pour compléter réponse PowerShell utile de Ryan Ries avec une alternative plus courte via le -Filter paramètre qui également utilise Get-CimInstance au lieu de obsolète depuis la v3 Get-WmiObject applet de commande .

# Target a process by its PID (process ID) and report its command line, 
# using the PowerShell session's own PID as an example ($PID).
(Get-CimInstance Win32_Process -Filter "ProcessId=$PID").CommandLine

# Alternatively, target process(es) by name (may return multiple processes), 
# using Notepad.exe as an example.
# Select-Object is used to report both the PID and the command line.
Get-CimInstance Win32_Process -Filter "Name='Notepad.exe'" |
  Select-Object ProcessId, CommandLine

Le -Filter Le paramètre vous permet essentiellement de passer la clause WHERE d'une instruction WQL au lieu de passer une instruction de requête complète via -Query.

1
mklement