2

我们在迁移到新的 IIS 服务器时遇到了问题,因为无法编辑通过我们的 Web 应用程序访问的许多文档。这包括我们用于设置的 XML 文件等内容。

当我们尝试用新版本(例如新的 settings.xml 文件)覆盖现有文件(已从旧 IIS 服务器复制)时,我们会被拒绝权限。我们有很多事情可以让应用程序池允许覆盖文件,但我们没有成功。这包括让NETWORK SERVICE用户帐户完全控制文件和文件夹。

但是,如果我们删除这些文件并从头开始重新生成它们,这个问题就会消失。例如,可以手动删除 settings.xml 文件,然后应用程序可以使用默认值重新生成一个。这工作正常。

基本上问题是,如果我们自己将文件复制到文件夹中,网络应用程序会抛出一个

“访问路径 [..FILENAME..] 被拒绝”

但是,我们删除该文件并允许 Web 应用程序自行生成文件,然后它可以完全访问该文件,并且可以毫无问题地覆盖/写入它。

虽然我们显然可以逐个文件地处理这个过程,但我们正在寻找一种更可持续的解决方案,这样我们将来就不会继续删除/重新生成文件。

4

1 回答 1

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);
}
于 2013-09-04T21:16:03.870 回答