Source: https://stackoverflow.com/a/14870774
Note:
The share path must NOT end with a \ (backslash)
or it will result in the exception: The network path was not found
public static class NetworkShareConsts { public const int RESOURCE_CONNECTED = 0x00000001; public const int RESOURCE_GLOBALNET = 0x00000002; public const int RESOURCE_REMEMBERED = 0x00000003; public const int RESOURCETYPE_ANY = 0x00000000; public const int RESOURCETYPE_DISK = 0x00000001; public const int RESOURCETYPE_PRINT = 0x00000002; public const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000; public const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001; public const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002; public const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003; public const int RESOURCEDISPLAYTYPE_FILE = 0x00000004; public const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005; public const int RESOURCEUSAGE_CONNECTABLE = 0x00000001; public const int RESOURCEUSAGE_CONTAINER = 0x00000002; public const int CONNECT_INTERACTIVE = 0x00000008; public const int CONNECT_PROMPT = 0x00000010; public const int CONNECT_REDIRECT = 0x00000080; public const int CONNECT_UPDATE_PROFILE = 0x00000001; public const int CONNECT_COMMANDLINE = 0x00000800; public const int CONNECT_CMD_SAVECRED = 0x00001000; public const int CONNECT_LOCALDRIVE = 0x00000100; /// Errors public const int NO_ERROR = 0; public const int ERROR_ACCESS_DENIED = 5; public const int ERROR_ALREADY_ASSIGNED = 85; public const int ERROR_BAD_DEVICE = 1200; public const int ERROR_BAD_NET_NAME = 67; public const int ERROR_BAD_PROVIDER = 1204; public const int ERROR_CANCELLED = 1223; public const int ERROR_EXTENDED_ERROR = 1208; public const int ERROR_INVALID_ADDRESS = 487; public const int ERROR_INVALID_PARAMETER = 87; public const int ERROR_INVALID_PASSWORD = 1216; public const int ERROR_MORE_DATA = 234; public const int ERROR_NO_MORE_ITEMS = 259; public const int ERROR_NO_NET_OR_BAD_PATH = 1203; public const int ERROR_NO_NETWORK = 1222; public const int ERROR_BAD_PROFILE = 1206; public const int ERROR_CANNOT_OPEN_PROFILE = 1205; public const int ERROR_DEVICE_IN_USE = 2404; public const int ERROR_NOT_CONNECTED = 2250; public const int ERROR_OPEN_FILES = 2401; }
public class NetworkShareConnection : IDisposable { public string UncPath { get; private set; } public string UserName { get; private set; } public string Password { get; private set; } #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 public NetworkShareConnection(string uncPath, string userName, string password) { UncPath = uncPath; UserName = userName; Password = password; ConnectToShare(UncPath, UserName, Password, false); } private void ConnectToShare(string remoteUnc, string username, string password, bool promptUser) { NETRESOURCE nr = new NETRESOURCE { dwType = NetworkShareConsts.RESOURCETYPE_DISK, lpRemoteName = remoteUnc }; int result; if (promptUser) { result = WNetUseConnection(IntPtr.Zero, nr, "", "", NetworkShareConsts.CONNECT_INTERACTIVE | NetworkShareConsts.CONNECT_PROMPT, null, null, null); } else { result = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null); } if (result != NetworkShareConsts.NO_ERROR) { throw new Win32Exception(result); } } private void DisconnectFromShare(string remoteUnc) { int result = WNetCancelConnection2(remoteUnc, NetworkShareConsts.CONNECT_UPDATE_PROFILE, false); if (result != NetworkShareConsts.NO_ERROR) { throw new Win32Exception(result); } } public void Dispose() { DisconnectFromShare(UncPath); } }
Example:
public string GetNetworkShare(string networkPath) { var regEx = new Regex(@"(\\\\.*?\\[^\\]*)"); return regEx.Match(networkPath)?.Groups[0]?.Value; } var networkPath = @"\\192.168.0.10\C$\test"; var filePath = Path.Combine(networkPath, fileName); using (new NetworkShareConnection(GetNetworkShare(networkPath), userName, password)) { if (!Directory.Exists(networkPath)) Directory.CreateDirectory(networkPath); using (var fs = File.OpenWrite(filePath)) { data.CopyTo(fs); } }
316400cookie-checkC# Access a (untrusted) network share