在IIS6上运行的ASP.NET站点上,AppDomain阴影复制文件访问被拒绝

时间:2012-02-22 07:23:21

标签: c# asp.net iis-6 appdomain file-permissions

我在AppDomains的卷影复制功能与在IIS下运行的ASP.NET网站相结合时遇到了一些麻烦。问题是,由于权限不足,IIS用户无法读取或执行卷影复制的文件。

执行新AppDomain中的代码时,我收到以下错误消息(通过DoCallBack的回调方法):
System.IO.FileLoadException:无法加载文件或程序集“My.Namespace.AssemblyName,Version = 0.0.3.2231,Culture = neutral,PublicKeyToken = null”或其依赖项之一。访问被拒绝。

Fusion日志:

Assembly manager loaded from:  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable  c:\windows\system32\inetsrv\w3wp.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = NT AUTHORITY\NETWORK SERVICE
LOG: DisplayName = My.Namespace.AssemblyName, Version=0.0.3.2231, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Inetpub/wwwroot/Web Suite/Widgets
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using host configuration file: \\?\C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet.config
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Inetpub/wwwroot/Web Suite/Widgets/My.Namespace.AssemblyName.DLL.
ERR: Failed to complete setup of assembly (hr = 0x80070005). Probing terminated.

我已经做过的事:
我已授予用户'NETWORK SERVICE'的'C:/ Inetpub / wwwroot / Web Suite / Widgets'文件夹读取和执行权限。
当我关闭阴影复制功能时,一切都很顺利 即使在Visual Studio 2008下的本地计算机上运行也没有任何问题 在Widgets文件夹中授予所有文件(而不是文件夹本身)的读取和执行权限并不能解决问题。

我认为它与ASP.NET临时文件文件夹的权限有关:
C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web suite
此文件夹,其所有子文件夹及其中的文件都具有读取和读取功能。执行用户'NETWORK SERVICE'的权限。所以这也不是问题。

简短:
为什么我的网站(在IIS6下运行)无法访问新AppDomain的卷影复制文件?

2 个答案:

答案 0 :(得分:0)

尝试使用-ga选项运行aspnet_regiis,如下所示:

aspnet_regiis -ga MachineName\AccountName

其中MachineName \ AccountName是应用程序池的标识。

答案 1 :(得分:0)

问题的原因是CachePath默认值。如果AppPool在网络服务下运行,则使用DefaultUser临时文件夹位置(我不知道为什么)。但网络服务无权访问该文件夹,这是异常的原因。解决方案是显式设置CachePath。例如,我们可以使用ASP.NET AppPool缓存路径:

var domainInfo = new AppDomainSetup
  {
    CachePath = AppDomain.CurrentDomain.SetupInformation.CachePath
    /* ...*/
  };