Как использовать службу поиска Windows как на локальном, так и на удаленном компьютере? - PullRequest
1 голос
/ 27 апреля 2019

Я работаю над C # WPF проектом, который может искать файлы по указанным путям каталогов. Эти пути могут быть как на локальном, так и на удаленном компьютере, поэтому я должен решить его на обоих.

Сначала я попытался использовать запрос с локальным путем, но класс OleDbDataReader возвращается с нулевыми записями. Я уверен, что все настроил соответствующим образом, например, Параметры индексирования содержат правильный путь: Indexing Options contains the correct path - или в проводнике: or in file explorer - и Типы файлов содержат текстовый файл в списке: File Types contains txt file

Код для локального поиска:

CSearchManager manager = new CSearchManager();
CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper();
queryHelper.QuerySelectColumns = "System.ItemName,System.FileName,System.Author,System.ItemUrl,System.ItemType";
queryHelper.QueryWhereRestrictions = @"AND SCOPE='file:D:\testIndexing' AND System.FileName LIKE '*.txt'";
string userQuery = "SELECT System.FileName FROM SystemIndex WHERE SCOPE='file:D:\testIndexing' AND System.FileName LIKE '*.txt'";
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery);

OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString);
conn.Open();
OleDbCommand command = new OleDbCommand(sqlQuery, conn);
using (OleDbDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        Console.WriteLine(reader.GetString(0));
        Console.WriteLine(reader[0]);
    }
}
conn.Close();

Позже я попытался подключиться к Windows Server. Путь к серверу правильный, потому что я могу просматривать файлы сервера через проводник - это соединение VPN. Параметры индексации также корректно настроены здесь. Но проблема в том, что я не могу использовать метод подключения, описанный выше, потому что метод GetCatalog не поддерживает удаленное подключение - поэтому я попробовал метод THIS . Я нашел пример, который можно увидеть ниже, но здесь я получил исключение: System.UnauthorizedAccessException: 'Retrieving the COM class factory for remote component with CLSID {[CLSID]} from machine [SERVER NAME] failed due to the following error: 80070005 [SERVER NAME].'

Проблема в том, что я пытался добавить CLSID. Я понятия не имею, где я могу получить этот идентификатор, потому что я не нашел никакого конкретного решения для этого. Здесь мне нужна помощь, например, что такое CLSID в моем случае и как его получить?

Код для удаленного поиска:

Guid guid = new Guid("{[CLSID]}"); // this is what I don't know how to provide
Type managerType = Type.GetTypeFromCLSID(guid, "SERVER_NAME", true);
var comManager = Activator.CreateInstance(managerType);
CSearchManagerClass manager = (CSearchManagerClass)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));

CSearchCatalogManager catalogManager = manager.GetCatalog("SERVER_NAME.SystemIndex");
CSearchQueryHelper queryHelper = catalogManager.GetQueryHelper();
queryHelper.QuerySelectColumns = "System.ItemName,System.FileName,System.Author,System.ItemUrl,System.ItemType";
queryHelper.QueryWhereRestrictions = @"AND SCOPE='file:\\SERVER_NAME\path\to\scope' AND System.FileName LIKE '*.txt'";

string userQuery = @"SELECT System.FileName FROM SystemIndex WHERE SCOPE='file:\\SERVER_NAME\path\to\scope' System.FileName LIKE '*.txt'";
string sqlQuery = queryHelper.GenerateSQLFromUserQuery(userQuery);

OleDbConnection conn = new OleDbConnection(queryHelper.ConnectionString);
conn.Open();
OleDbCommand command = new OleDbCommand(sqlQuery, conn);
using (OleDbDataReader reader = command.ExecuteReader())
{
    while (reader.Read())
    {
        Console.WriteLine(reader.GetString(0));
        Console.WriteLine(reader[0]);
    }
}
conn.Close();
...