Impersonation : executer un bout de code avec les droits d'un autre utilisateur

Contenu du snippet

Mise en pratique :
J'ai un gros problème, je voudrais par l'intermédiaire d'une page web créer une tâche planifiée. J'aimerai bine que le compte ASP.net ait les droit d'accès au répertoire C:\WINDOWS\Tasks\ mais apparemment ça ne semble pas jouable pour ce répertoire.

La solution ? Utiliser l'impersonation d'asp.net, c'est à dire qu'une portion de code va être executée sous une autre identité.
Pour cela il va par contre falloir passer par une API mais rien de grâve dans l'ensemble !

Note : Bien entendu, il vous faudra le LOGIN + MOT DE PASSE + DOMAINE de l'utilisateur sus-nommé ^^

Source / Exemple :


[DllImport("advapi32.dll", SetLastError=true)]
public extern static bool LogonUser(String lpszUsername, String
lpszDomain,
String lpszPassword, int dwLogonType,
int dwLogonProvider, ref IntPtr phToken);

public void Impersonate()
{

	const int LOGON32_LOGON_INTERACTIVE = 2;
	const int LOGON32_LOGON_NETWORK = 3;
	
	const int LOGON32_PROVIDER_DEFAULT = 0;
	const int LOGON32_PROVIDER_WINNT35 = 1;
	const int LOGON32_PROVIDER_WINNT40 = 2;	
	const int LOGON32_PROVIDER_WINNT50 = 3;
	

	  IntPtr UserToken = new IntPtr(0);
	  bool loggedOn;

	  try
	  {
	  	//tente de logger l'utilisateur
		loggedOn = LogonUser(
		     "LOGIN",
		     "DOMAINE",//Dns.GetHostName(),
		      MOT DE PASSE",
		      LOGON32_LOGON_NETWORK,
		      LOGON32_PROVIDER_DEFAULT, 
		      ref UserToken);
	  }
	  catch(Exception ex)
	  {
		throw ex;
	  }

	  if(loggedOn) //logging ok ?
	  {
	  	//renvoi identité ASP_NET
		WindowsIdentity ident_here1 = WindowsIdentity.GetCurrent();
		
		
		WindowsIdentity SystemMonitorUser = new WindowsIdentity(UserToken);
		
		//Changement d'utilisateur ici
		WindowsImpersonationContext ImpersonatedUser =SystemMonitorUser.Impersonate();

		//ridentité nouvel User
		WindowsIdentity ident_here2 = WindowsIdentity.GetCurrent();

		/************************************************
		*
		*

  • EXECUTER LE CODE ICI
* *
                                                                                                • /
ImpersonatedUser.Undo(); } }

Conclusion :


N'oubliez pas le "using System.Runtime.InteropServices;"

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.