模仿其他用户时的灾难性故障

Leo*_*ong 7 .net

我使用与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))
   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()
Run Code Online (Sandbox Code Playgroud)

Cur*_*her 6

在我看来,问题是System.Configuration在加载app.config时会进行模拟.我能够通过运行来解决这个问题

ConfigurationManager.GetSection("system.xml/xmlReader");
Run Code Online (Sandbox Code Playgroud)

而不是冒充.这样做会导致后来的模仿成功.

编辑:为了略微澄清,我认为这样做会导致app.config被加载并缓存到内存中,因此导致问题的代码路径只执行一次并使用原始凭据.


Bra*_*non -1

请参阅我在 MS 论坛的此主题上对此的回复:

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

这是线程标题:连接池随机抛出 COM 异常。

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