3

WMIを介して公開されているWin32_OperatingSystem管理クラスに直接アクセスするのに問題があります。

これはシングルトンクラスであり、「Win32_OperatingSystem=@」がシングルトンのインスタンスを取得するための正しいパス構文であると確信しています。

InvokeMethodを呼び出すと、ClassPathプロパティ(コメント行)にアクセスする場合と同様に、質問の下部にリストされている例外が生成されます。

私は何が間違っているのですか?

[ManagementObjectSearcher / ObjectQueryを使用してWin32_OperatingSystemのコレクション(1つだけが含まれる)を返すことができることは知っていますが、シングルトンであることがわかっているので、直接アクセスしたいと思います。]


ManagementScope cimv2 = InitScope(string.Format(@"\\{0}\root\cimv2", this.Name));

ManagementObject os = new ManagementObject(
    cimv2,
    new ManagementPath("Win32_OperatingSystem=@"),
    new ObjectGetOptions());

//ManagementPath p = os.ClassPath;

os.InvokeMethod("Reboot", null);

System.Management.ManagementExceptionがキャッチされましたMessage="無効なオブジェクトパス"Source= "System.Management" StackTrace:at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)at System.Management.ManagementObject.Initialize(Boolean getObject)atSystem。 Management.ManagementBaseObject.get_wbemObject()at System.Management.ManagementObject.get_ClassPath()at System.Management.ManagementObject.GetMethodParameters(String methodName、ManagementBaseObject&inParameters、IWbemClassObjectFreeThreaded&inParametersClass、IWbemClassObjectFreeThreaded&outParametersClass)at System.Management.ManagementObject.InvokeMethod(String Object [] args)


返信ありがとうございます。

ニック-私はそれをどうやってやるのかわからない:)

ウロシュ-このMSDNページのおかげで、シングルトンクラスであるという印象を受けました。また、WBEMTestユーティリティでクラスを開くと、これが表示されます。


インスタンスダイアログには、これらのフィールドに「1オブジェクト」と「最大バッチ:1」が表示され、「Win32_OperatingSystem=@」が一覧表示されます。

ManagementScopeが機能していることが確認されているため、何が起きているのかわかりません。私はWMIの初心者ですが、これは最も単純なユースケースの1つのようです。

4

6 に答える 6

3

Win32_OperatingSystemはシングルトンクラスではありません-修飾子を確認すると、シングルトン修飾子が定義されていないことがわかります。そのため、存在している場合でも、ManagementObjectSearcher.Get()またはManagementClass.GetInstances()を使用する必要があります。クラスの1つのインスタンス。Win32_OperatingSystemのキープロパティはNameであるため、を使用してインスタンスを直接取得するオプションがあります。

ManagementObject OS = new ManagementObject(@"Win32_OperatingSystem.Name='OSname'")

しかし、私の経験では、OSNameは常に次のようなものです。

"Microsoft Windows XP Professional | C:\ WINDOWS | \ Device \ Harddisk0 \ Partition1"

したがって、ManagementObjectSearcherを使用するのがおそらく最も簡単な解決策です。

于 2008-09-15T19:03:42.010 に答える
2

このシンプルなアプリを試してみましたが、問題なく動作しました

using System;
using System.Management;

namespace WmiPlay
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ManagementScope cimv2 = new ManagementScope(@"\\.\root\cimv2");
                ManagementObject os = new ManagementObject(cimv2, new ManagementPath("Win32_OperatingSystem=@"), new ObjectGetOptions());
                Console.Out.WriteLine(os);
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex);
            }
        }
    }
}

これがあなたのために働くかどうか見てください?通常、Vista x64で管理者として実行するVisual Studioで実行しました。

于 2008-09-18T07:26:49.960 に答える
1

ダンカンは書いた:

インスタンスダイアログには、これらのフィールドに「1オブジェクト」と「最大バッチ:1」が表示され、「Win32_OperatingSystem=@」がリストされます。

確かにうまくいくようです。次のような別のシングルトンクラスを使用してコードをテストできます。

"Win32_WmiSetting = @"

それでも例外が発生するかどうかを確認します。

于 2008-09-16T17:34:35.370 に答える
1

おそらく、Primary = true のインスタンスを取得するクエリを作成するでしょう。しばらく Win32_OperatingSystem を使用していませんでしたが、複数のインスタンスを取得したことを覚えているようで、現在起動されているインスタンスの Primary は true でした。

于 2008-09-16T14:52:51.060 に答える
1

答えは 100% わかりませんが、Reflector を使用して ManagementObjectSearcher の機能を調べてみましたか? 何が間違っているかについての手がかりを与えるかもしれません。

于 2008-09-11T22:30:20.457 に答える
-1

うーん、世界が変わる。申し訳ありませんが、Vista を使用しているとは知りませんでした。ここでわかるように、Windows XP では状況が異なっていました。では、[インスタンス] ボタンをクリックするとどうなるでしょうか。

于 2008-09-16T14:40:10.123 に答える