WindowsIdentity.Impersonate在2018年4月(1803)更新

时间:2018-05-27 23:41:19

标签: windows-10 impersonation .net-4.6

我们的安装程序应用使用以下代码验证服务帐户权限:

try
{
    using (svcIdentity.Impersonate())
    {
        using (SqlConnection conn = new SqlConnection(builder.ConnectionString))  // <<<
        {
            conn.Open();
            ...

为简洁而省略:

  • 使用advapi32.dll和svcIdentity中的Win32 LSA LogonUser函数获取LOGON32_LOGON_SERVICE WindowsIdentity。
  • builder是一个SqlConnectionStringBuilder,它构建一个到本地SQL Server数据库的连接字符串。

定位.Net Framework 4.6。

应用程序在app.manifest中运行升级(requestedExecutionLevel level='requireAdministrator'。)

此代码运行完美,直到Windows 10版本1803(2018年4月更新)。从那时起,SqlConnection构造函数(标记为&lt;&lt;&lt;&lt;)引发异常:

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没有连接字符串部分,自2017年以来,测试计算机上的machine.configsecurity.config没有变化。

代码适用于:

  • 评论using (svcIdentity.Impersonate)

  • 在SqlConnection构造函数({)正上方的行上设置断点并单步执行代码(???)时,

  • 将我们的应用程序添加到KB945701

    末尾提到的注册表项时

关于Internet Explorer 9的修补程序的知识库文章似乎无关,除了堆栈跟踪的第一行上的GetLocationEvidence似乎考虑了SecurityZone,相应的注册表中列出了哪些应用程序关键似乎无视。

现在我的问题:

任何人都可以帮助我了解到底出了什么问题,是否有更好的方法来解决这个问题而不是使用模糊的注册表项?这个注册表更改的作用似乎是“巧合”,如果我们不明白为什么它会失败,我担心我们的代码可能会再次崩溃。

THX。

0 个答案:

没有答案