Доступ к пути xxx запрещен - PullRequest
1 голос
/ 20 декабря 2011

Прочитав тонны подобных постов, я решил придумать этот.Ну, в принципе эта проблема похожа на многие другие, но почему-то я не могу заставить ее работать.

Вот сценарий, у меня есть балансировка нагрузки на 2 серверах (servA и servB), и мне нужно принудительно заставить приложениесоздать только на 1 из них.Поэтому я хочу указать путь UNC при сохранении файлов.У меня, очевидно, есть проблема с созданием файлов в каталоге по сети.

Если я запускаю его с Cassini, все хорошо, я могу получить доступ к пути, потому что он зарегистрирован в моей учетной записи.Как только я перенесу приложение на сервер разработки, оно больше не будет работать.Я знаю, что IIS использует пользователя, связанного с пулом приложений, поэтому я проверил эту учетную запись (которая является network_service) и добавил права на запись в эту папку.
Все еще недостаточно.Что вы думаете о «Все» ?!Это должно работать!
О, ну, это не так.

Давайте посмотрим код:
Directory.CreateDirectory("\\\\my.ip.over.da.net\\c$\\inetpub\\wwwroot\\projfolder\\otherprojfolder\\test");

И это сообщение, которое я получил, когда пытался создать этопапка.

{"Message":"Access to the path \u0027\\\\\\\\my.ip.over.da.net\\\\c$\\\\inetpub
\\\\wwwroot\\\\projfolder\\\\otherprojfolder\\\\test\u0027 is denied.","StackTrace":" 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n at 
System.IO.Directory.InternalCreateDirectory(String fullPath, String path, 
DirectorySecurity dirSecurity)\r\n at System.IO.Directory.CreateDirectory(String path, 
DirectorySecurity directorySecurity)\r\n at 
NSC.Ajax.GetData.testgrid()","ExceptionType":"System.UnauthorizedAccessException"}

Она вызывается через AJAX для упрощения тестирования, поэтому ответ форматируется таким образом.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Проблема в том, что у вас нет доступа к этому местоположению с использованием учетных данных IIS, сервер разработки будет находиться в отдельном домене где-то еще, а доступ к вашему компьютеру будет осуществляться с общего ресурса c $ admin.работать не будет, изменение разрешений на этом уровне ... немного рискованно ...

Если вам действительно нужен доступ к файлам на вашем локальном компьютере с вашего сервера разработки, вам, вероятно, будет лучше создатьобщий ресурс с именем test (C:\inetpub\wwwroot\projfolder\otherprojfolder\test) на вашем компьютере и установите для него права доступа для чтения Everyone (если вам нужно создавать файлы и папки, вам потребуется больше, но я бы посоветовалтолько предоставляя минимальный доступ, с которым вы можете обойтись), хотя это довольно небезопасно, но, поскольку у вашего компьютера разработчика не будет никакого способа аутентификации учетной записи в другой сети (с вашего компьютера, с которого вы обмениваетесь файлами), вы не сможетеесть с чем поиграть!

Итак, создайте локальную общую папку, а затем просто укажите свой код на \\\\my.ip.over.da.net\\test.

Обратите внимание, вам нужно установить разрешения для общего ресурса и насама папка, если общий ресурс имеет достаточные разрешения, но ACL для папки не согласен, вы по-прежнему получите отказ в доступе.

0 голосов
/ 20 декабря 2011

Вы можете выдать себя за другого пользователя при создании каталога

public static void CreateDirectory(string myDirectory)
    {
        SafeTokenHandle safeTokenHandle;

        bool returnValue = LogonUser(@Username, @Domain, @Password, 2, 0, out safeTokenHandle);

        if (returnValue == true)
        {
            WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
            using (WindowsImpersonationContext impersonatedUser = newId.Impersonate())
            {
                System.IO.Directory.CreateDirectory(myDirectory);
            }
        }
    }
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);
    public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle()
            : base(true)
        {
        }

        [DllImport("kernel32.dll")]
        [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
        [SuppressUnmanagedCodeSecurity]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool CloseHandle(IntPtr handle);

        protected override bool ReleaseHandle()
        {
            return CloseHandle(handle);
        }
    }
}

Подробнее здесь: http://msdn.microsoft.com/en-us/library/system.security.principal.windowsimpersonationcontext.aspx

...