Par défaut, le WindowsIdentity (system.security.principal) est celui de l’utilisateur logué, et est récupérable en utilisant l’instruction suivante :
WindowsIdentity.GetCurrent()
Dans le cadre d’un projet, j’avais besoin que mon code s’execute temporairement sous une autre identité que celle de l’utilisateur executant l’application. Après quelques recherche, voici les trois étapes a effectuer :
1 - Se loguer avec le nouveau compte
Pour se faire, on va utiliser l’API advapi32, dont voici la signature :
[DllImport("advapi32.dll", SetLastError=true)]public static extern bool LogonUser( string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken );
Le code suivant retourne vrai si le login à réussi. Il retourne surtout le handler du token lié à ce login, que nous utiliserons plus tard.
LogonUser(
« nom d’utilisateur »,
« domaine »,
« mot de passe »,
2,
0,
ref TokenHandler)
2 – Dupliquer le token
A nouveau, il faut utiliser l’API advapi32 :
[DllImport("advapi32.dll", SetLastError=true)]public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, out IntPtr DuplicateTokenHandle);
Le code suivant retourne vrai si la duplication à réussie. Il retourne aussi le token utiliser plus tard afin de créer un nouveau WindowsIdentity.
DuplicateToken(
TokenHandler,
ref pDuplicateTokenHandle);
3 – Créer un nouveau WindowsIdentity
Opération qui est un jeu d’enfant, via le code suitant :
WindowsIdentity newId = new WindowsIdentity(pDuplicateTokenHandle);
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
Dorénavant, WindowsIdentity.GetCurrent() retoune le nouveau WindowsIdentity et le code s’execute avec les droits de celui-ci. Pour revenir à l’état avant impersonalisation, il suffit d’utiliser la méthode Undo de WindowsImpersonationContext
© Copyright 2010 Stéphane Schwartz Theme Design by Bryan Bell newtelligence dasBlog 2.3.9074.18820 | Page rendered at Tuesday, September 07, 2010 11:07:56 PM (GMT Daylight Time, UTC+01:00) Pick a theme: BlogXP business calmBlue Candid Blue dasBlog dasblogger dasblueblog dasEmerald DirectionalRedux Discreet Blog Blue Elegante essence Just Html MadsSimple Mobile Mono Movable Radio Blue Movable Radio Heat nautica022 orangeCream Portal Project84 Project84Grass Slate Sound Waves Tricoleur useit.com Voidclass2