我有一个应用程序需要进行大量的模拟操作,因为需要在受保护的网络共享中移动和创建许多文件。我创建了一个简单的静态类,其中包含一个方法,该方法接受用户、域、密码和一个委托,该委托包含需要在模拟上下文中运行的代码。
我遇到的问题是当CLR尝试在此上下文中绑定到引用的程序集时。会抛出一个'Access is denied'消息的FileLoadException异常。
我认为这是由于被模拟用户在文件系统下没有足够的权限访问*.DLL文件。例如,我可以在模拟块之前编写无害的代码,仅在上下文切换到模拟用户之前从问题程序集中加载类型,这样就可以解决问题!但是我并不认为这是一种优雅的解决方案 - 我需要开始担心在模拟下可以使用哪些类型,确保我先放置随机的
更令人沮丧的是,在我的本地开发机器上没有遇到这个问题。只有当程序集被发送到测试环境时才会出现这个问题。而我无法访问测试环境的文件权限以尝试在我的本地机器上模仿它们。
无论如何,我尝试了这个解决方案:
没有用。我仍然会收到“访问被拒绝”的异常,只是现在是从以
我遇到的问题是当CLR尝试在此上下文中绑定到引用的程序集时。会抛出一个'Access is denied'消息的FileLoadException异常。
我认为这是由于被模拟用户在文件系统下没有足够的权限访问*.DLL文件。例如,我可以在模拟块之前编写无害的代码,仅在上下文切换到模拟用户之前从问题程序集中加载类型,这样就可以解决问题!但是我并不认为这是一种优雅的解决方案 - 我需要开始担心在模拟下可以使用哪些类型,确保我先放置随机的
typeof()
语句吗?更令人沮丧的是,在我的本地开发机器上没有遇到这个问题。只有当程序集被发送到测试环境时才会出现这个问题。而我无法访问测试环境的文件权限以尝试在我的本地机器上模仿它们。
无论如何,我尝试了这个解决方案:
// 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
开头的那一行开始。值得注意的是,我在构建服务器上也遇到了相同的异常。上面的解决方案可以在构建服务器上解决问题,但无法在我们的测试环境中解决。请问我错过了什么?谢谢。