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

C# 将文件复制到IIS中的web应用程序文件夹会导致文件权限问题,c#,asp.net,iis,iis-7,C#,Asp.net,Iis,Iis 7,我们在迁移到新的IIS服务器时遇到问题,因为通过我们的web应用程序访问的许多文档都无法编辑。这包括我们用于设置的XML文件等内容 当我们尝试用新版本(例如新的settings.xml文件)覆盖现有文件(从旧IIS服务器复制的文件)时,权限被拒绝。我们有很多事情要授予应用程序池覆盖文件的权限,但我们没有成功。这包括赋予网络服务用户帐户对文件和文件夹的完全控制权 然而,如果我们删除这些文件并从头开始重新生成它们,这个问题就会消失。例如,可以手动删除settings.xml文件,然后应用程序可以使用

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

当我们尝试用新版本(例如新的settings.xml文件)覆盖现有文件(从旧IIS服务器复制的文件)时,权限被拒绝。我们有很多事情要授予应用程序池覆盖文件的权限,但我们没有成功。这包括赋予
网络服务
用户帐户对文件和文件夹的完全控制权

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

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

“对路径[…文件名..]的访问被拒绝”

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


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

以下是一些可以尝试的方法。一个编辑文件安全性以删除任何“拒绝”访问权限并授予应用程序完全权限,另一个删除文件上的任何“只读”设置并将属性设置为“正常”(我过去曾使用过此选项):


检查哪些NTFS权限继承到包含网站文件的目录中。还要确保您的部署过程不会复制ACL(是否使用XCOPY?)我们将它们FTP到应用程序文件夹您是否已验证是否已将应用程序池标识更改为
NetworkService
(默认值为
ApplicationPoolIdentity
)?您知道吗?IIS 7.5(Windows 7)中的默认应用程序池标识已从NetworkService更改为AppPoolIdentity?FTP可能是问题所在-FTP服务器运行在什么用户上下文中?您使用的是具有用户隔离的IIS FTP服务器,还是单用户帐户?@SergueiFedorov是否有文件属性?比如它设置为“只读”吗?
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);
}