Remplacer l’utilisateur Windows actuel Exécuter le fichier EXE avec un autre utilisateur

Dites si j’ai construit une application Windows qui lit les fichiers d’un dossier réseau. Les plis du réseau limitent l’access à un seul utilisateur “fooUser”. L’application est installée sur plusieurs machines du réseau.

Je dois remplacer l’utilisateur actuel par “fooUser” afin de pouvoir accéder aux fichiers du dossier réseau à l’aide d’un code.

Voici un schéma d’emprunt d’identité très simple qui vous permettra d’être quiconque pour une période de tir (si vous avez les informations d’identité appropriées)
Cette classe fera tout le gros du travail pour vous ….

public class Impersonator : IDisposable { const int LOGON32_PROVIDER_DEFAULT = 0; const int LOGON32_LOGON_INTERACTIVE = 2; [DllImport("advapi32.dll", SetLastError = true)] public static extern bool LogonUser(Ssortingng lpszUsername, Ssortingng lpszDomain, Ssortingng lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public extern static bool CloseHandle(IntPtr handle); private IntPtr token = IntPtr.Zero; private WindowsImpersonationContext impersonated; private readonly ssortingng _ErrMsg = ""; public bool IsImpersonating { get { return (token != IntPtr.Zero) && (impersonated != null); } } public ssortingng ErrMsg { get { return _ErrMsg; } } [PermissionSetAtsortingbute(SecurityAction.Demand, Name = "FullTrust")] public Impersonator(ssortingng userName, ssortingng password, ssortingng domain) { StopImpersonating(); bool loggedOn = LogonUser(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token); if (!loggedOn) { _ErrMsg = new System.ComponentModel.Win32Exception().Message; return; } WindowsIdentity identity = new WindowsIdentity(token); impersonated = identity.Impersonate(); } private void StopImpersonating() { if (impersonated != null) { impersonated.Undo(); impersonated = null; } if (token != IntPtr.Zero) { CloseHandle(token); token = IntPtr.Zero; } } public void Dispose() { StopImpersonating(); } } 

Et vous pouvez l’utiliser comme ça;

 using (Impersonator = new Impersonator(yourName,yourPassword,yourDomain)) { // Read files from network drives. // Other activities.... } 

Il est très important de placer l’imitateur dans le bloc “utilisation” ou de le supprimer lorsque vous avez terminé vos tâches personnifiées, sinon le système continuera à imiter indéfiniment, ce qui causera toutes sortes de problèmes.

Vous pouvez vérifier si cette question LogonUser et la délégation vous aideraient.

Vous pouvez simplement configurer un lecteur mappé sur le partage de dossier qui utilise les informations d’identification “fooUser”.

Cependant, si vous avez le nom d’utilisateur / mot de passe de l’utilisateur, vous pouvez obtenir que votre code utilise l’emprunt d’identité. Selon ma réponse à l’ emprunt d’identité Windows à partir de C # :

Pour le code d’emprunt d’identité, voir les deux articles suivants sur Code Project:

http://www.codeproject.com/KB/cs/cpimpersonation1.aspx

http://www.codeproject.com/KB/cs/zetaimpersonator.aspx

et l’article de Microsoft KB sur lequel ils sont basés:

http://support.microsoft.com/default.aspx?scid=kb;en-us;Q306158