在编程的这些年里,我从来没有在这个网站上发布过问题,但是我遇到了许多以前在这里解决过的问题。然而,现在我遇到了一个问题,我似乎找不到答案。
我正在创建一个应用程序,我需要从系统上的ShadowCopies信息。我正试图通过使用WMI(在c#中)来实现这一点。然而,这给了我一个"初始化失败"的例外。代码如下:ManagementScope scope = new ManagementScope("\.ROOTcimv2");
//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并显示消息"Initialization Failure"。我完全不知道为什么会这样。如果我使用完全相同的代码并更改wmi类(到Win32_Processor/Win32_LogicalDisk/…)我没有得到这个异常,foreach循环只是工作。我还注意到异常来自语句"search . get();"。我在Windows Server 2008机器和Windows 7 enterprise机器上尝试了这段代码,两者都产生了相同的异常。
我也试过在vb-script中使用这个类,并且工作了。VBS代码:
Set objWMIService = GetObject("winmgmts:\" + ComputerName + "rootcimv2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_ShadowCopy")
For Each objItem in colItems
Wscript.Echo objItem.ClientAccessible
Next
我真的不知道是什么产生了这个异常,特别是因为当我使用vb脚本时,wmi类正在工作。有人知道我哪里做错了吗?任何帮助是感激的,如果你需要更多的信息来解决这个问题,只是让我知道!
Greetz,西蒙。
//注意:我从http://include.wutils.com/wmi/ROOT%5Ccimv2/CIM_ManagedSystemElement/CIM_LogicalElement/Win32_ShadowCopy/cs-samples.html
假设您运行的是64位版本的Windows,在"项目属性"中,取消勾选"通用"下的"首选32位"。我发现,除了以管理员身份运行Visual Studio之外,这对于防止抛出"Initialization Failure"异常是必要的。我相信您无法在64位平台上从32位应用程序调用WMI方法。
我编写的执行实时WIM备份的脚本也有同样的问题。你运行的系统有UAC吗?如果是这样,试着关掉它或者以管理员身份运行应用程序——我一这么做,它就活过来了。
希望能有所帮助
在Windows Server 2008 R2上工作时,我遇到了同样的问题。
下面是我的发现:
mshta.exe在我的系统中有两个版本:- C:WindowsSystem32mshta.exe(64位)
- C:WindowsSysWOW64mshta.exe(32位)
在注册表中,与hta文件(HKCRhtafileShellOpenCommand)关联的应用程序为C:WindowsSysWOW64mshta.exe,其中Win32_ShadowCopy查询不起作用。
另一方面,当使用C:WindowsSystem32mshta.exe运行时,包含查询的hta文件按预期工作。
总之:使用64位版本的mshta.exe运行包含Win32_ShadowCopy wmi查询的hta应用程序。
希望能有所帮助