WindowsImpersonationContext 下的程序集绑定。如何防止FileLoadException?

Tin*_*ter 5 .net c# clr assemblies assemblybinding

由于跨受保护的网络共享移动和创建许多文件,我有一个应用程序需要进行大量模拟。我创建了一个简单的静态类,它有一个方法接受用户、域、密码和一个委托,其中包含您需要在模拟上下文下运行的代码。

\n\n

我遇到的问题是当 CLR 尝试绑定到此上下文下引用的程序集时。抛出 FileLoadException 并显示“访问被拒绝”消息。

\n\n

我相信这是由于模拟用户没有足够的权限访问文件系统下的 *.DLL 文件。例如,我可以在模拟块之前编写良性代码,这除了在上下文切换到模拟用户之前从问题程序集中加载类型之外什么也不做,这非常有效!然而,我真的不认为这是一个优雅的解决方案 \xe2\x80\x93 我是否需要开始担心我可以在模拟下使用哪些类型,确保我随机放置typeof()事先放置了随机语句?

\n\n

更令人沮丧的是,我在本地开发计算机上没有遇到这个问题。当程序集被运送到测试环境时,就会出现此问题。而且我无权从测试环境中读取文件权限来尝试在我的本地计算机上模仿它们。

\n\n

无论如何,我尝试了这个解决方案:

\n\n
// Defined above:\n// System.Security.Principal.WindowsIdentity identity;\n// System.Security.Principal.WindowsImpersonationContext context;\n\ncontext = identity.Impersonate();\n\nint tries = 0;\nwhile ( true )\n{\n    try\n    {\n        contextAction();\n    }\n    catch ( FileLoadException ex )\n    {\n        if ( tries > MAX_TRIES )\n        {\n            // don't allow an infinite loop\n            throw;\n        }\n        if ( String.IsNullOrEmpty( ex.FileName ) )\n        {\n            // if this is null/empty, we can't really recover\n            throw;\n        }\n        context.Undo(); // return to current logon\n        try\n        {\n            var assemblyName = new AssemblyName( ex.FileName );\n            Assembly.Load( assemblyName );\n            tries++;\n            continue;\n        }\n        finally\n        {\n            context = identity.Impersonate(); // re-impersonate\n        }\n    }   \n    finally\n    {\n        // return to your current windows logon\n        context.Undo();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有骰子。我仍然收到“访问被拒绝”异常,但现在从以 . 开头的行除外Assembly.Load

\n\n

值得注意的一件有趣的事情是我从构建服务器得到了同样的异常。上述解决方案将其修复在构建服务器上。不在我们的测试环境中。

\n\n

我在这里缺少什么?谢谢。

\n

Gan*_* R. 0

我不确定问题是什么,但当从非管理员用户帐户模拟管理员时,Windows 模拟无法正常工作。您的最终用户可能是非管理员,当您尝试模拟时,它会失败并导致文件访问错误。