Problème sur API OpenProcess [Résolu]

violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention - 17 août 2006 à 14:56 - Dernière réponse : violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention
- 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é.
Afficher la suite 

8 réponses

Répondre au sujet
ShareVB 2717 Messages postés vendredi 28 juin 2002Date d'inscription 13 janvier 2016 Dernière intervention - 29 août 2006 à 14:55
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ShareVB
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 17 août 2006 à 21:33
0
Utile
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
Commenter la réponse de PCPT
violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention - 22 août 2006 à 11:31
0
Utile
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, @+
Commenter la réponse de violent_ken
PCPT 13368 Messages postés lundi 13 décembre 2004Date d'inscription 3 février 2018 Dernière intervention - 22 août 2006 à 21:43
0
Utile
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
Commenter la réponse de PCPT
ShareVB 2717 Messages postés vendredi 28 juin 2002Date d'inscription 13 janvier 2016 Dernière intervention - 23 août 2006 à 21:05
0
Utile
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
Commenter la réponse de ShareVB
violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention - 28 août 2006 à 20:32
0
Utile
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
Commenter la réponse de violent_ken
violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention - 29 août 2006 à 15:13
0
Utile
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 ?!
Commenter la réponse de violent_ken
violent_ken 1822 Messages postés mardi 31 mai 2005Date d'inscription 26 octobre 2010 Dernière intervention - 29 août 2006 à 16:16
0
Utile
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 !
Commenter la réponse de violent_ken

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.