Resolvendo problemas com o método ManagementObjectSearcher.Get()–Parte I

Olá.

Recentemente tive alguns problemas com o método acima, que fica no namespace System.Management. O seu objetivo é, entre outros, executar consultas WMI. Estas consultas são constantemente usadas em programas da plataforma .Net para retornar informações sobre o Windows e do hardware, como por exemplo, um número serial de HD, os serviços que estão sendo executados, etc.

Cenário

Em meu trabalho, detectei um problema durante a inicialização de um software. O problema é que este funcionou sempre em todas as estações, tanto Windows XP, 7, 32 e 64 bits, sempre rodou sem problemas.

A dificuldade estava em detectar primeiraimente a exception que estava sendo causada já que o programa nem inicializava. Após fazer várias alterações no software consegui capturar a exception seguinte:

System.Runtime.InteropServices.COMException (0x80040154)

Mas esse foi o início do problema. Pesquisando na Internet, encontrei diversos motivos que causam o problema, entre os quais:

  1. Versão do executável incompatível com o sistema. O programa devia ser compliado como x86 no Visual Studio.
  2. Bibliotecas e updates do Windows faltando.
  3. Bibliotecas OCX (usadas para execução de controles ACTIVEX) ausentes.
  4. DLL´s não registradas no sistema.

Nenhum destes era o caso. Subi uma máquina virtual zerada para tentar reproduzir o problema e não tive sucesso.

O Problema

Verificando a documentação de System.Management.ObjectSearcher e após fazer várias consultas ao Oráculo (Google) descobri que para fazer a consulta era necessário que o serviço WMI – Windows Management Instrumentation estivesse sendo executado.

Ao consultar o gerenciador de serviços do Windows 7 usando o aplicativo services.msc, verifiquei que havia um serviço WMI – Performance Adapter sendo executado e achei – erroneamente que esse era o serviço.

Bem, não era o caso. A dificuldade em desativar o serviço correto para causar o problema estava no fato de estar executando o Windows 7 em português, que chama o serviço de Testador de instrumentação de gerenciamento do Windows… como podem ver, isso dificultou bastante.

Mas, desativando o serviço acima consegui reproduzir o erro. Resta agora aguardar e testar se o mesmo está sendo executado na máquina do cliente – ainda  não tive tempo – por isso a “Parte I” neste artigo.

Em breve posto mais detalhes, mas, se você estiver com problemas usando System.Management.ManagementObjectSearcher, comece por aqui que acho que dá um bom caminho para solucionar o problema.

Até a próxima.