Frage

Ich habe Probleme beim direkten Zugriff auf Win32_OperatingSystem Verwaltungsklasse, die über WMI verfügbar gemacht wird.

Es handelt sich um eine Singleton-Klasse, und ich bin mir ziemlich sicher, dass „Win32_OperatingSystem=@“ die richtige Pfadsyntax ist, um die Instanz eines Singletons abzurufen.

Der Aufruf von InvokeMethod erzeugt die am Ende der Frage aufgeführte Ausnahme, ebenso wie der Zugriff auf die ClassPath-Eigenschaft (kommentierte Zeile).

Was mache ich falsch?

[Mir ist bewusst, dass ich ManagementObjectSearcher/ObjectQuery verwenden kann, um eine Sammlung von Win32_OperatingSystem zurückzugeben (die nur eines enthalten würde), aber da ich weiß, dass es sich um einen Singleton handelt, möchte ich direkt darauf zugreifen.]


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 wurde erwischt Message = "Invalid Object Path" Source = "System.Management" Stacktrace:at system.management.managementException.throwwithextendedInfo (ManagementStatus errorCode) at system.management.managementObject.initialize (boolean getObject) at system.management.managementBaseObject.get_wbemObject () at system.management.management.Get_classesPath () at system.management. .GetMethodParameters (String methodName, ManagementBaseObject & Inparameters, IwBemClassObjectFreethreadede & InparametersClass, IwbemClassObjectFreethrodede & OutparametersClass) bei System.management.managementObject.invokemethod (String -Methodname, Objekt, Objekt, Objekt, Objekt, Objekt [] [] argumentieren) Argumentation [] argumentieren)


Danke für die Antworten.

Nick - Ich weiß nicht, wie ich das machen soll :)

Uros - Ich hatte den Eindruck, dass es sich um eine Singleton-Klasse handelte Das MSDN-Seite.Außerdem wird beim Öffnen der Klasse im Dienstprogramm WBEMTest angezeigt Das.


Der Instanzendialog zeigt:„1 Objekte“ und „max.Charge:1“ in diesen Feldern und listet „Win32_OperatingSystem=@“ auf.

Es wurde bestätigt, dass das ManagementScope funktioniert, daher weiß ich nicht, was los ist.Ich bin ein WMI-Neuling, aber dies scheint einer der einfachsten Anwendungsfälle zu sein!

War es hilfreich?

Lösung

Wow, ist die Welt zu verändern. Sorry, ich wusste nicht, dass Sie Vista verwendet haben. Wie Sie hier sehen können, waren die Dinge in Windows XP anders zurück. Also, was passiert, wenn Sie die „Instanzen“ Buton klicken?

Andere Tipps

Win32_OperatingSystem ist kein Singleton-Klasse - wenn Sie ihre Qualifikations überprüfen, werden Sie sehen, dass es keine Singleton-Qualifikationsspiel für sie definiert sind, so dass Sie ManagementObjectSearcher.Get verwenden () oder ManagementClass.GetInstances (), obwohl gibt es nur eine Instanz der Klasse. Win32_OperatingSystem Schlüsseleigenschaft ist Name, so gibt es eine Option, um die Instanz direkt zu bekommen, mit

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

aber nach meiner Erfahrung, OSName ist immer so etwas wie:

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

so mit Managementobject ist wahrscheinlich die einfachste Lösung.

Ich habe gerade diese einfache Anwendung versucht, die ok arbeitete

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);
            }
        }
    }
}

Sehen Sie, wenn dies für Sie? Ich habe es in Visual Studio ausführen, die ich normalerweise als Administrator unter Vista x64 ausgeführt werden.

Ich bin nicht 100% der Antwort sicher, aber haben Sie versucht, Reflektor zu schauen, was Managementobject tut? Es kann Ihnen einige Ahnung, was Sie falsch machen.

Ich würde wahrscheinlich eine Abfrage konstruieren, die die Instanz bekommt wo Primary = true. Ich habe nicht Win32_OperatingSystem in einer Weile benutzt, aber ich mich zu erinnern, mehrere Instanzen immer, und derjenige, der zur Zeit hatte gleich wahr Primary wurde gestartet.

  

Duncan schrieb:

     

Die Instanzen Dialog zeigt: "1 Objekte" und "max Charge. 1" in diesen Bereichen und> Listen "Win32_OperatingSystem = @"

Es sieht sicher, wie es funktionieren soll. Sie könnten Ihren Code mit einer anderen Singletonklasse testen, wie:

"Win32_WMISetting = @"

und sehen, ob Sie immer noch die Ausnahme erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top