将文件复制到IIS中的Web应用程序文件夹会导致文件权限问题

时间:2013-09-04 19:19:13

标签: c# asp.net iis iis-7

由于无法编辑通过我们的网络应用程序访问的许多文档,因此我们一直无法迁移到新的IIS服务器。这包括我们用于设置的XML文件等内容。

当我们尝试使用新版本覆盖现有文件(已从旧IIS服务器复制)时,例如新的settings.xml文件,我们将获得权限被拒绝。我们有许多事情要赋予应用池覆盖文件的权限,但我们还没有成功。这包括为NETWORK SERVICE用户帐户提供对文件和文件夹的完全控制权。

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

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

  

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

然而,我们删除该文件并允许Web应用程序自行生成文件,然后它可以完全访问该文件,并且可以覆盖/写入该文件而不会出现问题。

虽然我们显然可以逐个文件地查看此流程,但我们正在寻找更具可持续性的解决方案,以便我们以后不会继续删除/重新生成文件。

1 个答案:

答案 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);
}