C# transfer local file to remote server based on File.Copy

using System;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Runtime.InteropServices;using System.Text;using System.Threading.Tasks;namespace TFCP{    /// <summary>    /// Provides access to a network share.    /// </summary>    public class NetworkShareAccesser : IDisposable    {        private string _remoteUncName;        private string _remoteComputerName;        public string RemoteComputerName        {            get            {                return this._remoteComputerName;            }            set            {                this._remoteComputerName = value;                this._remoteUncName = @"\\" + this._remoteComputerName;            }        }        public string UserName        {            get;            set;        }        public string Password        {            get;            set;        }        #region Consts        private const int RESOURCE_CONNECTED = 0x00000001;        private const int RESOURCE_GLOBALNET = 0x00000002;        private const int RESOURCE_REMEMBERED = 0x00000003;        private const int RESOURCETYPE_ANY = 0x00000000;        private const int RESOURCETYPE_DISK = 0x00000001;        private const int RESOURCETYPE_PRINT = 0x00000002;        private const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;        private const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;        private const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;        private const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;        private const int RESOURCEDISPLAYTYPE_FILE = 0x00000004;        private const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;        private const int RESOURCEUSAGE_CONNECTABLE = 0x00000001;        private const int RESOURCEUSAGE_CONTAINER = 0x00000002;        private const int CONNECT_INTERACTIVE = 0x00000008;        private const int CONNECT_PROMPT = 0x00000010;        private const int CONNECT_REDIRECT = 0x00000080;        private const int CONNECT_UPDATE_PROFILE = 0x00000001;        private const int CONNECT_COMMANDLINE = 0x00000800;        private const int CONNECT_CMD_SAVECRED = 0x00001000;        private const int CONNECT_LOCALDRIVE = 0x00000100;        #endregion        #region Errors        private const int NO_ERROR = 0;        private const int ERROR_ACCESS_DENIED = 5;        private const int ERROR_ALREADY_ASSIGNED = 85;        private const int ERROR_BAD_DEVICE = 1200;        private const int ERROR_BAD_NET_NAME = 67;        private const int ERROR_BAD_PROVIDER = 1204;        private const int ERROR_CANCELLED = 1223;        private const int ERROR_EXTENDED_ERROR = 1208;        private const int ERROR_INVALID_ADDRESS = 487;        private const int ERROR_INVALID_PARAMETER = 87;        private const int ERROR_INVALID_PASSWORD = 1216;        private const int ERROR_MORE_DATA = 234;        private const int ERROR_NO_MORE_ITEMS = 259;        private const int ERROR_NO_NET_OR_BAD_PATH = 1203;        private const int ERROR_NO_NETWORK = 1222;        private const int ERROR_BAD_PROFILE = 1206;        private const int ERROR_CANNOT_OPEN_PROFILE = 1205;        private const int ERROR_DEVICE_IN_USE = 2404;        private const int ERROR_NOT_CONNECTED = 2250;        private const int ERROR_OPEN_FILES = 2401;        #endregion        #region PInvoke Signatures        [DllImport("Mpr.dll")]        private static extern int WNetUseConnection(            IntPtr hwndOwner,            NETRESOURCE lpNetResource,            string lpPassword,            string lpUserID,            int dwFlags,            string lpAccessName,            string lpBufferSize,            string lpResult            );        [DllImport("Mpr.dll")]        private static extern int WNetCancelConnection2(            string lpName,            int dwFlags,            bool fForce            );        [StructLayout(LayoutKind.Sequential)]        private class NETRESOURCE        {            public int dwScope = 0;            public int dwType = 0;            public int dwDisplayType = 0;            public int dwUsage = 0;            public string lpLocalName = "";            public string lpRemoteName = "";            public string lpComment = "";            public string lpProvider = "";        }        #endregion        /// <summary>        /// Creates a NetworkShareAccesser for the given computer name. The user will be promted to enter credentials        /// </summary>        /// <param name="remoteComputerName"></param>        /// <returns></returns>        public static NetworkShareAccesser Access(string remoteComputerName)        {            return new NetworkShareAccesser(remoteComputerName);        }        /// <summary>        /// Creates a NetworkShareAccesser for the given computer name using the given domain/computer name, username and password        /// </summary>        /// <param name="remoteComputerName"></param>        /// <param name="domainOrComuterName"></param>        /// <param name="userName"></param>        /// <param name="password"></param>        public static NetworkShareAccesser Access(string remoteComputerName, string domainOrComuterName, string userName, string password)        {            return new NetworkShareAccesser(remoteComputerName,                                            domainOrComuterName + @"\" + userName,                                            password);        }        /// <summary>        /// Creates a NetworkShareAccesser for the given computer name using the given username (format: domainOrComputername\Username) and password        /// </summary>        /// <param name="remoteComputerName"></param>        /// <param name="userName"></param>        /// <param name="password"></param>        public static NetworkShareAccesser Access(string remoteComputerName, string userName, string password)        {            return new NetworkShareAccesser(remoteComputerName,                                            userName,                                            password);        }        private NetworkShareAccesser(string remoteComputerName)        {            RemoteComputerName = remoteComputerName;            this.ConnectToShare(this._remoteUncName, null, null, true);        }        private NetworkShareAccesser(string remoteComputerName, string userName, string password)        {            RemoteComputerName = remoteComputerName;            UserName = userName;            Password = password;            this.ConnectToShare(this._remoteUncName, this.UserName, this.Password, false);        }        private void ConnectToShare(string remoteUnc, string username, string password, bool promptUser)        {            NETRESOURCE nr = new NETRESOURCE            {                dwType = RESOURCETYPE_DISK,                lpRemoteName = remoteUnc            };            int result;            if (promptUser)            {                result = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null);            }            else            {                result = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null);            }            if (result != NO_ERROR)            {                throw new Win32Exception(result);            }        }        private void DisconnectFromShare(string remoteUnc)        {            int result = WNetCancelConnection2(remoteUnc, CONNECT_UPDATE_PROFILE, false);            if (result != NO_ERROR)            {                throw new Win32Exception(result);            }        }        /// <summary>        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.        /// </summary>        /// <filterpriority>2</filterpriority>        public void Dispose()        {            this.DisconnectFromShare(this._remoteUncName);        }    }} static void PathCopyToRemoteDemo()        {             string destFile = @"\\RemotePCName\SharedFile";            string sourceFile = @"C:\myfolder\mytxt.txt";            string fileName = Path.GetFileName(sourceFile);            string remotePCName = "remotePCName";            string remotePCDOMAINName = "remotePCDOMAINName";            string remotePCUserName = "RemotePCPassword";            string remotePCUserPwd = "remotePCUserPwd";            string destFullName = Path.Combine(destFile, fileName);            using (NetworkShareAccesser.Access(remotePCName, remotePCDOMAINName, remotePCUserName, remotePCUserPwd))            {                File.Copy(sourceFile, destFullName);            }        }

based on https://stackoverflow.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials

(0)

相关推荐