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 :(
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
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...
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
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.
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 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
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 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
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
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
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.
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
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
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.
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.
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
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
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
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
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
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...
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...