Privileges et processus

Signaler
Messages postés
1812
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
26 octobre 2010
-
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
-
Violent Ken

Bonjour à tous, et désolé de créer un nouveau thread sur le même (ou à peu près) sujet, mais comme j'ai à nouveau accès en permance à Internet, je "remonte" ce topic ; je pourrais y répondre immédiatement.

Enfin bref, je cherchais en fait à obtenir diverses informations sur les processus qui tournaient sur mon PC. Dans mon programme, en utilisant les APIs OpenProcess, ProcessFirst, ProcessNext, CreateToolHelpSnapshot, GetModuleFileNames, EnumProcessModules, GetProcessTimes...etc, je suis censé récupérer toutes les informations possibles sur mes processus. Mais voilà, sur certains processus tout va bien, mais sur d'autres (alg.exe, crss.exe, certaines instances de svchost.exe) impossible de récupérer autres chose que le nom du processus (exemple:alg.exe) et son pid (exemple:1345). Il manque donc : path complet du fichier, infos sur la mémoire utilisée, infos sur la charge CPU...etc.
Le problème vient du fait que l'argument utilisé dans OpenProcess (Desire Access) ne cible pas tout les processus. J'ai utilisée PROCESS_VM_READ Or PROCESS_QUERY_INFORMATION=1040. On m'a déjà certifié que c'était la constante correcte. Problème, j'ai bien tout les droits d'admin (XP familiale SP2), mais impossible de récupérer ce que je désire. On m'a aiguillé sur le fait qu'il fallait donner les droits (privileges) nécessaires à mon application, ce que j'ai tenté de faire avec les APIs OpenProcessToken, AdjustTokenPrivileges...


Voici le code que j'ai utilisé. Il est probablement érroné (première fois que j'utilise ces APIs), mais il m'a donné des résultats (voir plus bas)


'je ne donne pas les valeurs des constantes utilisées ci dessous, elles sont déclarées ailleurs
Public Function OpenProcessWithPrivileges(ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
'ouvre un processus avec tout les privileges

Dim lhTokenHandle As Long, tLuid As LUID, tTokenPriv As TOKEN_PRIVILEGES, tTokenPrivNew As TOKEN_PRIVILEGES, lBufferNeeded As Long


'change les droits de cette application
OpenProcessToken GetCurrentProcess(), TOKEN_ALL_ACCESS, lhTokenHandle
LookupPrivilegeValue "", SE_DEBUG_NAME, tLuid
'détermine le nombre de privileges à changer
tTokenPriv.PrivilegeCount = 1
tTokenPriv.TheLuid = tLuid
tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED
'autorise le privilege SE_DEBUG_NAME
AdjustTokenPrivileges lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded


OpenProcessWithPrivileges = OpenProcess(PROCESS_ALL_ACCESS, bInheritHandle, dwProcId)
End Function


J'ai ensuite remplacé dans mon code OpenProcess par OpenProcessWithPrivileges. J'ai obtenu ce que je voulais, mais uniquement dans l'IDE de Visual Studio (lors de lexécution avec F5) : une fois compilé, çà ne fonctionne plus, je n'ai à nouveau plus les droits.
Après redémarrage, c'est maintenant taskmgr qui a tout les droits (réussi à killer crss, alg, svchost...) ? Comment cela se fait-il ??


Ce serait vraiment cool si vous pouviez me détailler comment REELLEMENT donner les droits à mon application, parce que les résultats que j'ai obtenus sont mauvais.
Merci d'avance, et déjà merci à PCPT et ShareVB pour leurs réponses sur mon premier topic.
@+

1 réponse

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
salut,

euh, pour moi, le processus est simple :
-> vérifier que ton compte appartient au groupe Administrateur : outils d'administration/gestion de l'ordinateur
-> utiliser AdjustTokenPrivileges une fois au début du programme...(voir mon code PEB par exemple...)
-> le reste du code s'exécute alors avec les privilèges SE_DEBUG...

et normalement ca doit marcher...du moins chez moi le code PEB marche en IDE et hors IDE

P.S. : si tu as killé csrss, tu as killé Windows... lol...

ShareVB