リモートマシンに接続してインデックス作成ステータスを照会する簡単なプログラムを作成しようとしています。
これが私のマシンでそれを行うコードです。これは正常に動作します。
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"
タイプ 'System.Runtime.InteropServices.COMException' の未処理の例外が IndexStatus.exe で発生しました
追加情報: 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 は 1 つのカタログのみをサポートしており、SystemIndex という名前が付けられています。
これを理解する方法がわかりません。おそらく、メソッドは異なるマシンから選択することができませんか? もしそうなら、PsExec のようなものを使用する以外に、リモート カタログに接続してこれらのクエリを作成する方法はありますか?
Re Ben N の回答:これは私にとって深海になり始めていますが、恐れているというよりも魅了されています。:)いくつかの変更の後、あなたのコードは私のために働いた:
CSearchManagerClass manager = System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));
Visual Studio 2015 ではコンパイルされず、次のエラーが発生します。
2 番目のエラーは、キャストを追加するだけで簡単に修正できました。
CSearchManagerClass manager = (CSearchManagerClass)System.Runtime.InteropServices.Marshal.CreateWrapperOfType(comManager, typeof(CSearchManagerClass));
「相互運用タイプを埋め込むことはできません」というエラー メッセージについては、この質問を見つけました。推奨される解決策は 2 つあります。
Embed Interop Types
Microsoft.Search.Interop 参照のプロパティを に変更しますFalse
。に変更
CSearchManagerClass
しCSearchManager
ます。
最初の解決策はプログラムをコンパイルしますが、移植性に影響します。これで、プログラムは .dll がインストールされていないコンピューターでは実行されなくなります。2番目のソリューションはコンパイルされますが、スローされます
タイプ 'System.ArgumentException' の未処理の例外が mscorlib.dll で発生しました
追加情報: タイプは __ComObject であるか、__ComObject から派生したものである必要があります。
自分のマシンに対して実行すると、その正確な行に。
しかし、別の問題があり、これについては私にはわかりません。同僚のマシンに対して実行すると (私は彼のコンピューターの管理者であり、Visual Studio は管理者権限で実行されています)、取得しています
タイプ 'System.UnauthorizedAccessException' の未処理の例外が mscorlib.dll で発生しました
追加情報: CLSID {7D096C5F-AC08-4F1F-BEB7-5C22C517CE39} を持つリモート コンポーネントの COM クラス ファクトリをマシン computername から取得できませんでした。次のエラーが原因でした: 80070005 computername。
私は COM についてほとんど何も知らないので、これは少し怖いです。彼のコンピューターと私のコンピューターで DCOM が有効になっていることを確認しました。しかし、コンポーネント サービスで彼のコンピュータにアクセスしようとすると、DCOM Config がツリーに表示されません。また、ドメイン上の他のコンピューターでも同じことが起こります (すべてのワークステーションで管理者権限を持っていますが)。このブログは、それがファイアウォールの問題である可能性があることを示唆しています。
あなたの答えは両方とも間違いなく報奨金に値しますが、何か提案があれば、または何が起こっているのかを明らかにすることができれば、私は非常に感謝しています. うまくいかなくてもいいのですが、ここから少しでも多くの知識を吸収したいと思っています。