由于无法编辑通过我们的网络应用程序访问的许多文档,因此我们一直无法迁移到新的IIS服务器。这包括我们用于设置的XML文件等内容。
当我们尝试使用新版本覆盖现有文件(已从旧IIS服务器复制)时,例如新的settings.xml文件,我们将获得权限被拒绝。我们有许多事情要赋予应用池覆盖文件的权限,但我们还没有成功。这包括为NETWORK SERVICE
用户帐户提供对文件和文件夹的完全控制权。
但是,如果我们删除这些文件并从头开始重新生成它们,那么这个问题就会消失。例如,可以手动删除settings.xml文件,然后应用程序可以使用默认值重新生成一个。这很好。
基本上问题是,如果我们将文件自己复制到文件夹中,那么Web应用程序会抛出
“访问路径[..FILENAME ..]拒绝”
然而,我们删除该文件并允许Web应用程序自行生成文件,然后它可以完全访问该文件,并且可以覆盖/写入该文件而不会出现问题。
虽然我们显然可以逐个文件地查看此流程,但我们正在寻找更具可持续性的解决方案,以便我们以后不会继续删除/重新生成文件。
答案 0 :(得分:0)
这里有几件事要尝试。一个编辑文件安全性以删除任何“拒绝”访问权限并为您的应用程序提供完全权限,另一个删除文件上的任何“只读”设置并将属性设置为“正常”(我必须使用此一个过去):
protected void Page_Load(object sender, EventArgs e)
{
string path = Server.MapPath("theFileLocation");
RemoveFileSecurity(path, @"App Pool Identity", FileSystemRights.FullControl, AccessControlType.Deny);
AddFileSecurity(path, @"App Pool Identity", FileSystemRights.FullControl, AccessControlType.Allow);
FileAttributes a = File.GetAttributes(path);
a = RemoveAttribute(a, FileAttributes.ReadOnly);
File.SetAttributes(path, FileAttributes.Normal);
}
private FileAttributes RemoveAttribute(FileAttributes attributes, FileAttributes attributesToRemove)
{
return attributes & ~attributesToRemove;
}
private void AddFileSecurity(string fileName, string account, FileSystemRights rights, AccessControlType controlType)
{
FileSecurity fSecurity = File.GetAccessControl(fileName);
fSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType));
File.SetAccessControl(fileName, fSecurity);
}
private void RemoveFileSecurity(string fileName, string account, FileSystemRights rights, AccessControlType controlType)
{
FileSecurity fSecurity = File.GetAccessControl(fileName);
fSecurity.RemoveAccessRule(new FileSystemAccessRule(account, rights, controlType));
File.SetAccessControl(fileName, fSecurity);
}