WMI - direkter Zugriff auf die singleton-Instanz der Win32_OperatingSystem -
Habe ich Probleme, direkt auf die Win32_OperatingSystem - management-Klasse, ausgesetzt ist, über WMI.
Es ist eine singleton-Klasse, und ich bin ziemlich sicher, dass "Win32_OperatingSystem=@" ist der richtige Pfad-syntax, um die Instanz von singleton.
Den Aufruf von InvokeMethod produziert die Ausnahme unten die Frage, wie der Zugriff auf die ClassPath-Eigenschaft (auskommentierte Zeile).
Was mache ich falsch?
[Ich bin mir bewusst, dass ich verwenden können, ManagementObjectSearcher/ObjectQuery für die Rückgabe einer Sammlung von Win32_OperatingSystem (die enthalten nur eine), aber da ich weiß, dass es ein singleton ist, möchte ich direkt auf ihn 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 gefangen wurde
Message="Ungültige Objekt-Pfad"
Source="System.Management"
StackTrace:
System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
System.Management.ManagementObject.Initialize(Boolean getObject)
System.Management.ManagementBaseObject.get_wbemObject()
System.Management.ManagementObject.get_ClassPath()
System.Management.ManagementObject.GetMethodParameters(String methodName, ManagementBaseObject& inParameters, IWbemClassObjectFreeThreaded& inParametersClass, IWbemClassObjectFreeThreaded& outParametersClass)
System.Management.ManagementObject.InvokeMethod(String methodName, Object[] args)
Danke für die Antworten.
Nick - ich weiß nicht, wie man dies tun 🙂
Uros - ich war unter den Eindruck, dass es eine singleton-Klasse, weil der diese MSDN-Seite. Auch, öffnen Sie die Klasse in WBEMTest-Dienstprogramm zeigt diese.
Den Instanzen-dialog zeigt: "1 Objekte" und "max. batch: 1" in diesen Feldern und Listen "Win32_OperatingSystem=@"
Dem ManagementScope wird überprüft, wie die Arbeit, so dass ich nicht weiß, was Los ist. Ich bin ein WMI-Neuling, aber dies scheint wie eine der einfachsten Anwendungsfälle!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wow, die Welt ist im Wandel. Sorry, ich wusste nicht, Sie waren mit Vista. Wie Sie sehen können hier waren die Dinge anders wieder in Windows XP. Also, was passiert, wenn Sie klicken Sie auf die "Instanzen" buton?
Win32_OperatingSystem ist nicht eine singleton-Klasse - wenn Sie prüfen, Ihre Qualifikation, Sie werden sehen, dass es keine Singleton-qualifier definiert, so müssen Sie die ManagementObjectSearcher.Get() oder ManagementClass.GetInstances (), obwohl es nur eine Instanz der Klasse. Win32_OperatingSystem-key-Eigenschaft ist der Name, so gibt es eine option, um die Instanz direkt, mit
aber in meiner Erfahrung, Betriebssystemname ist immer etwas wie:
"Microsoft Windows XP Professional|C:\WINDOWS|\Device\Harddisk0\Partition1"
also mit ManagementObjectSearcher ist wahrscheinlich die einfachste Lösung.
Ich habe einfach versucht, diese einfache app, die funktioniert hat
Sehen, ob das funktioniert für Sie? Ich habe es in Visual Studio, die ich normalerweise als administrator ausführen unter Vista x64.
Bin ich mir nicht 100% sicher beantworten, aber haben Sie versucht, mit Reflektor, zu schauen, was ManagementObjectSearcher tut? Es kann Ihnen eine Vorstellung davon, was Sie falsch machen.
Würde ich wohl eine Abfrage erstellen, die bekommt die Instanz, wo " Primary = true. Ich habe nicht verwendet Win32_OperatingSystem in eine Weile, aber ich scheine zu erinnern, immer mehrere Instanzen, und die, die derzeit gestartet hatte Primär gleich true.
Sieht es sicher, wie es funktionieren sollte. Man könnte testen Sie Ihren code mit anderen singleton-Klasse wie:
"Win32_WmiSetting=@"
und sehen, ob Sie immer noch die Ausnahme.