Windows IIS无法访问文件,但通过同一帐户登录的用户可以

Windows IIS无法访问文件,但通过同一帐户登录的用户可以,windows,iis-7,permissions,Windows,Iis 7,Permissions,我们最近将一个web应用程序转移到一台新机器上。旧的是Win2k,iis6 新机器是WinServer2003,IIS 7 应用程序以前在网络共享上查找映像文件,映射为驱动器号O。这很好用 移动后,应用程序无法再访问这些文件。应用程序中尝试访问O:驱动器文件的部分是一个已编译的CGI,因此我不确定它的内部外观。我可能可以访问源代码,但我决定先尝试一个非常简单的测试,看看哪里出了问题 为了尝试和排除故障,我创建了一个小型C#程序,该程序尝试在本地访问测试文件(在C:驱动器上),然后在O:驱动器上查

我们最近将一个web应用程序转移到一台新机器上。旧的是Win2k,iis6

新机器是WinServer2003,IIS 7

应用程序以前在网络共享上查找映像文件,映射为驱动器号
O
。这很好用

移动后,应用程序无法再访问这些文件。应用程序中尝试访问
O:
驱动器文件的部分是一个已编译的CGI,因此我不确定它的内部外观。我可能可以访问源代码,但我决定先尝试一个非常简单的测试,看看哪里出了问题

为了尝试和排除故障,我创建了一个小型C#程序,该程序尝试在本地访问测试文件(在
C:
驱动器上),然后在
O:
驱动器上查找文件,然后在
Z:
驱动器上查找文件,然后在
O:
驱动器上查找相同的文件,但使用UNC路径而不是依赖驱动器映射。最后,它打印出运行它的域和用户名。我通过用于注册从旧服务器转移过来的原始EXE的相同方法将其注册为CGI

读取
C:
驱动器上的文件没有问题,但无法读取其他文件。而C#应用程序告诉我它是以
流量
域下的
华盛顿$
帐户运行的。我认为正在使用的帐户是
华盛顿
(请注意,最后有一个
$
,没有)

就在我尝试了这一点并失败之后,我通过远程桌面以用户身份登录:
Traffic
域上的
Washington
,并且能够在UNC路径上看到测试文件,没有任何问题(在命令提示符下通过
dir\\trsystem\images2\testFile.txt进行测试)

我没有绑定到映射的驱动器号;事实上,我想切换到使用UNC路径

另外,我对Windows域和IIS管理/管理还很陌生。这个问题可能有一个我不知道或忽略的根本原因

我的程序输出如下:

--- Success opening C drive file! --- Failed to open O drive file: System.IO.DirectoryNotFoundException: Could not find a part of the path 'O:\testFile.txt'. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at System.IO.File.OpenRead(String path) at Testing.Main() Failed to open Z drive file: System.IO.DirectoryNotFoundException: Could not find a part of the path 'Z:\testFile.txt'. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at System.IO.File.OpenRead(String path) at Testing.Main() Failed to open UNC file: System.UnauthorizedAccessException: Access to the path '\\trsystem\images2\testFile.txt' is denied. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) at System.IO.File.OpenRead(String path) at Testing.Main() ---------- ---------- ---------- Domain Name is:TRAFFIC UserName is:WASHINGTON$
提前感谢您提供的任何帮助或疑难解答!

为什么不花点时间在Microsoft KB上呢


IIS不支持映射驱动器,因此您看到的只是设计。

您能从IIS管理器设置中找出旧IIS6站点运行的帐户以及新站点运行的帐户吗?…也就是说,它似乎是域管理员帐户。从安全角度看,我认为这是一个非常糟糕的主意;不幸的是我在这件事上没有太大的影响力。我在新服务器上尝试了域管理员,但没有成功。我还检查了远程文件的权限;它是完全开放的。一旦我可以从IIS中读取它,我会将其锁定。我在发布之前确实读过那篇文章。它指出,驱动器映射可能不可行,因为它们是不可用的跨用户帐户的一致性。它还提供了解决该问题的方法(登录IIS用户帐户并创建持久映射驱动器)虽然不推荐,但它允许您使用映射驱动器。此外,文章还指出,推荐的访问网络资源的方式是通过UNC。正如我在上面所发布的,UNC也出现了问题。在使用MS支持三天大约10个小时后,此问题最终得到解决。然后,您应该同意不使用MS支持您将在这个案例上花费多少时间。希望您对他们提供的帮助感到满意。@Sean-也许您可以与MS支持部门分享10h/3d传奇中的一些细节,并帮助我解决相同的问题?
using System;
using System.IO;
using System.Security.Permissions;

class Testing{
    public static void Main()    {
        bool cFile = true;
        bool oFile = true;
        bool zFile = true;
        bool uncFile = true;

        try{
            //Try to open the file on the C drive
            File.OpenRead("C:\\testFile.txt");
        }
        catch (Exception e){
            Console.WriteLine("Failed to open C drive file:\n");
            Console.WriteLine(e.ToString());
            cFile = false;
        }
        if (cFile)
        {
            Console.WriteLine("\n\n--- Success opening C drive file! ---\n\n");
        }

        Console.WriteLine("\n\n");

        try
        {
            //Try to open the file on the O drive
            File.OpenRead("O:\\testFile.txt");
        }
        catch (Exception f)
        {
            Console.WriteLine("Failed to open O drive file:\n");
            Console.WriteLine(f.ToString());
            oFile = false;
        }
        if (oFile)
        {
            Console.WriteLine("\n\n--- Success opening O drive file! ---\n\n");
        }

        Console.WriteLine("\n\n");

        try
        {
            //Try to open the file on the Z drive
            File.OpenRead("Z:\\testFile.txt");
        }
        catch (Exception g)
        {
            Console.WriteLine("Failed to open Z drive file:\n");
            Console.WriteLine(g.ToString());
            zFile = false;
        }
        if (zFile)
        {
            Console.WriteLine("\n\n--- Success opening Z drive file! ---\n\n");
        }

        Console.WriteLine("\n\n");

        try
        {
            //Try to open the file via UNC
            File.OpenRead("\\\\ntsys\\images2\\testFile.txt");
        }
        catch (Exception g)
        {
            Console.WriteLine("Failed to open UNC file:\n");
            Console.WriteLine(g.ToString());
            uncFile = false;
        }
        if (uncFile)
        {
            Console.WriteLine("\n\n--- Success opening UNC file! ---\n\n");
        }
        Console.WriteLine("\n\n");
        Console.WriteLine("---------- ---------- ----------\n\n");
        string domainName = Environment.UserDomainName;
        string userName = Environment.UserName;
        Console.WriteLine("Domain Name is:" + domainName + "\n");
        Console.WriteLine("UserName is:" + userName + "\n\n");
    }
}