我正在尝试编写一个简单的程序,该程序将连接到远程计算机并查询索引状态。
这是在我的机器上执行的代码。这样就可以了。
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
。
更改CSearchManagerClass
为CSearchManager
。
第一种解决方案使程序可以编译,但是会影响可移植性。现在,该程序将无法在没有.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] 删除。
我来说两句