Bonjour à tous,
Voilà mon problème : j'essai d'élever les droits de ma thread (démarrée dans le contexte d'un compte utilisateur classique), pour cela j'appelle "LogonUser" avec les données d'authentification d'un compte admin puis avec le jeton (token) récupéré j'appelle "ImpersonateLoggedOnUser" pour que ma thread récupère les droits de ce compte.
A priori sur MSDN il est indiqué qu'aucun privilège n'est nécessaire pour appeler "ImpersonateLoggedOnUser", il suffit d'un "primary or impersonnation token", ce que me retourne justement "LogonUser".
Sauf que lors de l'appel à "ImpersonateLoggedOnUser" j'ai un comportement tout à fait inattendu que je ne parviens à expliquer ni à contourner malheureusement...
En effet c'est comme si lors de cet appel ma fonction était interrompue et retournait brutalement à l'appelant sans aucun change de poursuivre l'exécution. J'ai tenté de remplacer mon implémentation en utilisant le couple DuplicateTokenEx/SetThreadToken( nil,... ) à la place de ImpersonateLoggedOnUser mais le résultat est exactement le même lors de l'appel à "SetThreadToken".
Alors là où c'est fort et que cela semble aller à l'encontre même de la sémantique Delphi c'est que dans mon code j'ai ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Result:= GetErrorCode( SafeLogonUser( AnUser, ADomain, MyPassword, LOGON32_PROVIDER_DEFAULT, AdminToken ) ); if ( Result = ERROR_SUCCESS ) then begin try WriteLogToFile( 'C:\test.log', 'avant ImpersonateLoggedOnUser...'+sLineBreak ); Result:= GetErrorCode( ImpersonateLoggedOnUser( DuplicateToken ) ); finally WriteLogToFile( 'C:\test.log', 'après ImpersonateLoggedOnUser...'+sLineBreak ); end; end;
à la fin de l'exécution dans mon fichier log j'ai "'avant ImpersonateLoggedOnUser..." mais jamais "après ImpersonateLoggedOnUser..." !!!
Le traitement se poursuit par contre au niveau de la fonction appelante.. je ne comprends pas, surtout qu'évidemment l'élévation de privilège semble échouer car je me tape un code erreur = ERROR_BAD_IMPERSONATION_LEVEL sur le prochain appel (je crois, en tout cas c'est ce code erreur qui remonte mais vu que le traitement est interrompu je ne pense pas qu'il soit récupéré directement depuis l'appel à "ImpersonateLoggedOnUser").
J'ai trouvé sur Google un occurrence du problème mais avec un autre langage :
http://forums.iis.net/t/1203009.aspx
Quelqu'un peut-il m'expliquer ce phénomène ? Que puis-je faire pour contourner ce problème ?
Partager