Privileges:

boumarsel Messages postés 298 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 9 juillet 2008 - 18 oct. 2004 à 04:23
boumarsel Messages postés 298 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 9 juillet 2008 - 19 oct. 2004 à 22:51
je pose bcp de kestions ces derniers jr:)

je veux attribuer deux privileges à mon application (SE_DEBUG_NAME et SE_SHUTDOWN_NAME)

le code qui pose le probleme :
**********
HANDLE hToken;
LUID DebugValue,DebugValue2;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue((LPSTR) NULL, SE_DEBUG_NAME, &DebugValue);
LookupPrivilegeValue((LPSTR) NULL, SE_SHUTDOWN_NAME, &DebugValue2);
tkp.PrivilegeCount = 2;
tkp.Privileges[0].Luid = DebugValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
tkp.Privileges[1].Luid = DebugValue2;
tkp.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,NULL);
CloseHandle(hToken);
***********
le message d'erreur:
'Stack around the variable 'tkp' was corrupted '
le meme message, que se soit en debug ou release, et l'application continue son execution sans probleme quand je clique sur continuer.
***********
pour me débrouiller j'ai changé mon code :

HANDLE hToken;
LUID DebugValue;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);

LookupPrivilegeValue((LPSTR) NULL, SE_DEBUG_NAME, &DebugValue);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = DebugValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,NULL);

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue((LPSTR) NULL, SE_SHUTDOWN_NAME, &DebugValue);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = DebugValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,NULL);

CloseHandle(hToken);
***********
Ce code fonctionne correctement, mais je trouve que c'est bete comme solution,en plus je veux comprendre pourkoi ça n'a pas marché au debut.

merci

3 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
18 oct. 2004 à 05:02
Parce qu'on ne peut ajuster qu'un privilège à la fois, cf WinNT.h :
#define ANYSIZE_ARRAY 1       
typedef struct _TOKEN_PRIVILEGES { // tp  
    DWORD PrivilegeCount; 
    LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; 
} TOKEN_PRIVILEGES; 


#include <windows.h>
#include 

int main(void) {
  HANDLE hToken;
  struct {
    DWORD PrivilegeCount;
    LUID_AND_ATTRIBUTES Privileges[2];
  } tkp;
  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
  LookupPrivilegeValue((LPSTR) NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
  LookupPrivilegeValue((LPSTR) NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[1].Luid);
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  tkp.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED;
  tkp.PrivilegeCount = 2;
  assert(AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,NULL) != 0);
  assert(GetLastError() == ERROR_SUCCESS);
  CloseHandle(hToken);
  return 0;
}


Fonctionne sans déclencher assert, donc devrait aller (pas testé de terminer un process ni de rebooter, je t'en laisse le soin).
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
18 oct. 2004 à 14:14
Je regarde ce code à tête reposée et j'ai deux remarques :
1) pense à fermer le handle sur ton process après avoir ajusté les tokens
2) est-il possible de faire #define ANYSIZE_ARRAY 2 avant windows.h sans tout mettre en l'air ?
0
boumarsel Messages postés 298 Date d'inscription jeudi 12 juin 2003 Statut Membre Dernière intervention 9 juillet 2008 1
19 oct. 2004 à 22:51
En cherchant ANYSIZE_ARRAY dans winnt.h j'ai trouvé qu'elle est utilisée dans d'autres structures, donc vaut mieux la laisser comme elle est.

et pour la premiere solution, ça marche pas aussi car il n'arrive pas à convertir le type de la variable "tkp" en PTOKEN_PRIVILEGES ds la fonction AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,NULL);

donc je pense que je serais obligé d'ajuster les privileges par 2 appels à la fonction "AdjustTokenPrivileges", a moins si tu me propose une autre solution
0
Rejoignez-nous