Emprunt d’identitié

Pour une fois, parlons un peu technique (J’suis pas développeur pour rien !) 😀

Je cherche a écrire / modifier des fichiers en empruntant l’identité d’un autre compte utilisateur de mon poste. Le Framework .Net actuel ne semble pas me permettre de faire de l’emprunt d’identité mis à part lancer un processus sous l’identité d’un autre compte (Cf. une des surcharges de la fonction Processs.Start()) – Mais ça j’aimerais l’éviter surtout si je dois également manipuler des fichiers sous mon compte actuel…

En creusant un peu sur le net, on s’aperçoit que l’opération est possible moyennant l’utilisation de l’API advapi32.dll. Le principe est simple, il suffit d’appeler la fonction « LogonUser » avec les paramètres adéquats. Cette fonction permet de récupérer un jeton d’identité d’une autre personne sur le système. Le Framework .Net nous permet alors d’emprunter cette identité en appelant la méthode statique WindowsIdentity.Impersonate().

En fait, le plus complexe est la gestion des erreurs avec l’Interop. Là encore, avec un peu de pratique, il n’y a rien de sorcier. La MSDN décrit très bien la fonction LoginUser de l’API advapi32.dll : http://msdn.microsoft.com/en-us/library/aa378184%28v=vs.85%29.aspx. Il n’y a donc qu’à utiliser les bons types de données et savoir comment récupérer les erreurs. Ce point fera l’objet d’un autre sujet sur l’interopérabilité C/C#.

Vous trouverez ici le code source d’un exemple concret.