c# - KB4022726 破坏 OleDb 上的 Windows 搜索查询

标签 c# .net oledb windows-search

我们正在使用 Windows 搜索来搜索远程共享上的文档,在应用安全更新 KB4022726 后,此功能会中断。

我们的实现是使用 oledb 连接器在 C# 中进行 Windows 搜索

Are there any workarounds besides uninstalling KB4022726?

更新: CVE-2017-8543可能有关系。

示例程序 - 安装 KB4022726 后失败

using System;
using System.Data.OleDb;

namespace windowssearchtest
{
  class Program
  {
    static void Main(string[] args)
    {
      var computer = "searchserver";
      var filepath = @"documents";

      var query = $@"
Select System.Itemname
FROM {computer}.systemindex 
WHERE SCOPE='file:\\{computer}\{filepath}'";

      const string ConnectionString = "Provider=Search.CollatorDSO;Extended Properties=\"Application=Windows\"";

      OleDbDataReader myDataReader = null;
      OleDbConnection myOleDbConnection = new OleDbConnection(ConnectionString);
      OleDbCommand myOleDbCommand = new OleDbCommand(query, myOleDbConnection);
      myOleDbCommand.CommandTimeout = 180;

      try
      {
        myOleDbConnection.Open();
        myDataReader = myOleDbCommand.ExecuteReader();
        if (myDataReader != null && myDataReader.HasRows)
        {
          Console.WriteLine($"HasRows: {myDataReader.HasRows}");
          while (myDataReader.Read())
          {
          }
        }
      }
      catch (Exception e)
      {
        Console.WriteLine(e.ToString());
      }
    }
  }
}

错误:

System.Data.OleDb.OleDbException (0x80004005): Uspecificeret fejl
ved System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr) ved System.Data.OleDb.OleDbDataReader.GetRowHandles() ved System.Data.OleDb.OleDbDataReader.ReadRowset() ved System.Data.OleDb.OleDbDataReader.Read() ved windowssearchtest.Program.Main(String[] args) i C:\projects_local\windowssearchtest\windowssearchtest\Program.cs:linje 48

更新 2017-06-26 我还在运行 win10 的本地计算机上重现了此错误 - 1703 Windows 搜索仍然有效,但当您到达结果集末尾时,或者 .ExecuteReader() 上为空时,将会抛出错误

我们做了一个破解来解决这个问题,我不会推荐这个:

//pseudo code
while (Wrap(myDataReader))
<snip>
function Wrap(myDataReader)
{
  try
  {
    return myDataReader.Read();
  }
  catch (ex)
  {
   if(ex.HResult == -2147467259) return false; //0x80004005
   throw;
  }
}

最佳答案

看来该问题已在 MS 的最新可选更新中得到解决:

Win7、服务器2008: https://support.microsoft.com/en-us/help/4022168/windows-7-sp1-windows-server-2008-r2-sp1-update-kb4022168

Win 8.1、服务器 2012: https://support.microsoft.com/en-us/help/4022720/windows-8-1-windows-server-2012-r2-update-kb4022720

已在我的测试服务器(2008 年、2012 年)上安装了这些更新,但现在没有收到该错误!

关于c# - KB4022726 破坏 OleDb 上的 Windows 搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44636537/

相关文章:

c# - Visual Studio 在停止调试器后保持句柄打开

c# - 带发现的 WCF 失败,套接字在 XP 的上下文中无效?

c# - 检查目标方法可以在 .Net 中抛出的所有可能的异常?

c# - 使用 C# 使用 OleDb 解析 CSV

c# - Visual Studio 项目代码分析器路径已更改

c# - VS2017 - 如何删除关于依赖验证的每类警告

.net - Windows窗体控件库;托管和非托管

c# - 为什么我的 C# 方法没有被调用?

c# - C#中通过OLEDB导入CSV文件时如何指定分隔符

c# - 使用 C# 查询 Excel 文件,数字单元格问题