我正在创建一个应用程序,其中我需要来自系统上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,并显示消息“Initialization Failure”。我完全不知道为什么会这样。如果我使用完全相同的代码并更改WMI类(到Win32_Processor / Win32_LogicalDisk / ...)我没有得到这个异常,foreach循环正常工作。我还注意到异常来自语句“searcher.Get();”。 我在Windows Server 2008计算机以及Windows 7企业计算机上尝试过此代码,两者都会产生相同的异常。
我也试过在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
我对生成此异常的原因一无所知,特别是因为当我使用VB脚本时WMI类正在工作。有人在这看到我做错了什么吗?任何帮助表示赞赏,如果您需要更多信息来解决此问题,请告诉我们!
格尔茨, 西蒙
获得了此代码答案 0 :(得分:5)
假设您运行的是64位版本的Windows,请在“项目属性”中取消选中“常规”下的“首选32位”。我发现,除了以管理员身份运行Visual Studio之外,还必须防止抛出“初始化失败”异常。我相信你不能在64位平台上从32位应用程序调用WMI方法。
答案 1 :(得分:3)
我遇到了与我编写的执行实时WIM备份的脚本相同的问题。您运行此系统的系统是否具有UAC?如果是这样,请尝试将其关闭或以管理员身份运行应用程序 - 只要我这样做,它就会栩栩如生。
希望这有帮助
答案 2 :(得分:0)
在Windows Server 2008 R2上工作时,我遇到了同样的问题。
这是我发现的:
mshta.exe在我的系统中有两个版本:
- 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查询无法使用该应用程序。
另一方面,当使用C:\ Windows \ System32 \ mshta.exe运行时,包含查询的hta文件按预期工作。
总之:运行包含带有64位版本mshta.exe的Win32_ShadowCopy wmi查询的hta应用程序。
希望这有帮助