1

リモートのwin2008サーバーからすべての有効な機能を返そうとしています。そして、それはまったく問題ではありませんでした-私が正確に何を照会するかを知っている限り。

しかし、私が抱えている問題は、クエリで結果が見つからない場合、機能がインストールされているかどうかを検証するのに永遠に時間がかかることです。場合によっては最大2分かかります。(600を超えるノードをクエリする場合は十分ではありません)。

次のコードは、私が見つけた最速の方法ですが、私が言ったように、falseを返すには永遠にかかります。

 public bool serverFeatureEnabled(string machineName, Win32_ServerFeature_ID id)
    {
        ManagementClass serviceClass = new ManagementClass("Win32_ServerFeature");
        string strScope = string.Format(@"\\{0}\root\cimv2", machineName);
        ConnectionOptions conOpt = new ConnectionOptions();
        serviceClass.Scope = new ManagementScope(strScope, conOpt);

        foreach (ManagementObject obj in serviceClass.GetInstances())
        {
            if ((UInt32)obj["ID"] == (uint)id)
            {
                return true;
            }

        }
        return false;
    }

誰かがこれを行うためのより良いアイデアを持っていますか、それがWMIクエリをまったく使用していなくてもかまいません。

私がやりたいのは、それを少しスピードアップすることです。

理にかなっているといいのですが!

どんな助けでも大歓迎です。

編集:

Sergrey Vによって提案されたように、「ManagementObjectSearcherクラスを使用してサーバー機能から必要な機能を直接選択する」ことを試みました。

最初のfalseの戻りを高速化しましたが、完了するまでに約14秒かかります。これにより、クラスター内で照会されたすべてのサーバーの合計が140分になります。

編集2:

WBEMTEST(Windows Management Instrumentation Tester)を使用してWin32_ServerFeatureに対してテストを実行しようとしましたが、リモートコンピューターへの接続に問題があるようです-リモートコンピューターの1つに対してテストを実行すると、接続に約12秒、戻るに約2秒かかります。データ。

したがって、Sergrey Vによって提案されたソリューションは、これまでのところWMIクエリの最速のソリューションのようです。

4

4 に答える 4

2

アクションを連続して実行しないでください。WMI に内部的なボトルネックがあるかどうかはわかりませんが、最も明白な最適化は、すべてを並列で実行することです。

于 2012-08-02T11:10:52.610 に答える
2

ManagementObjectSearcher クラスを使用して、サーバー機能から必要な機能を直接選択してみてください。

            string serverName = "serverName";
            string className = "Win32_ServerFeature";
            string propertyName = "ID";
            int propertyValue = 144;
            string query = string.Format("SELECT * FROM {0} WHERE {1} = {2}", className, propertyName, propertyValue);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
            string scopePath = string.Format(@"\\{0}\root\cimv2", serverName);
            searcher.Scope = new ManagementScope(string.Format(scopePath));
            ManagementObjectCollection mCollection = searcher.Get();

            bool featureEnabled = mCollection.Count > 0;
于 2012-08-01T15:57:06.607 に答える
1

だからここに私がやったことがあります: まず第一に、M Afifi によって提案されたように、リスト内の各ノードに対して新しいタスクを開始しました。WMI クエリは、'Task.Factory.StartNew()'を使用して並列に実行されます。(System.Threading.Tasks を使用;)

リスト内のすべてのノードを完全に実行するには、約 12 秒かかります。

 referenceList.connectionNodes().ForEach(x =>
            {
                var genericTask = Task.Factory.StartNew(() =>
                    {
                        regkeyFactory.testParallelExecution(x);
                    });
            });

助けてくれてありがとう!

于 2012-08-07T10:32:02.547 に答える
-1

より高速な方法は、すべてを 1 つにスキャンすることです。ManagementClass を使用して HWID クラスを作成しました。マシンの一意のハードウェア ID を取得するのに 0.07 秒しかかかりません。

于 2015-10-28T08:13:18.320 に答える