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