由于跨受保护的网络共享移动和创建许多文件,我有一个需要进行大量模拟的应用程序。我创建了一个简单的静态类,该类具有一个方法,该方法采用用户、域、密码和一个委托,其中包含您需要在模拟上下文下运行的代码。
我遇到的问题是当 CLR 尝试在此上下文下绑定到引用的程序集时。引发 FileLoadException 并显示“访问被拒绝”消息。
我被引导相信这是由于模拟用户对文件系统下的 *.DLL 文件没有足够的权限。例如,我可以在模拟块之前编写良性代码,除了在上下文切换到模拟用户之前从问题程序集中加载类型外,什么都不做,这很好用!但是,我真的不认为这是一个优雅的解决方案——我是否需要开始担心我可以在模拟下使用哪些类型,并确保我typeof()
事先放置了随机语句?
更令人沮丧的是,我没有在本地开发机器上遇到这个问题。当程序集被运送到 beta 环境时,才会出现这个问题。而且我无权从 beta 环境中读取文件权限,无法尝试在我的位置机器上模仿它们。
无论如何,我尝试了这个解决方案:
// Defined above:
// System.Security.Principal.WindowsIdentity identity;
// System.Security.Principal.WindowsImpersonationContext context;
context = identity.Impersonate();
int tries = 0;
while ( true )
{
try
{
contextAction();
}
catch ( FileLoadException ex )
{
if ( tries > MAX_TRIES )
{
// don't allow an infinite loop
throw;
}
if ( String.IsNullOrEmpty( ex.FileName ) )
{
// if this is null/empty, we can't really recover
throw;
}
context.Undo(); // return to current logon
try
{
var assemblyName = new AssemblyName( ex.FileName );
Assembly.Load( assemblyName );
tries++;
continue;
}
finally
{
context = identity.Impersonate(); // re-impersonate
}
}
finally
{
// return to your current windows logon
context.Undo();
}
}
没有骰子。我仍然收到“访问被拒绝”异常,除了现在从Assembly.Load
.
需要注意的一件有趣的事情是,我从构建服务器中得到了同样的异常。上述解决方案将其固定在构建服务器上。不在我们的测试环境中。
我在这里想念什么?谢谢。