我将内部Web应用程序部署到服务器A,并在向服务器B上的网络驱动器创建文件时出错。如果我在本地运行,则文件已在服务器B上成功创建。
System.UnauthorizedAccessException:拒绝访问路径'\\ b \ folder \ test.pdf'。
应用程序池的标识是networkservice。我给网络服务完全控制了服务器B上的目标文件夹。我甚至给了Everyone
完全控制权,但它仍然有错误。
服务器A运行.NET 7.5。创建文件的代码:
var byteArray = generateArray();
var destination = "\\\\b\\folder\\test.pdf";
try {
var destinationFile = new FileInfo(destination);
if (destinationFile.Exists) {
destinationFile.Delete();
}
System.IO.File.WriteAllBytes(destination, byteArray);
} catch (UnauthorizedAccessException) {
//
}
我看到有人遇到完全相同的问题here。但它并没有解决我的问题。
解决方案:
我将身份更改为管理员帐户,而不是将network service
用于应用程序池。它有效,但我不完全理解为什么它的工作原理。因为A上的网络服务与B上的网络服务不同?
答案 0 :(得分:0)
即使您提供了对所有人的访问权限,某些应用程序也必须获得特定权限。这是Window Vista中引入的UAC系统的一部分。此举旨在提高安全性,因此应用程序无法在任何用户下运行,并且基本上具有完全访问权限。
您应该做什么,在目录上提供以下访问权限:
IIS AppPool\NameOfAppPool
这将提供对您的托管Web应用程序到该目录的特定访问,因为IIS将能够正确地操作该目录。在编写或阅读之前,您可以实现的一些代码可以帮助验证:
public static bool ValidateIOPermission(string path)
{
try
{
if(Directory.Exist(path))
return true;
else { Directory.CreateDirectory(path); }
}
catch(Exception ex) { return false; }
}
上面的代码是一个小样本,基本上是尝试执行操作并捕获异常,这样就知道你是否有访问权。