Problème sur API OpenProcess

Résolu
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 17 août 2006 à 14:56
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 29 août 2006 à 16:16
Violent Ken



Bonjour, je cherche à récupérer des informations sur les processus lancés. J'utilise donc les API Openprocess, EnumProcessModules, GetModulesFileName...
Mais si je peux lister tout les processus actifs, je ne peux récupérer certaines informations de certains processus ; le problème est dû au paramètre numéro 1 de l'API openprocess : j'utilise la constante PROCESS_QUERY_INFORMATION or PROCESS_WM_READ
(Const PROCESS_QUERY_INFORMATION = &h400
Const PROCESS_VM_READ = 16)

Le problème est que je n'ai pas accès à certains processus, comme alg.exe ou certains svchost.exe

La constante PROCESS_ALL_ACCESS ne fonctionne pas non plus, quelle valeur dois-je donner à l'argument de OpenProcess pour pouvoir accéder à tout les processus ?

Merci.

PS: je sais que l'on peut utiliser WMI pour faire la même chose, mais je préfère utiliser des API moins gourmandes en ressources dans mon cas.
PPS : j'ai déjà recherché dans les nombreuses sources existantes, et je n'ai rien trouvé.
A voir également:

8 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
29 août 2006 à 14:55
salut,

Option Explicit

 
'==========================================================================================

'pour le privilège Debug

'==========================================================================================

 
'constantes

'ajustement des privilèges

Private Const TOKEN_ADJUST_PRIVILEGES = &H20

'demande d'infos sur le privilège

Private Const TOKEN_QUERY = &H8

'demande l'autorisation du privilège

Private Const SE_PRIVILEGE_ENABLED = &H2

 
'type de Local Unique ID pour le token

Private Type LUID

    LowPart As Long

    HighPart As Long

End Type

'LUID + attributs

Private Type LUID_AND_ATTRIBUTES

    pLuid As LUID

    Attributes As Long

End Type

'structure de privilèges de token

Private Type TOKEN_PRIVILEGES

    PrivilegeCount As Long

    Privileges(1) As LUID_AND_ATTRIBUTES

End Type

 
'ouvre le token du processus

Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long

'ajuste les privilèges

Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long

'regarde la valeur du privilèges

Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long

 
'renvoie le handle du processus appelant (-1)

Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long

'fermer un handle

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

 
'autorise le privilège SeDebugPrivilege

Public Sub EnableDebug()

    Dim hProc As Long 'handle du processus actuel

    Dim hToken As Long 'handle du token

    Dim mLUID As LUID 'LUID du privilège

    Dim mPriv As TOKEN_PRIVILEGES 'privilèges

    Dim mNewPriv As TOKEN_PRIVILEGES 'nouveaux privilèges

    'renvoie le processus actuel

    hProc = GetCurrentProcess()

    'ouvre le token

    OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken

    'regarde la valeur du privilège

    LookupPrivilegeValue "", "SeDebugPrivilege", mLUID

    'nombre de privilèges

    mPriv.PrivilegeCount = 1

    'attribut ENABLED

    mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

    'LUID de privilège

    mPriv.Privileges(0).pLuid = mLUID

    'ajuste le token

    AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)

    'fermer le handle de token

    CloseHandle hToken

End Sub

ShareVB
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
17 août 2006 à 21:33
salut Ken,

normalement c'est bien PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ

tu es passé aussi par cette source de VBShare ?
++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
22 août 2006 à 11:31
Violent Ken

Salut, et désolé de répondre si tardivement, mais je n'ai accès à Internet que (très) périodiquement en ce moment...
Concernant la source de VBShare, je suis en effet passé dessus. L'argument employé, PROCESS_DUP_HANDLE, ne convient pas non plus (utilisé pour la gestion des handles du process, et pas pour récupérer les infos du process)

Et après réflexion, j'ai essayé tout les arguments rendus possible par le type de variable attendu (j'ai donc fait une boucle incrémentant la valeur de l'argument), et je ne trouve aucune valeur permettant de trouver les infos sur les 2-3 processus manquants. D'ailleurs, toutes les sources présentées sur ce site concernant la récupération d'informations sur les processus par la méthode APIs (openprocess, getmodulefilename...) oublient à chaque fois les mêmes processus. Et d'ailleurs, le gestionnaire de processus de Windows, contenu dans l'executable helpctr.exe (infos systèmes, dans environnement logiciel\taches en cours) a les mêmes absences !

Donc soit l'API ne permet vraiment pas de récupérer les infos souhaitées, soit j'ai un problème spécifique à ma machine (j'ai pourtant les droits d'admin).

Problème entier, donc ? Je vais me rabattre sur WMI pour les processus concernés, mais la méthode est moins intéressante (WMI installé/activé nécessaire et moins rapide)

Merci, @+
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
22 août 2006 à 21:43
salut,
tu ne parles pas de taskmgr.exe ?

de là et des API avec PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ en Admin local sur un XP Pro, j'ai bien alg.exe et svchot.exe ...

bizarre tout çà....
tu es sous quel OS?
tu as essayé le compilé sur un autre poste?

++
<hr size="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 26
23 août 2006 à 21:05
salut,

faut voir du côté des jetons de privilèges et le privilège de déboguage nécessaire pour ouvrir n'importe quel process...EnableTokenPrivilege et SE_DEBUG_NAME...

il se peut qu'il soit par défaut sur certaines versions de Windows ou si la config de sécurité l'active (je ne sais pas bien si c'est possible)...

ShareVB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
28 août 2006 à 20:32
Violent Ken


Désolé de répondre à nouveau si tardivement... mais maintenant j'ai de nouveau accès à Internet de façon permanente.

PCPT ==> Non, je ne parle pas de taskmgr (qui lui, comporte tout les processus), mais de helpctr.exe (puis infos systèmes, environnement logiciel\taches en cours).
Mon OS: XP Edition Familiale SP2, avec les droits d'administrateur. Je n'ai pas (encore) eu l'occasion de compiler sur un autre poste.

ShareVB ==> J'avais en effet crû comprendre (après coup, après mon dernier post) que c'était une histoire de privileges. Mais je n'ai pas réussi à changer quoi que ce soit.
Il faut que je me re-documente sur les APIs AdjustTokenPriviliges et OpenProcessToken maintenant que j'ai à nouveau Internet !

Merci encore, je vous tiens au courant si j'y parviens
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
29 août 2006 à 15:13
Violent Ken

Merci, mais cela ne fonctionne pas....

Ou plutôt, cela ne fonctionne QUE dans l'IDE de Visual Studio (lorsque je lance mon application avec F5) !

Une fois compilé, je n'ai plus les privileges ?!
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
29 août 2006 à 16:16
Violent Ken

Je ne comprend plus.... J'ai créé un nouveau programme, avec uniquement comme fonction de récupérer le path entier des processus en fonction de leur PID...

Résultat sans appel, ta fonction marche parfaitement.

J'ai donc un programme compilé qui marche avec ta fonction, et un autre programme qui ne marche que dans l'IDE Visual Studio...

Comprend rien. Enfin bon, merci !
0
Rejoignez-nous