C# 如何在本地和远程计算机上同时使用Windows搜索服务?

C# 如何在本地和远程计算机上同时使用Windows搜索服务?,c#,oledbconnection,oledbcommand,windows-search,C#,Oledbconnection,Oledbcommand,Windows Search,我正在从事一个C#WPF项目,该项目可以搜索指定目录路径上的文件。这些路径可以在本地机器上,也可以在远程机器上,所以我必须在这两个机器上解决它 起初,我尝试使用具有本地路径的查询,但OleDbDataReader类返回的记录为零。我确信我已按相应的方式调整了所有内容,例如,索引选项包含正确的路径:-或在文件资源管理器中:-并且文件类型包含列表中的txt文件: 本地搜索的代码: CSearchManager manager = new CSearchManager(); CSearchCatalo

我正在从事一个C#WPF项目,该项目可以搜索指定目录路径上的文件。这些路径可以在本地机器上,也可以在远程机器上,所以我必须在这两个机器上解决它

起初,我尝试使用具有本地路径的查询,但OleDbDataReader类返回的记录为零。我确信我已按相应的方式调整了所有内容,例如,索引选项包含正确的路径:-或在文件资源管理器中:-并且文件类型包含列表中的txt文件:

本地搜索的代码:

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();
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();
后来我尝试连接到Windows服务器。服务器路径正确,因为我可以通过文件浏览器浏览服务器文件-这是一个VPN连接-。索引选项也在此处正确调整。但问题是我不能使用上面的连接方法,因为GetCatalog方法不支持远程连接-所以我尝试了这个方法。我发现了一个例子,如下所示,但这里有一个例外,如:
System.UnauthorizedAccessException:“由于以下错误,从计算机[SERVER NAME]检索CLSID为{[CLSID]}的远程组件的COM类工厂失败:80070005[SERVER NAME]”。

问题是当我尝试添加CLSID时。我不知道我在哪里可以得到这个ID,因为我没有找到任何具体的解决办法。这里我需要一些帮助,比如我的案例中的CLSID是什么,以及如何获得它

远程搜索的代码:

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();
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();