Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

AdjustTokenPrivileges() ERROR_NOT_ALL_ASSIGNED

4 réponses
Avatar
vb
Bonjour,

J'éssaie de charger une ruche via RegLoadKey(), qui me répond par une
erreur 1314 (ERROR_PRIVILEGE_NOT_HELD). Je tente donc d'activer les
privilèges SE_BACKUP_NAME et SE_RESTORE_NAME en appelant
AdjustTokenPrivileges(), tout cela en mode debug sous VC avec un compte
admin.

m'appel à GetLastError() après cette dernière fonction renvois
systématiquement ERROR_NOT_ALL_ASSIGNED. Je retourne le problème et ne
vois peut-être pas le nez au milieu de la figure...

Voici un ECM:

int _tmain(int argc, _TCHAR* argv[])
{

HANDLE hdl;

OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hdl);
SetPrivilege(hdl,SE_RESTORE_NAME,true);
SetPrivilege(hdl,SE_BACKUP_NAME,true);
CloseHandle(hdl);
...
return 0;
}

SetPrivileges() est directement issue de MSDN
(http://msdn.microsoft.com/en-us/library/aa446619(v=VS.85).aspx). Je
recopie ici le code au cas ou j'aurai commis une typo.

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;
}

4 réponses

Avatar
Christian ASTOR
vb a écrit :

int _tmain(int argc, _TCHAR* argv[])
{

HANDLE hdl;

OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hdl);

SetPrivilege(hdl,SE_RESTORE_NAME,true);
SetPrivilege(hdl,SE_BACKUP_NAME,true);
CloseHandle(hdl);
...
return 0;
}




J'ai testé, ça passe normalement sur mon poste (XP SP3)...
Avatar
vb
Christian ASTOR a utilisé son clavier pour écrire :
vb a écrit :

int _tmain(int argc, _TCHAR* argv[])
{

HANDLE hdl;

OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hdl);

SetPrivilege(hdl,SE_RESTORE_NAME,true);
SetPrivilege(hdl,SE_BACKUP_NAME,true);
CloseHandle(hdl);
...
return 0;
}




J'ai testé, ça passe normalement sur mon poste (XP SP3)...



J'ai testé les binaires (DEBUG) sur un XP SP3 également, ça passe en
effet. Là ou ca ne passe pas, c'est sous Windows 7 64 bits.
Avatar
Christian ASTOR
vb a écrit :

J'ai testé, ça passe normalement sur mon poste (XP SP3)...



J'ai testé les binaires (DEBUG) sur un XP SP3 également, ça passe en
effet. Là ou ca ne passe pas, c'est sous Windows 7 64 bits.



Il y a apparemment une solution avec le Manifest :
http://vctipsplusplus.wordpress.com/2009/10/
Avatar
vb
Il se trouve que Christian ASTOR a formulé :
vb a écrit :

J'ai testé, ça passe normalement sur mon poste (XP SP3)...



J'ai testé les binaires (DEBUG) sur un XP SP3 également, ça passe en
effet. Là ou ca ne passe pas, c'est sous Windows 7 64 bits.



Il y a apparemment une solution avec le Manifest :
http://vctipsplusplus.wordpress.com/2009/10/



Merci pour cette aide.
En revanche, j'avais déjà mis /MANIFESTUAC:NO
/level='requireAdministrator' /uiAccess='true', sans résultat.