Copier le fichier sur un lecteur partagé en réseau

J’ai un lecteur réseau partagé (“\ serveur \ folder”) sur lequel je voudrais copier un fichier. Je peux écrire sur le lecteur avec un utilisateur spécifique (“utilisateur” / “pass”). Comment puis-je accéder au partage partagé avec les privilèges d’écriture en utilisant C #?

    Code non testé, mais il sera similaire à:

    AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); // http://pinvoke.net/default.aspx/advapi32/LogonUser.html IntPtr token; LogonUser("username", "domain", "password", LogonType.LOGON32_LOGON_BATCH, LogonProvider.LOGON32_PROVIDER_DEFAULT); WindowsIdentity identity = new WindowsIdentity(token); WindowsImpersonationContext context = identity.Impersonate(); try { File.Copy(@"c:\temp\MyFile.txt", @"\\server\folder\Myfile.txt", true); } finally { context.Undo(); } 

    Voici un exemple de travail pour les applications ASP.NET. Source primaire

     private void SendToFileShare(byte[] pdfData, ssortingng fileName) { if(pdfData == null) { throw new ArgumentNullException("pdfData"); } if (ssortingng.IsNullOrWhiteSpace(fileName)) { //Assign a unique name because the programmer failed to specify one. fileName = Guid.NewGuid().ToSsortingng(); } else { //Should probably replace special characters (windows filenames) with something. } ssortingng networkShareLocation = @"\\your\network\share\"; var path = $"{networkShareLocation}{fileName}.pdf"; //Credentials for the account that has write-access. Probably best to store these in a web.config file. var domain = "AB"; var userID = "Mr"; var password = "C"; if (ImpersonateUser(domain, userID, password) == true) { //write the PDF to the share: System.IO.File.WriteAllBytes(path, report); undoImpersonation(); } else { //Could not authenticate account. Something is up. //Log or something. } } ///  /// Impersonates the given user during the session. ///  /// The domain. /// Name of the user. /// The password. ///  private bool ImpersonateUser(ssortingng domain, ssortingng userName, ssortingng password) { WindowsIdentity tempWindowsIdentity; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; if (RevertToSelf()) { if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) { if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) { tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); impersonationContext = tempWindowsIdentity.Impersonate(); if (impersonationContext != null) { CloseHandle(token); CloseHandle(tokenDuplicate); return true; } } } } if (token != IntPtr.Zero) CloseHandle(token); if (tokenDuplicate != IntPtr.Zero) CloseHandle(tokenDuplicate); return false; } ///  /// Undoes the current impersonation. ///  private void undoImpersonation() { impersonationContext.Undo(); } #region Impersionation global variables public const int LOGON32_LOGON_INTERACTIVE = 2; public const int LOGON32_PROVIDER_DEFAULT = 0; WindowsImpersonationContext impersonationContext; [DllImport("advapi32.dll")] public static extern int LogonUserA(Ssortingng lpszUserName, Ssortingng lpszDomain, Ssortingng lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken); [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool RevertToSelf(); [DllImport("kernel32.dll", CharSet = CharSet.Auto)] public static extern bool CloseHandle(IntPtr handle); #endregion 

    Créez un utilisateur avec des privilèges pour écrire sur le lecteur réseau et utilisez l’emprunt d’identité dans le c # pour utiliser cet utilisateur lors de l’access au lecteur.