Ошибка инициализации при запросе WMI-класса Win32_ShadowCopy - PullRequest
1 голос
/ 28 июля 2011

, программируя на протяжении многих лет, я никогда не публиковал вопрос на этом сайте, но я привел множество проблем, которые здесь уже рассматривались.Однако теперь я столкнулся с проблемой, на которую не могу найти ответ.

Я создаю приложение, в котором мне нужна информация из ShadowCopies в системе.Я пытаюсь добиться этого с помощью WMI (в C #).Это, однако, дает мне исключение «Ошибка инициализации».Вот код: ManagementScope scope = new ManagementScope ("\\. \ ROOT \ cimv2");

//create object query
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_ShadowCopy");

//create object searcher
ManagementObjectSearcher searcher =
                        new ManagementObjectSearcher(scope, query);

//get collection of WMI objects
ManagementObjectCollection queryCollection = searcher.Get();

//enumerate the collection.
foreach (ManagementObject m in queryCollection) 
{
// access properties of the WMI object
  Console.WriteLine("ClientAccessible : {0}", m["ClientAccessible"]);

}

При достижении строки foreach генерируется исключение ManagementException с сообщением «Ошибка инициализации».Я понятия не имею, почему это происходит.Если я использую точно такой же код и изменяю WMI-класс (на Win32_Processor / Win32_LogicalDisk / ...), я не получаю это исключение, и цикл foreach просто работает.Я также заметил, что исключение исходит из утверждения «searcher.Get ();».Я пробовал этот код на машине под управлением Windows Server 2008, а также на машине под управлением Windows 7 Enterprise, и оба генерировали одно и то же исключение.

Я также пытался использовать этот класс в vb-скрипте, и это сработало,Код VBS:

Set objWMIService = GetObject("winmgmts:\\" + ComputerName + "\root\cimv2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ShadowCopy")

For Each objItem in colItems
    Wscript.Echo objItem.ClientAccessible
Next

Я действительно не знаю, что вызывает это исключение, тем более что WMI-класс работает, когда я использую VB-скрипт.Кто-нибудь видит, что я здесь делаю не так?Любая помощь приветствуется, и если вам нужна дополнительная информация для решения этой проблемы, просто дайте мне знать!

Greetz, Simon

// ПРИМЕЧАНИЕ. Я получил этот код от http://include.wutils.com/wmi/ROOT%5Ccimv2/CIM_ManagedSystemElement/CIM_LogicalElement/Win32_ShadowCopy/cs-samples.html

Ответы [ 3 ]

5 голосов
/ 08 июля 2013

Если вы работаете с 64-битной версией Windows, в свойствах проекта снимите флажок «Предпочитать 32-битную» в разделе «Общие». Я обнаружил, что это, в дополнение к запуску Visual Studio в качестве администратора, было необходимо для предотвращения возникновения исключения «Ошибка инициализации». Я считаю, что вы не можете вызвать метод WMI из 32-разрядного приложения на 64-разрядных платформах.

3 голосов
/ 09 июля 2012

У меня была та же проблема со сценарием, который я написал, который выполняет живое резервное копирование WIM. Система, на которой вы работаете, имеет UAC? Если это так, попробуйте либо выключить его, либо запустить приложение от имени администратора - как только я это сделаю, оно ожило.

Надеюсь, это поможет

0 голосов
/ 01 ноября 2016

Работая на Windows Server 2008 R2, у меня возникла та же проблема.

Вот что я обнаружил:

mshta.exe существует в 2 версиях в моей системе:
- C: \ Windows \ System32 \ mshta.exe (64 бита)
- C: \ Windows \ SysWOW64 \ mshta.exe (32 бита)

В реестре приложением, связанным с hta-файлами (HKCR \ htafile \ Shell \ Open \ Command), является C: \ Windows \ SysWOW64 \ mshta.exe, с которым не работает запрос Win32_ShadowCopy.
С другой стороны, hta-файл, содержащий запрос, работает должным образом при запуске с C: \ Windows \ System32 \ mshta.exe.

Одним словом: запуск hta-приложений, содержащих wmi-запрос Win32_ShadowCopy, с 64-битной версией mshta.exe.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...