In Windows, network drive ing can be added to address ing on the network to a local disk (such as a Z: disk). You can click "ing network drive" in the resource manager or enter the subst command under cmd to perform operations; this is very useful in many cases. For example, programs need to access images and documents stored on file servers by other vendors, at this time, through network ing, you can access files in other locations on the network just like local files in the program, and some programs also simplify programming.
But in ASP. NET Running on IIS, the account running is the permission of network service or authenticated users, which leads to no permission to access the mapped drive. The following code will cause the FileNotFound exception.
System.Drawing.Image image = System.Drawing.Image.FromFile("Z://1.jpg");image.Save("c:\\1.jpg");
I met this problem a year ago. I did not solve it at that time. I also found a lot of information on the network, many of which were not very clear. I have created a virtual directory, some users have modified the Group Policy, some users have simulated the problem, and the people who asked for help on the network finally found out and sorted out the ideas to solve the problem.
First, it needs to be simulated by the user, but it does not mean that you can obtain the permission to access the network disk.
<identity impersonate="true" userName="administrator" password="admin"/>
Then, you need to call WNetAddConnection2 to establish a connection with network resources, and WNetCancelConnection2A to disconnect. The MSDN explanation of WNetAddConnection2 is:WNetAddConnection2Function makes a connection to a network resource. The function can redirect a local device to the network resource. Find a NetworkConnection encapsulation class on the network to call P \ Invoke. paste the following code:
public enum ERROR_ID { ERROR_SUCCESS = 0, // Success ERROR_BUSY = 170, ERROR_MORE_DATA = 234, ERROR_NO_BROWSER_SERVERS_FOUND = 6118, ERROR_INVALID_LEVEL = 124, ERROR_ACCESS_DENIED = 5, ERROR_INVALID_PASSWORD = 86, ERROR_INVALID_PARAMETER = 87, ERROR_BAD_DEV_TYPE = 66, ERROR_NOT_ENOUGH_MEMORY = 8, ERROR_NETWORK_BUSY = 54, ERROR_BAD_NETPATH = 53, ERROR_NO_NETWORK = 1222, ERROR_INVALID_HANDLE_STATE = 1609, ERROR_EXTENDED_ERROR = 1208, ERROR_DEVICE_ALREADY_REMEMBERED = 1202, ERROR_NO_NET_OR_BAD_PATH = 1203 } public enum RESOURCE_SCOPE { RESOURCE_CONNECTED = 1, RESOURCE_GLOBALNET = 2, RESOURCE_REMEMBERED = 3, RESOURCE_RECENT = 4, RESOURCE_CONTEXT = 5 } public enum RESOURCE_TYPE { RESOURCETYPE_ANY = 0, RESOURCETYPE_DISK = 1, RESOURCETYPE_PRINT = 2, RESOURCETYPE_RESERVED = 8, } public enum RESOURCE_USAGE { RESOURCEUSAGE_CONNECTABLE = 1, RESOURCEUSAGE_CONTAINER = 2, RESOURCEUSAGE_NOLOCALDEVICE = 4, RESOURCEUSAGE_SIBLING = 8, RESOURCEUSAGE_ATTACHED = 16, RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), } public enum RESOURCE_DISPLAYTYPE { RESOURCEDISPLAYTYPE_GENERIC = 0, RESOURCEDISPLAYTYPE_DOMAIN = 1, RESOURCEDISPLAYTYPE_SERVER = 2, RESOURCEDISPLAYTYPE_SHARE = 3, RESOURCEDISPLAYTYPE_FILE = 4, RESOURCEDISPLAYTYPE_GROUP = 5, RESOURCEDISPLAYTYPE_NETWORK = 6, RESOURCEDISPLAYTYPE_ROOT = 7, RESOURCEDISPLAYTYPE_SHAREADMIN = 8, RESOURCEDISPLAYTYPE_DIRECTORY = 9, RESOURCEDISPLAYTYPE_TREE = 10, RESOURCEDISPLAYTYPE_NDSCONTAINER = 11 } [StructLayout(LayoutKind.Sequential)] public struct NETRESOURCE { public RESOURCE_SCOPE dwScope; public RESOURCE_TYPE dwType; public RESOURCE_DISPLAYTYPE dwDisplayType; public RESOURCE_USAGE dwUsage; [MarshalAs(UnmanagedType.LPStr)] public string lpLocalName; [MarshalAs(UnmanagedType.LPStr)] public string lpRemoteName; [MarshalAs(UnmanagedType.LPStr)] public string lpComment; [MarshalAs(UnmanagedType.LPStr)] public string lpProvider; } public class NetworkConnection { [DllImport("mpr.dll")] public static extern int WNetAddConnection2A(NETRESOURCE[] lpNetResource, string lpPassword, string lpUserName, int dwFlags); [DllImport("mpr.dll")] public static extern int WNetCancelConnection2A(string sharename, int dwFlags, int fForce); public static int Connect(string remotePath, string localPath, string username, string password) { NETRESOURCE[] share_driver = new NETRESOURCE[1]; share_driver[0].dwScope = RESOURCE_SCOPE.RESOURCE_GLOBALNET; share_driver[0].dwType = RESOURCE_TYPE.RESOURCETYPE_DISK; share_driver[0].dwDisplayType = RESOURCE_DISPLAYTYPE.RESOURCEDISPLAYTYPE_SHARE; share_driver[0].dwUsage = RESOURCE_USAGE.RESOURCEUSAGE_CONNECTABLE; share_driver[0].lpLocalName = localPath; share_driver[0].lpRemoteName = remotePath; Disconnect(localPath); int ret = WNetAddConnection2A(share_driver, password, username, 1); return ret; } public static int Disconnect(string localpath) { return WNetCancelConnection2A(localpath, 1, 1); } }
Finally, it is used. The parameters of the Connect method are network addresses, disks to be mapped locally, network ing accounts, and network ing passwords.
string localpath = "Z:"; int status = NetworkConnection.Connect("\\\\192.168.1.111\\share", localpath, @"administrator", "admin"); if (status == (int)ERROR_ID.ERROR_SUCCESS) { System.Drawing.Image image = System.Drawing.Image.FromFile("Z://1.jpg"); image.Save("c:\\1.jpg"); } NetworkConnection.Disconnect(localpath);
As for why, I understand that you may not have the permission to directly call the API to establish a connection. Here, you need to simulate the user and then establish a connection to directly access the connection, which is equivalent to ASP. network Disk ing is performed under the account running. NET.