GNT sans publicité, site mobile, fonctionnalitées exclusives...

nom d'un process par les PsAPI

Le
Fred
Bonjour à tous,

J'aurais aimé savoir s'il y avait un moyen, qui fonctionne aussi bien
sur NT 4.0 que sur XP, 2000, 2003 (donc pas la ToolHelp library), de
réccupérer le nom d'un process à partir de son PID?

J'ai bien réccupéré un bout de code qui fait ça, mais si l'utilisateur
qui l'exécute n'est pas administrateur, alors certains process ne sont
pas accéssibles (comme Winlogon par exemple).

Le code en question fait un OpenProcess avec les flags
PROCESS_QUERY_INFORMATION et PROCESS_VM_READ avant de faire un
EnumProcessModules suivi d'un GetModuleFileNameEx.
Ce qui ne marche pas pour un utilisateur lamba (enfin pas sur tous les
process), c'est le PROCESS_VM_READ.

Je me dit qu'il doit quand même bien y avoir moyen de réccupérer une
info aussi idiote que le nom du process même quand l'utilisateur n'a
pas de préivilèges particulier non?
Ce qui me fait penser ça, c'est que l'outil Process Explorer (pris sur
sysinternals) y arrive bien lui je dois passer à côté de quelque chose :(

Merci d'avance

Fred
Lire les 17 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred
Le #9807271
Fred a écrit :
Bonjour à tous,

J'aurais aimé savoir s'il y avait un moyen, qui fonctionne aussi bien
sur NT 4.0 que sur XP, 2000, 2003 (donc pas la ToolHelp library), de
réccupérer le nom d'un process à partir de son PID?

J'ai bien réccupéré un bout de code qui fait ça, mais si l'utilisateur
qui l'exécute n'est pas administrateur, alors certains process ne sont
pas accéssibles (comme Winlogon par exemple).

Le code en question fait un OpenProcess avec les flags
PROCESS_QUERY_INFORMATION et PROCESS_VM_READ avant de faire un
EnumProcessModules suivi d'un GetModuleFileNameEx.
Ce qui ne marche pas pour un utilisateur lamba (enfin pas sur tous les
process), c'est le PROCESS_VM_READ.

Je me dit qu'il doit quand même bien y avoir moyen de réccupérer une
info aussi idiote que le nom du process... même quand l'utilisateur n'a
pas de préivilèges particulier... non?
Ce qui me fait penser ça, c'est que l'outil Process Explorer (pris sur
sysinternals) y arrive bien lui... je dois passer à côté de quelque
chose :(

Merci d'avance...

Fred



En fait, je me demande s'il ne va pas falloir passer par un
ZwQuerySystemInformation...

Fred
Christian ASTOR
Le #9807251
Fred wrote:

Le code en question fait un OpenProcess avec les flags
PROCESS_QUERY_INFORMATION et PROCESS_VM_READ avant de faire un
EnumProcessModules suivi d'un GetModuleFileNameEx.
Ce qui ne marche pas pour un utilisateur lamba (enfin pas sur tous les
process), c'est le PROCESS_VM_READ.



Il faut en principe faire un SE_DEBUG_NAME auparavant.
Patrick Philippot
Le #9807051
Fred wrote:
Je me dit qu'il doit quand même bien y avoir moyen de réccupérer une
info aussi idiote que le nom du process... même quand l'utilisateur
n'a pas de préivilèges particulier... non?



Bonjour,

Voilà une fonction Delphi que j'utilise dans un de mes programmes
(désolé, je n'ai pas l'équivalent en C sous la main). Cette fonction
donne le bon résultat même si l'utilisateur n'est pas un admin:

function GetProcessIdExeName(const ProcessId: DWORD): String;

type
PDWORDArray = ^TDWORDArray;
TDWORDArray = array[0..(MaxInt div SizeOf(DWORD)) - 1] of DWORD;

var
Handle: THandle;
Snapshot: THandle;
ProcessEntry: TProcessEntry32;
Buffer: array[0..MAX_PATH - 1] of Char;

begin
Result := '';
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
Handle := OpenProcess(
PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessId);
if Handle <> 0 then
try
if GetModuleBaseName(Handle, 0, Buffer, SizeOf(Buffer)) > 0 then
SetString(Result, Buffer, GetModuleFileNameEx(Handle, 0, Buffer,
SizeOf(Buffer)));
finally
CloseHandle(Handle);
end;
end else begin
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
ProcessEntry.dwSize := SizeOf(ProcessEntry);
if Process32First(Snapshot, ProcessEntry) then
repeat
if ProcessEntry.th32ProcessID = ProcessId then
begin
Result := ProcessEntry.szExeFile;
Break;
end;
until not Process32Next(Snapshot, ProcessEntry);
finally
CloseHandle(Snapshot);
end;
end;
end;

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Fred
Le #9807041
Patrick Philippot a écrit :
Fred wrote:

Je me dit qu'il doit quand même bien y avoir moyen de réccupérer une
info aussi idiote que le nom du process... même quand l'utilisateur
n'a pas de préivilèges particulier... non?




Bonjour,

Voilà une fonction Delphi que j'utilise dans un de mes programmes
(désolé, je n'ai pas l'équivalent en C sous la main). Cette fonction
donne le bon résultat même si l'utilisateur n'est pas un admin:

function GetProcessIdExeName(const ProcessId: DWORD): String;

type
PDWORDArray = ^TDWORDArray;
TDWORDArray = array[0..(MaxInt div SizeOf(DWORD)) - 1] of DWORD;

var
Handle: THandle;
Snapshot: THandle;
ProcessEntry: TProcessEntry32;
Buffer: array[0..MAX_PATH - 1] of Char;

begin
Result := '';
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
Handle := OpenProcess(
PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, ProcessId);
if Handle <> 0 then
try
if GetModuleBaseName(Handle, 0, Buffer, SizeOf(Buffer)) > 0 then
SetString(Result, Buffer, GetModuleFileNameEx(Handle, 0, Buffer,
SizeOf(Buffer)));
finally
CloseHandle(Handle);
end;
end else begin
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
ProcessEntry.dwSize := SizeOf(ProcessEntry);
if Process32First(Snapshot, ProcessEntry) then
repeat
if ProcessEntry.th32ProcessID = ProcessId then
begin
Result := ProcessEntry.szExeFile;
Break;
end;
until not Process32Next(Snapshot, ProcessEntry);
finally
CloseHandle(Snapshot);
end;
end;
end;




Ca doit marcher en effet à partir de 2000.
Parceque, sur mon NT 4.0, si l'utilisateur n'est pas admin, il n'a les
privileges SE_DEBUG_NAME et n'a pas le droit de l'activer (donc il ne
peut pas faire de OpenProcess avec PROCESS_VM_READ). Et la ToolHelp
(utilisation des SnapShots) n'existe pas sur NT 4.

Fred
Fred
Le #9807031
Christian ASTOR a écrit :
Fred wrote:

Le code en question fait un OpenProcess avec les flags
PROCESS_QUERY_INFORMATION et PROCESS_VM_READ avant de faire un
EnumProcessModules suivi d'un GetModuleFileNameEx.
Ce qui ne marche pas pour un utilisateur lamba (enfin pas sur tous les
process), c'est le PROCESS_VM_READ.




Il faut en principe faire un SE_DEBUG_NAME auparavant.



Le problème, c'est que si l'utilisateur n'est pas admin, il n'a pas le
droit d'activer ce privilège.

Fred
Publicité
Suivre les réponses
Poster une réponse
Anonyme