2

セキュリティ更新プログラム KB4022726 を適用した後、Windows 検索を使用してリモート共有上のドキュメントを検索していますが、この機能は壊れています。

私たちの実装では、C# での Windows 検索に oledb コネクタを使用しています。

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):
System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr) によって System.Data.OleDb.OleDbDataReader.GetRowHandles() によって 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;
  }
}
4

1 に答える 1