IIS не может получить доступ к файлу, но пользователь, вошедший через ту же учетную запись, может - PullRequest
3 голосов
/ 31 января 2011

Недавно мы переместили веб-приложение на новый компьютер. Старый был Win2k, IIS 6.

Новая машина - Win Server 2003, IIS 7.

Приложение ранее искало файлы изображений на сетевом ресурсе, сопоставленные как буква диска O. Это работало нормально.

После перемещения приложение больше не могло получить доступ к этим файлам. Часть приложения, которая пытается получить доступ к файлам диска O:, представляет собой скомпилированный CGI, поэтому я не уверен, как он выглядит изнутри. Возможно, я мог бы получить доступ к источнику, но я решил попробовать очень простой тест, чтобы сначала посмотреть, что не так.

Чтобы попытаться устранить неполадки, я создал небольшую программу на C #, которая пытается получить доступ к тестовому файлу локально (на диске C:), затем ищет файл на диске O:, затем на диске Z:, и затем ищет тот же файл, что и на диске O:, но использует UNC-путь, а не полагается на отображение диска. Наконец, он распечатывает домен и имя пользователя, под которым он работает. Я зарегистрировал это как CGI с помощью того же метода, который использовался для регистрации исходного EXE-файла, перенесенного со старого сервера.

Файл на диске C: читается без проблем, но другие файлы не могут быть прочитаны. И приложение C # сообщает мне, что оно работает под учетной записью Washington$ в домене Traffic. Учетная запись, которую я ДУМАЛ, использовалась Washington (обратите внимание, что у каждого есть $ в конце, у другого его нет).

Сразу после того, как я попробовал это и получил ошибки, я вошел в систему через удаленный рабочий стол как пользователь: Washington в домене Traffic и смог без проблем просмотреть тестовый файл на пути 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$

И, сама программа (обратите внимание, что это мой первый набег на C #; он собран на основе веб-примеров, поэтому, пожалуйста, не обращайте внимания на его уродство):

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");
    }
}

Заранее благодарим за любую помощь или идеи по устранению неисправностей!

1 Ответ

0 голосов
/ 06 февраля 2011

Почему бы вам не потратить некоторое время на Microsoft KB?

http://support.microsoft.com/kb/257174

IIS не поддерживает подключенные диски, так что вы видите просто дизайн.

...