解决这个问题的方法有以下三种:
1、在所有三个网络驱动服务器中添加相同的windows帐户/相同的密码。
在 IIS7 中,将此 windows 帐户用作身份。
但是 NAS 账户需要 ip 前缀,而 Windows 账户不允许 ip 前缀。所以我不能用这个。
2、将服务器加入同一个域,允许IIS7服务器访问所有网络驱动服务器中的网络驱动。
但是,最终用户不允许我这样做。
3、最后我又写了一个IIS7 web app,帮助怪异的IIS7 web app登录所有的网络驱动。
最终用户必须访问我的网络应用程序一次,然后才能使用奇怪的 IIS7 网络应用程序。
在我的网络应用中,我经常使用这个 API:WNetAddConnection2。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Runtime.InteropServices;
namespace IISReadDiskTest
{
public class NetworkDrive
{
public enum ResourceScope
{
RESOURCE_CONNECTED = 1,
RESOURCE_GLOBALNET,
RESOURCE_REMEMBERED,
RESOURCE_RECENT,
RESOURCE_CONTEXT
}
public enum ResourceType
{
RESOURCETYPE_ANY,
RESOURCETYPE_DISK,
RESOURCETYPE_PRINT,
RESOURCETYPE_RESERVED
}
public enum ResourceUsage
{
RESOURCEUSAGE_CONNECTABLE = 0x00000001,
RESOURCEUSAGE_CONTAINER = 0x00000002,
RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004,
RESOURCEUSAGE_SIBLING = 0x00000008,
RESOURCEUSAGE_ATTACHED = 0x00000010,
RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED),
}
public enum ResourceDisplayType
{
RESOURCEDISPLAYTYPE_GENERIC,
RESOURCEDISPLAYTYPE_DOMAIN,
RESOURCEDISPLAYTYPE_SERVER,
RESOURCEDISPLAYTYPE_SHARE,
RESOURCEDISPLAYTYPE_FILE,
RESOURCEDISPLAYTYPE_GROUP,
RESOURCEDISPLAYTYPE_NETWORK,
RESOURCEDISPLAYTYPE_ROOT,
RESOURCEDISPLAYTYPE_SHAREADMIN,
RESOURCEDISPLAYTYPE_DIRECTORY,
RESOURCEDISPLAYTYPE_TREE,
RESOURCEDISPLAYTYPE_NDSCONTAINER
}
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public ResourceScope dwScope = 0;
public ResourceType dwType = 0;
public ResourceDisplayType dwDisplayType = 0;
public ResourceUsage dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
}
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags);
public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord)
{
NETRESOURCE myNetResource = new NETRESOURCE();
myNetResource.lpLocalName = localDrive;
myNetResource.lpRemoteName = remotePath;
myNetResource.lpProvider = null;
int result = WNetAddConnection2(myNetResource, passWord, userName, 0);
return result;
}
}
}