AppDomain ShadowCopy 和模拟 - 指定的用户没有有效的配置文件

Posted

技术标签:

【中文标题】AppDomain ShadowCopy 和模拟 - 指定的用户没有有效的配置文件【英文标题】:AppDomain ShadowCopy and impersonation - The specified user does not have a valid profile 【发布时间】:2014-06-04 00:11:25 【问题描述】:

我有一个 ASP.NET Web 应用程序,它使用以下 web.config 条目进行模拟:

<system.web>
  <identity impersonate="true" />
  <authentication mode="Windows" />
  <authorization>
    <allow roles="Administrators" />
    <deny users="*" />
  </authorization>
</system.web>

独立地,这工作得很好。用户必须以管理员身份登录,当他们这样做时,应用程序可以代表他们执行管理操作。

除此之外,我想将一些操作隔离在单独的 AppDomain 中,并且理想情况下也希望影子复制文件。我这样设置了一个 AppDomain:

AppDomainSetup appSetup = new AppDomainSetup();
appSetup.ShadowCopyFiles = "true";
appSetup.ApplicationBase = 
    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

hostAppDomain = AppDomain.CreateDomain(
    "AppDomain1",
    AppDomain.CurrentDomain.Evidence,
    appSetup);

然后我尝试在这个 AppDomain 中创建一个对象的实例,例如:

var crossObject = (CrossAppDomainObject)hostAppDomain.CreateInstanceAndUnwrap(
    typeof(CrossAppDomainObject).Assembly.FullName,
    typeof(CrossAppDomainObject).FullName);

这会产生错误:

指定的用户没有有效的个人资料。无法加载“MyAssembly,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”。

如果我将 AppDomain 设置为使用 ShadowCopy,问题就会消失。任何人都可以解释这种行为吗?

更具体一点,我实际上不需要卷影复制 all 程序集。最终,我的CrossAppDomainObject 将使用 MEF 从 another 文件夹加载程序集,而我希望复制这些其他程序集。我怀疑我可以通过将卷影副本配置为在它复制的文件中具有选择性来获得我想要的东西。 但是,我仍然想知道导致此错误的原因。

【问题讨论】:

【参考方案1】:

您的问题不是影子复制了哪些程序集,而是由“程序集要影子复制到的位置”问题引起的。

也就是说,不指定 AppDomainSetup.CachePath 会导致运行时在卷影复制时尝试使用用户配置文件目录内(C:\Users\ 内)内的“用户下载缓存”位置。

您的错误是因为管理员是一个特殊帐户,没有这样的配置文件目录。

一种解决方案是简单地使用运行 Web 应用程序的 AppDomain 文件夹,因为 ASP.NET 已经使用了特定的 CachePath(类似于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\d32f4325),因此它可以与此类“虚拟”用户帐户一起使用。如果这样的路径适合你,那就去做吧

appSetup.CachePath = AppDomain.CurrentDomain.SetupInformation.CachePath;

【讨论】:

以上是关于AppDomain ShadowCopy 和模拟 - 指定的用户没有有效的配置文件的主要内容,如果未能解决你的问题,请参考以下文章

无法在新的 appDomain 中加载程序集

AppDomain 和线程

AppDomain 的 CPU 和内存上限

进程和 AppDomain 加载/卸载

自定义 AppDomain 和 PrivateBinPath

默认 AppDomain 与新 AppDomain 中不同的依赖解析行为加载程序集