2011-12-20 3 views
1

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

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

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

Давайте посмотрим код:
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 для более легкого тестирования, поэтому ответ отформатирован таким образом.

ответ

0

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

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

+0

Спасибо msmucker, но я уже пробовал, он тоже не работает. Тем не менее, я думаю, что это не должно быть решением, я имею в виду, почему я должен войти в систему с правильным пользователем, а не с исправлением неправильного? Плюс у меня нет пользователя в производственной среде с этой ролью. Я имею в виду, я должен его создать. – Sballerio

2

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

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

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

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

+0

Спасибо, Дэниэл, я тоже это пробовал, но у меня была такая же проблема с доступом. Я собираюсь повторить это прямо сейчас, потому что невозможно ничего не работать. Я отредактировал вопрос, потому что мне не нужно обращаться к файлам на моем компьютере, и это не может быть и речи. Я дам вам знать, как это происходит: D. – Sballerio

+0

Хорошо, я попытался сопоставить путь к единице, и он не работает. Если я прав, проблема в том, что при создании общего ресурса это видно только пользователю, создавшему этот ресурс. Сказано, что это означает, что пользователь приложения не может получить доступ к общему ресурсу, следовательно, следующая ошибка: msg -> {"Message": "Не удалось найти часть пути \ u0027Y: \\ otherprojfolder \\ test \ u0027.", StackTrace ":" в System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) \ r \ n в [...] в NSC.Ajax.GetData.testgrid() "," ExceptionType ":" System.IO. DirectoryNotFoundException "} – Sballerio

+0

Если вы создадите общий ресурс, перейдите в разрешения для общего доступа и обновите разрешения, если вы находитесь в Windows 7, тогда вам нужно перейти в раздел« Расширенный доступ », я думаю. Вероятно, вам нужно будет изменить ACL для разрешений Windows, а также разрешения на сам ресурс. –

Смежные вопросы