Pregunta

Tengo problemas para acceder directamente al Win32_sistema operativo clase de gestión que se expone a través de WMI.

Es una clase singleton y estoy bastante seguro de que "Win32_OperatingSystem=@" es la sintaxis de ruta correcta para obtener la instancia de un singleton.

La llamada a InvokeMethod produce la excepción que se enumera al final de la pregunta, al igual que el acceso a la propiedad ClassPath (línea comentada).

¿Qué estoy haciendo mal?

[Soy consciente de que puedo usar ManagementObjectSearcher/ObjectQuery para devolver una colección de Win32_OperatingSystem (que contendría solo uno), pero como sé que es un singleton, quiero acceder a él directamente.]


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 fue detectado Message="Ruta de objeto no válida " source="System.Management" Seguimiento de pila:en System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) en System.Management.ManagementObject.Initialize(Boolean getObject) en System.Management.ManagementBaseObject.get_wbemObject() en System.Management.ManagementObject.get_ClassPath() at System.Management.ManagementObject.GetMethodParameters(String methodName, ManagementBaseObject& inParameters, IWbemClassObjectFreeThreaded& inParametersClass, IWbemClassObjectFreeThreaded& outParametersClass) en System.Management.ManagementObject.InvokeMethod(String methodName, Object[] args)


Gracias por las respuestas.

Mella - No sé cómo hacer eso :)

uros - Tenía la impresión de que era una clase única debido a este Página de MSDN.Además, al abrir la clase en la utilidad WBEMTest se muestra este.


El cuadro de diálogo de instancias muestra:"1 objetos" y "máx.lote:1" en esos campos y enumera "Win32_OperatingSystem=@"

Se ha verificado que ManagementScope funciona, así que no sé qué pasa.Soy un novato en WMI, ¡pero este parece uno de los casos de uso más simples!

¿Fue útil?

Solución

Vaya, el mundo está cambiando.Lo siento, no me di cuenta de que estabas usando Vista.Como se puede ver aquí, las cosas eran diferentes en Windows XP.Entonces, ¿qué sucede cuando haces clic en el botón "Instancias"?

Otros consejos

Win32_OperatingSystem no es una clase singleton: si verifica sus calificadores, verá que no hay ningún calificador Singleton definido para él, por lo que tendrá que usar ManagementObjectSearcher.Get() o ManagementClass.GetInstances() aunque solo haya una instancia de la clase.La propiedad clave Win32_OperatingSystem es Nombre, por lo que existe una opción para obtener la instancia directamente, usando

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

pero en mi experiencia, OSName siempre es algo como:

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

por lo que utilizar ManagementObjectSearcher es probablemente la solución más sencilla.

Acabo de probar esta sencilla aplicación que funcionó bien.

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

¿Ves si esto funciona para ti?Lo ejecuté en Visual Studio, que normalmente ejecuto como administrador en Vista x64.

No estoy 100% seguro de la respuesta, pero ¿ha intentado usar reflector para ver qué hace ManagementObjectSearcher?Puede que te dé alguna pista de lo que estás haciendo mal.

Probablemente construiría una consulta que obtenga la instancia donde Primario = verdadero.No he usado Win32_OperatingSystem por un tiempo, pero creo recordar que obtuve varias instancias y la que se inició actualmente tenía Primario igual a verdadero.

Duncan escribió:

El cuadro de diálogo de instancias muestra:"1 objetos" y "máx.lote:1" en esos campos y >enumera "Win32_OperatingSystem=@"

Seguro que parece que debería funcionar.Podrías probar tu código con otra clase singleton, como:

"Win32_WmiSetting="

y vea si todavía recibe la excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top