Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

nom d'un process par les PsAPI

17 réponses
Avatar
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

10 réponses

1 2
Avatar
Fred
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
Avatar
Christian ASTOR
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.
Avatar
Patrick Philippot
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
Avatar
Fred
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
Avatar
Fred
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
Avatar
Patrick Philippot
Fred,

Il me semble que PSAPI.DLL est redistribuable.

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyIDBAED-D122-45CF-9D46-1CAE384097AC

Dans ce cas, la technique du snapshot pourrait être réutilisée sous NT.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Patrick Philippot wrote:
Il me semble que PSAPI.DLL est redistribuable.



Oui, PSAPI.DLL (la version contenue dans le package mentionné ci-dessus)
est redistribuable sur NT.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Patrick Philippot wrote:
Il me semble que PSAPI.DLL est redistribuable.

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyIDBAED-D122-45CF-9D46-1CAE384097AC

Dans ce cas, la technique du snapshot pourrait être réutilisée sous
NT.



N'importe quoi. Digestion difficile. Désolé. Ça ne résout rien du tout.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Question:

Est-ce que l'appli est distribuée en public ou au sein d'une entreprise?
Dans ce dernier cas, si vous maîtrisez l'aspect gestion des
utilisateurs, vous pouvez faire un LogonUser / ImpersonateLoggedOnUser
juste avant OpenProcess (suivi d'un RevertToSelf) afin de faire l'appel
avec les droits adéquats. Il faut bien sûr avoir accès à des
"credentials" d'admin ou avoir créé un compte ayant les droits /
privilèges requis au moment de l'installation.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Fred
Patrick Philippot a écrit :
Question:

Est-ce que l'appli est distribuée en public ou au sein d'une entreprise?
Dans ce dernier cas, si vous maîtrisez l'aspect gestion des
utilisateurs, vous pouvez faire un LogonUser / ImpersonateLoggedOnUser
juste avant OpenProcess (suivi d'un RevertToSelf) afin de faire l'appel
avec les droits adéquats. Il faut bien sûr avoir accès à des
"credentials" d'admin ou avoir créé un compte ayant les droits /
privilèges requis au moment de l'installation.




Je n'ai malheureusement aucun contrôle sur l'authentification des
utilisateurs. Il faut bien, dans mon cas, qu'un utilisateur sans aucun
pouvoir puisse executer mon programme et lister (et nommer, puisque
c'est ce dernier point qui m'interesse) tous les process du système...

Fred
1 2