指定计算机名称时,无法在我自己的计算机上查询SystemIndex

米歇尔·马斯尼(MichałMasny)

我正在尝试编写一个简单的程序,该程序将连接到远程计算机并查询索引状态。

这是在我的机器上执行的代码。这样就可以了。

using System;
using Microsoft.Search.Interop;

namespace IndexStatus
{
    class Program
    {
        static void Main(string[] args)
        {
            CSearchManager manager = new CSearchManager();
            CSearchCatalogManager catalogManager = manager.GetCatalog("SystemIndex");
            _CatalogPausedReason pReason;
            _CatalogStatus pStatus;
            Console.WriteLine(catalogManager.NumberOfItems().ToString());
            int plIncrementalCount;
            int plNotificationQueue;
            int plHighPriorityQueue;
            catalogManager.NumberOfItemsToIndex(out plIncrementalCount, out plNotificationQueue, out plHighPriorityQueue);
            Console.WriteLine(plIncrementalCount.ToString());
            Console.WriteLine(plNotificationQueue.ToString());
            Console.WriteLine(plHighPriorityQueue.ToString());
            catalogManager.GetCatalogStatus(out pStatus, out pReason);
            Console.WriteLine(pStatus.ToString() + " " + pReason.ToString());
            Console.ReadLine();
        }
    }
}

然而,当我打电话GetCatalog"mycomputername.SystemIndex",而不是"SystemIndex",我得到

IndexStatus.exe中发生了类型为'System.Runtime.InteropServices.COMException'的未处理异常

附加信息:HRESULT的异常:0x80042103

在此处输入图片说明

Visual Studio 2015在Windows 8.1上以管理员权限运行。目标计算机将主要是Windows 7系统,并且该程序将主要从Windows 10系统运行。我正在使用从此处下载的Microsoft Windows Search 3.X SDK中的Microsoft.Search.Interop.dll 我关掉防火墙以防万一,但显然没有。

我已经检查了如果我像一样完全在废话中调用该函数,是否会遇到相同的异常"sdfd"而且我发现了这一点

MSS_E_CATALOGNOTFOUND-0x80042103-(8451)WindowsSearchErrors.h

The specified catalog was not found. Check to see if it was deleted, or if there are errors in your application code.

我尝试使用“ localhost”代替计算机名称,但这没有帮助。

MSDN文档这样说:

当前,Microsoft Windows桌面搜索(WDS)3.0仅支持一个目录,并将其命名为SystemIndex。

我不确定如何理解这一点。也许该方法无法在不同的机器之间进行选择?如果是这样,除了使用PsExec之类的方法之外,是否有其他方法可以连接到远程目录并进行这些查询?

Re Ben N的回答:对我而言,这已成为深水,但我比着迷更着迷。:)经过几次修改,您的代码对我有用:

CSearchManagerClass manager = System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));无法在Visual Studio 2015上编译,并且会出现以下错误:

在此处输入图片说明 在此处输入图片说明

通过添加强制转换很容易解决第二个错误:

CSearchManagerClass manager = (CSearchManagerClass)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));

至于“无法嵌入Interop类型”错误消息,我发现了这个问题有两种建议的解决方案:

  • Embed Interop Types将Microsoft.Search.Interop引用属性更改False

  • 更改CSearchManagerClassCSearchManager

第一种解决方案使程序可以编译,但是会影响可移植性。现在,该程序将无法在没有.dll的计算机上运行。第二个解决方案编译但抛出

mscorlib.dll中发生了类型为'System.ArgumentException'的未处理异常

附加信息:类型必须是__ComObject或从__ComObject派生。

当我在自己的机器上运行它时,就在那条线上。

但是还有另一个问题,我对此一无所知。当我在同事的计算机上运行它时(我是他计算机上的管理员,而Visual Studio正在以管理员权限运行)

mscorlib.dll中发生了类型为'System.UnauthorizedAccessException'的未处理异常

附加信息:由于以下错误,从计算机computername检索具有CLSID {7D096C5F-AC08-4F1F-BEB7-5C22C517CE39}的远程组件的COM类工厂失败,原因是:80070005 computername。

这确实使我有些害怕,因为我几乎对COM一无所知。我检查了他的计算机和我的计算机上是否已启用DCOM。但是,当我尝试在Component Services中转到他的计算机时,它显示为,在此处输入图片说明并且树中缺少DCOM Config。对于域中的其他计算机也是如此(即使我在所有工作站上都​​具有管理员权限)。该博客建议这可能是防火墙问题,如果是的话,那将是无法克服的问题。

您的两个答案都绝对是值得的,但是如果您有任何建议或能够对正在发生的事情有所了解,我将不胜感激。如果我无法使其正常运行,那很好,但是我当然想从中获得尽可能多的知识。

