Pergunta

Estou tendo problemas para acessar diretamente o Win32_OperatingSystem classe de gerenciamento que é exposta via WMI.

É uma classe singleton e tenho certeza de que "Win32_OperatingSystem = @" é a sintaxe do caminho correto para obter a instância de um singleton.

A chamada para InvokeMethod produz a exceção listada na parte inferior da pergunta, assim como o acesso à propriedade ClassPath (linha comentada).

O que estou fazendo de errado?

[Estou ciente de que posso usar ManagementObjectSearcher/ObjectQuery para retornar uma coleção de Win32_OperatingSystem (que conteria apenas um), mas como sei que é um singleton, quero acessá-lo diretamente.]


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 foi capturado Message="Caminho de objeto inválido " Source="Sistema.Gestão" StackTrace:em System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) em System.Management.ManagementObject.Initialize(Boolean getObject) em System.Management.ManagementBaseObject.get_wbemObject() em System.Management.ManagementObject.get_ClassPath() em System.Management.ManagementObject.GetMethodParameters(String methodName, ManagementBaseObject& inParameters, IWbemClassObjectFreeThreaded& inParametersClass, IWbemClassObjectFreeThreaded& outParametersClass) em System.Management.ManagementObject.InvokeMethod(String methodName, Object[] args)


Obrigado pelas respostas.

usuario - Não sei como fazer isso :)

Uros - Fiquei com a impressão de que era uma aula única por causa de esse Página MSDN.Além disso, abrir a classe no utilitário WBEMTest mostra esse.


A caixa de diálogo de instâncias mostra:"1 objetos" e "máx.lote:1" nesses campos e lista "Win32_OperatingSystem=@"

O ManagementScope foi verificado como funcionando, então não sei o que está acontecendo.Sou novato em WMI, mas este parece ser um dos casos de uso mais simples!

Foi útil?

Solução

Uau, o mundo está mudando.Desculpe, não sabia que você estava usando o Vista.Como você pode ver aqui, as coisas eram diferentes no Windows XP.Então, o que acontece quando você clica no botão "Instâncias"?

Outras dicas

Win32_OperatingSystem não é uma classe singleton - se você verificar seus qualificadores, verá que não há nenhum qualificador Singleton definido para ela, então você terá que usar ManagementObjectSearcher.Get() ou ManagementClass.GetInstances() mesmo que haja apenas uma instância da classe.A propriedade chave Win32_OperatingSystem é Name, então há uma opção para obter a instância diretamente, usando

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

mas na minha experiência, OSName é sempre algo como:

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

portanto, usar ManagementObjectSearcher é provavelmente a solução mais fácil.

Acabei de experimentar este aplicativo simples que funcionou bem

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

Veja se isso funciona para você?Eu o executei no Visual Studio, que normalmente executo como administrador no Vista x64.

Não tenho 100% de certeza da resposta, mas você já tentou usar o refletor para ver o que o ManagementObjectSearcher faz?Isso pode lhe dar alguma pista sobre o que você está fazendo de errado.

Eu provavelmente construiria uma consulta que obtivesse a instância em que Primary = true.Faz algum tempo que não uso o Win32_OperatingSystem, mas me lembro de ter obtido várias instâncias, e aquela que foi inicializada no momento tinha Primário igual a verdadeiro.

Duncan escreveu:

A caixa de diálogo de instâncias mostra:"1 objetos" e "máx.lote:1" nesses campos e >lists "Win32_OperatingSystem=@"

Com certeza parece que deveria funcionar.Você poderia testar seu código com outra classe singleton, como:

"Win32_WmiSetting=@"

e veja se você ainda recebe a exceção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top