模拟其他用户时发生灾难性故障

我正在使用与WCF集成的企业库验证块。 它报告System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))当我使用WIN32 API LogonUser和WindowsIdentity.Impersonate冒充其他用户时System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED)) 。 看起来什么时候在加载配置时获得安全证据是错误的。 如果我删除了模拟编码,它的工作原理没有任何错误。 这些是异常堆栈跟踪的一部分,希望你给一些帮助者。 谢谢。

System.Runtime.InteropServices.COMException (0x8000FFFF): Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
   at System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl)
   at System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence()
   at System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate)
   at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
   at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed)
   at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
   at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate)
   at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
   at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
   at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
   at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
   at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
   at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
   at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
   at System.Configuration.ClientConfigurationHost.CreateConfigurationContext(String configPath, String locationSubPath)
   at System.Configuration.Internal.DelegatingConfigHost.CreateConfigurationContext(String configPath, String locationSubPath)
   at System.Configuration.BaseConfigurationRecord.get_ConfigContext()

在我看来,问题是System.Configuration在加载app.config时自身模拟。 我能够通过运行解决此问题

ConfigurationManager.GetSection("system.xml/xmlReader");

而不是冒充。 这样做导致后来的冒充成功。

编辑︰稍微澄清,我相信这样做会导致app.config加载并缓存到内存中,所以导致问题的代码路径只执行一次,并与原始凭据。


经过长时间的战斗和许多ProcMon捕获后,我发现在某些情况下,在互操作期间和冒充时检查安全区时出现故障。 它与此KB有关:

https://support.microsoft.com/en-us/kb/945701?wa=wsignin1.0

如果您检查注册表节点和密钥的添加结束位置,而不是按照指示添加w3wp.exe,请添加您自己的可执行文件的文件名。 这对我有用 - YMMV。


请在MS论坛中查看我对此主题的回复:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/

这是线程标题:Connection Pooling随机抛出COM异常。

您可以搜索LogonUser页面上的文本。

链接地址: http://www.djcxy.com/p/64469.html

上一篇: Catastrophic failure when Impersonate other user

下一篇: What's the use of ^:dynamic on a defonce?