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

26

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
Oeil de faucon
la source

Réponses:

35

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é.

Ryan Ries
la source
Je trouve que cela tronque le chemin - y a-t-il un moyen de contourner cela?
Hawkeye
1
@Hawkeye Essayez d'ajouter | FLà la fin de la commande. Cela étend toute la ligne de commande pour moi. Pourrait aussi vouloir jouer avec| Select -ExpandProperty CommandLine
Ryan Ries
Fait intéressant, vous ne pouvez pas obtenir ces informations à partir de l'applet de commande Get-Process native.
Davidw
3
Get-process utilise la classe system.diagnostics.process qui n'a pas cette propriété. L'aide de get-process contient également un exemple d'utilisation de wmi pour obtenir l'objet de processus
Jim B
2
Il convient de noter qu'il n'existe aucun moyen officiellement pris en charge pour obtenir la ligne de commande d'un autre processus. Bien qu'il existe des moyens d'obtenir une chaîne qui pourrait être la ligne de commande, elle n'est pas garantie par le système d'exploitation et le résultat pourrait être "poulet poulet poulet" pour tout ce que vous savez.
Nick
21

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
RobW
la source
1
C'est pratique; vous pouvez le raccourcir un peu avec l' processalias au lieu de path Win32_Process; par exemple, wmic.exe process get
mklement
15

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:

boîte de dialogue des propriétés du processus

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:

boîte de dialogue des propriétés d'événement

Corrodias
la source
10
Ou modifiez simplement les colonnes du Gestionnaire des tâches pour afficher le PID et la "Ligne de commande". Et fait.
Ismael Miguel
@IsmaelMiguel La colonne de ligne de commande du Gestionnaire des tâches tronque les chaînes d'arguments très longues, je ne sais pas si Process Explorer le fait
JG dans SD
@JGinSD Je n'ai jamais vu d'argument tronqué.
Ismael Miguel
1
@IsmaelMiguel On dirait que la limite est d'environ 200 caractères pour la colonne de ligne de commande
JG en SD
1
La limite réelle dans le Gestionnaire des tâches est de 259 caractères. (vérifié sous Windows 10). Le Gestionnaire des tâches a cependant un avantage: il vous montre les lignes de commande des processus d'autres utilisateurs / élevés même s'il s'exécute lui-même sans élévation (pas en tant qu'administrateur). Alors que Process Explorer et Process Monitor n'ont pas la limite de 259 caractères, depuis la version 16.22, ils peuvent se bloquer avec des lignes de commande trop longues si la Command Linecolonne a été ajoutée si vous passez la souris sur cette colonne.
mklement
1

Pour compléter la réponse PowerShell utile de Ryan Ries avec une alternative plus courte via le -Filterparamètre qui utiliseGet-CimInstance également à la place de l' applet de commande obsolète depuis la v3Get-WmiObject .

# 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 -Filterparamètre vous permet essentiellement de passer la WHEREclause d'une instruction WQL au lieu de passer une instruction de requête complète via -Query.

mklement
la source