AdjustTokenPrivileges [Résolu]

flyingfish 41 Messages postés jeudi 19 février 2004Date d'inscription 4 août 2006 Dernière intervention - 20 juil. 2006 à 09:29 - Dernière réponse : mpo007 12 Messages postés jeudi 6 juillet 2006Date d'inscription 7 mars 2009 Dernière intervention
- 5 août 2006 à 15:58
Bonjour,

Je dois utiliser la fonction AdjustTokenPrivileges.

Mais qand je l'appelle, j'ai l'erreur 6 :
6, The handle is invalid., ERROR_INVALID_HANDLE

Savez-vous quel HANDLE je dois utiliser ? et comment le récupérer ?

Merci d'avance

Ci-dessous mon code (l'handle est passé en paramètre) :

BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege // to enable or disable privilege
)
{
TOKEN_PRIVILEGES tp;
LUID luid;

if ( !LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid ) ) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %u\n", GetLastError() );
return FALSE;
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

if ( !AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL) )
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

{
printf("The token does not have the specified privilege. \n");
return FALSE;
}

return TRUE;
}

Merci d'avance 

    /\_    /\ 
  /      \/    \
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 20 juil. 2006 à 16:55
3
Merci
Salut,

Pour obtenir ce handle on utilise la fonction OpenProcessToken() comme ceci par exemple:

HANDLE hToken;
OpenProcessToken(GetCurrentProcess(),  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

Sans ce handle, on ne peut pas ajuster les pévilèges de notre processus.

Merci racpp 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de racpp
flyingfish 41 Messages postés jeudi 19 février 2004Date d'inscription 4 août 2006 Dernière intervention - 20 juil. 2006 à 09:31
0
Merci
BOOL SetPrivilege(

HANDLE hToken, // access token handle

LPCTSTR lpszPrivilege, // name of privilege to enable/disable

BOOL bEnablePrivilege // to enable or disable privilege

)

{

TOKEN_PRIVILEGES tp;

LUID luid;


if ( !LookupPrivilegeValue(

NULL, // lookup privilege on local system

lpszPrivilege, // privilege to lookup

&luid ) ) // receives LUID of privilege

{
printf("LookupPrivilegeValue error: %u\n", GetLastError() );

return FALSE;

}


tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

if (bEnablePrivilege)

tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

else

tp.Privileges[0].Attributes = 0;


// Enable the privilege or disable all privileges.


if ( !AdjustTokenPrivileges(

hToken,

FALSE,

&tp,

sizeof(TOKEN_PRIVILEGES),

(PTOKEN_PRIVILEGES) NULL,

(PDWORD) NULL) )

{

printf("AdjustTokenPrivileges error: %u\n", GetLastError() );

return FALSE;

}


if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)


{

printf("The token does not have the specified privilege. \n");

return FALSE;

}


return TRUE;

}
Commenter la réponse de flyingfish
flyingfish 41 Messages postés jeudi 19 février 2004Date d'inscription 4 août 2006 Dernière intervention - 21 juil. 2006 à 08:37
0
Merci
Merci beaucoup !

J'allais poster ma réponse qui est la même ;o) !

J'ai encore une question racpp :
- Est-ce que en ajustant les privileges je peux contourner un problème de sécurité sur un réseau ? Le but de mon programme est de changer le propriétaire d'un fichier.
En local je n'ai pas de problème car je suis Admin de mon poste. Par contre sur le réseau je ne suis que un simple mortel... ni jedi, ni admin... 

Merci

    /\_    /\ 
  /      \/    \
Commenter la réponse de flyingfish
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 21 juil. 2006 à 12:35
0
Merci
Salut,
Pour faire ce genre de choses en réseau, je pense quil faut créer et installer un petit programme serveur qui fait ce travail en local sur l'ordinateur distant. Ce programme serveur communique avec un programme client installé sur ton ordinateur.
Je ne crois pas que le programme serveur aura les privilèges suffisants pour faire ce genre de choses, mais tu peux essayer.
Commenter la réponse de racpp
flyingfish 41 Messages postés jeudi 19 février 2004Date d'inscription 4 août 2006 Dernière intervention - 21 juil. 2006 à 16:42
0
Merci
Effectivement... il n'a pas les privileges suffisant pour le faire.

J'ai donc contourné le problème en créant un exe (mais pas sur le serveur, uniquement en local).
Ensuite mon application lance cet exe avec un autre profil (Admin du réseau) (un peu comme sur un AS/400 ou on peut changer le profile durant un temps donné)

Car je n'ai pas que un serveur, mais une bonne dizaine à attaquer! 

Merci pour votre aide et déjà bon week-end

    /\_    /\ 
  /      \/    \
Commenter la réponse de flyingfish
mpo007 12 Messages postés jeudi 6 juillet 2006Date d'inscription 7 mars 2009 Dernière intervention - 5 août 2006 à 15:58
0
Merci
voici ma fonction je l'ai fait pour donner  à cette même application par son PID le privilege DEBUG :

int max(){
DWORD dwPID;
HANDLE hProcess;
HANDLE hToken;
LUID Luid;
TOKEN_PRIVILEGES tpDebug;
dwPID = GetCurrentProcessId();if ((hProcess OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) NULL) return FALSE;
if (OpenProcessToken(hProcess, TOKEN_ALL_ACCESS, &hToken) == 0) return FALSE;
if ((LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Luid)) == 0) return FALSE;
tpDebug.PrivilegeCount = 1;
tpDebug.Privileges[0].Luid = Luid;
tpDebug.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ((AdjustTokenPrivileges(hToken, FALSE, &tpDebug, sizeof(tpDebug), NULL, NULL)) == 0) return FALSE;
if (GetLastError() != ERROR_SUCCESS) return FALSE;
CloseHandle(hToken);
CloseHandle(hProcess);
return true;
}

ça marche biensûr mais je veux avoir le privilege "SYSTEM" est ce que quelqu'un connais comment faire
SE_DEBUG_NAME c'est pour avoir le droit "DEBUG".
merci d'avance.
Commenter la réponse de mpo007

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.