5

リモートマシンに接続してインデックス作成ステータスを照会する簡単なプログラムを作成しようとしています。

これが私のマシンでそれを行うコードです。これは正常に動作します。

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 TypesMicrosoft.Search.Interop 参照のプロパティを に変更しますFalse

  • に変更CSearchManagerClassCSearchManagerます。

最初の解決策はプログラムをコンパイルしますが、移植性に影響します。これで、プログラムは .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 がツリーに表示されません。また、ドメイン上の他のコンピューターでも同じことが起こります (すべてのワークステーションで管理者権限を持っていますが)。このブログは、それがファイアウォールの問題である可能性があることを示唆しています。

あなたの答えは両方とも間違いなく報奨金に値しますが、何か提案があれば、または何が起こっているのかを明らかにすることができれば、私は非常に感謝しています. うまくいかなくてもいいのですが、ここから少しでも多くの知識を吸収したいと思っています。

4

1 に答える 1

1

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ます。

これの PowerShell バージョンについては、スーパー ユーザーの質問に対する私の回答を参照してください

于 2016-07-07T17:04:08.630 に答える