Changer le WindowsIdentity en cours d’exécution (impersonalisation)…
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,
2,
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
Monday, August 27, 2007 3:09:47 PM (GMT Daylight Time, UTC+01:00)
Securité