windows-10 - WindowsIdentity.Impersonate 在 2018 年 4 月 (1803) 更新后抛出“灾难性故障(HRESULT 异常:0x8000FFFF (E_UNEXPECTED))”
问题描述
我们的安装程序应用使用以下代码来验证服务帐户权限:
try
{
using (svcIdentity.Impersonate())
{
using (SqlConnection conn = new SqlConnection(builder.ConnectionString)) // <<<
{
conn.Open();
...
为简洁起见省略:
svcIdentity
WindowsIdentity 是通过LogonUser
advapi32.dll 和 .dll 中的 Win32 LSA 函数获得的LOGON32_LOGON_SERVICE
。builder
是一个 SqlConnectionStringBuilder,它构建到本地 SQL Server 数据库的连接字符串。
针对 .Net Framework 4.6。
应用程序运行提升(requestedExecutionLevel level='requireAdministrator'
在 app.manifest 中)。
此代码在 Windows 10 版本 1803(2018 年 4 月更新)之前运行完美。此后,SqlConnection 构造函数(标记为 <<<)抛出异常:
The type initializer for 'System.Data.SqlClient.SqlConnection' threw an exception.
内部异常提供了更多洞察力:
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.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.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.RequireCompleteInit(IInternalConfigRecord record)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Data.SqlClient.SqlConnection..cctor()
堆栈跟踪指示 SqlConnection 构造函数无法打开配置部分。我们app.config
没有连接字符串部分,machine.config
并且security.config
在测试的计算机上自 2017 年以来没有变化。
该代码在以下情况下有效:
注释掉
using (svcIdentity.Impersonate)
,或者
在 SqlConnection 构造函数 ( ) 正上方的行上设置断点
{
并单步执行代码 (???) 时,或者
将我们的应用程序添加到KB945701末尾提到的注册表项时
那篇关于 Internet Explorer 9 修复的知识库文章似乎无关紧要,除了GetLocationEvidence
堆栈跟踪的第一行似乎考虑SecurityZone
到了相应注册表项中列出的应用程序似乎忽略了。
现在我的问题:
谁能帮助我了解到底出了什么问题,以及是否有比使用不起眼的注册表项更好的方法来解决此问题?此注册表更改有效似乎是一个“巧合”,如果我们不了解它失败的确切原因,我担心我们的代码可能会再次崩溃。
谢谢。
解决方案
推荐阅读
- typescript - 基于打字稿中的特定键过滤数组或反应原生?
- tooltip - 验证 Xpage 时工具提示不起作用
- android - 从 Flow 收集值时无法在没有延迟功能的情况下更新 ui
- c# - Wpf如何在框架中缩小页面?
- django - 连接两个模型字段并生成 sum 字段
- c++ - 枚举模块不能释放分配的空间和重复的模块名称
- mapbox - 如何在 Chrome 中禁用黑色轮廓
- javascript - TypeError:无法读取 discord.js 中未定义错误的属性“发送”
- flutter - 在 Flutter 中使用 for 循环在一个变量中获取多个 API 调用
- java - Java Swing:最新的 java.swing.text.View.modelToView() 事件