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

Poser une question


En fait, je me demande s'il ne va pas falloir passer par un
ZwQuerySystemInformation...
Fred
Il faut en principe faire un SE_DEBUG_NAME auparavant.
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
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
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