GetCatalog 不支持连接到远程计算机,但是我们可以使用COM创建一个引用目标计算机上服务的搜索管理器对象。

// Assume targetMachine has the name of the target computer
Guid guid = new Guid("{7D096C5F-AC08-4F1F-BEB7-5C22C517CE39}");
Type managerType = Type.GetTypeFromCLSID(guid, targetMachine, true);
var comManager = Activator.CreateInstance(managerType);
CSearchManagerClass manager = (CSearchManagerClass)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));

然后,您应该能够manager使用本地计算机的管理员一样使用如果在与远程计算机联系时遇到问题,COMException则会在CreateInstance呼叫中引发a

对于PowerShell版本,请参阅我对“超级用户”问题的回答

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用其他计算机名称访问我的计算机上的共享

来自分类Dev

为什么我无法在特定计算机上打开特定rar文件,但在其他计算机上打开该文件?

来自分类Dev

检测计算机名称

来自分类Dev

恢复以前的计算机名称

来自分类Dev

如何更改计算机名称

来自分类Dev

如何更改计算机名称?

来自分类Dev

更改计算机名称 Ubuntu

来自分类Dev

Windows 10:更改我的计算机名称

来自分类Dev

启动实例时设置计算机名称

来自分类Dev

我如何更改Windows 7中的“完整计算机名称”,而保持(简短)计算机名称不变?

来自分类Dev

如何确定计算机上的MAC地址?

来自分类Dev

在特定计算机上安装Windows服务失败?

来自分类Dev

仅在特定计算机上的 Delphi 访问冲突

来自分类Dev

远程计算机上的WMIC,采用计算机名称或IP的列表形式

来自分类Dev

Skype动画无法在我的Ubuntu计算机上运行

来自分类Dev

引导加载程序无法在我的计算机上运行

来自分类Dev

Skype动画无法在我的Ubuntu计算机上运行

来自分类Dev

引导加载程序无法在我的计算机上运行

来自分类Dev

我无法在计算机上安装intel HAXM

来自分类Dev

DVD DL无法在我的计算机上启动

来自分类Dev

SSH无法在一台特定计算机上运行

来自分类Dev

无法在一台特定计算机上加载网页

来自分类Dev

Git LFS无法在特定计算机上克隆特定文件

来自分类Dev

仅在特定计算机上调用Web服务时显示401

来自分类Dev

ADAL:在特定计算机上获取令牌时出错

来自分类Dev

无法通过自己的IP(192.168.1.102)连接我的计算机

来自分类Dev

锁定计算机的鼠标事件

来自分类Dev

当我复制到计算机上时,无法获得正常工作的jsfiddle

来自分类Dev

如何指定计算机启动时要运行的程序?[拱]

Related 相关文章

  1. 1

    使用其他计算机名称访问我的计算机上的共享

  2. 2

    为什么我无法在特定计算机上打开特定rar文件,但在其他计算机上打开该文件?

  3. 3

    检测计算机名称

  4. 4

    恢复以前的计算机名称

  5. 5

    如何更改计算机名称

  6. 6

    如何更改计算机名称?

  7. 7

    更改计算机名称 Ubuntu

  8. 8

    Windows 10:更改我的计算机名称

  9. 9

    启动实例时设置计算机名称

  10. 10

    我如何更改Windows 7中的“完整计算机名称”,而保持(简短)计算机名称不变?

  11. 11

    如何确定计算机上的MAC地址?

  12. 12

    在特定计算机上安装Windows服务失败?

  13. 13

    仅在特定计算机上的 Delphi 访问冲突

  14. 14

    远程计算机上的WMIC,采用计算机名称或IP的列表形式

  15. 15

    Skype动画无法在我的Ubuntu计算机上运行

  16. 16

    引导加载程序无法在我的计算机上运行

  17. 17

    Skype动画无法在我的Ubuntu计算机上运行

  18. 18

    引导加载程序无法在我的计算机上运行

  19. 19

    我无法在计算机上安装intel HAXM

  20. 20

    DVD DL无法在我的计算机上启动

  21. 21

    SSH无法在一台特定计算机上运行

  22. 22

    无法在一台特定计算机上加载网页

  23. 23

    Git LFS无法在特定计算机上克隆特定文件

  24. 24

    仅在特定计算机上调用Web服务时显示401

  25. 25

    ADAL:在特定计算机上获取令牌时出错

  26. 26

    无法通过自己的IP(192.168.1.102)连接我的计算机

  27. 27

    锁定计算机的鼠标事件

  28. 28

    当我复制到计算机上时,无法获得正常工作的jsfiddle

  29. 29

    如何指定计算机启动时要运行的程序?[拱]

热门标签

归档