我正在尝试在我的服务器上自动安装 MSI,但是在安装进行之前,我需要从服务器上卸载以前的版本。
在网上搜索后,我发现 WMIC 是所需的工具,但服务器上 WMI 的设置似乎存在问题。运行以下命令会出现错误:
命令提示符>wmic
然后在工具里面
/跟踪:上
产品获取名称
这将返回一长串的成功和一次失败:
FAIL: IEnumWbemClassObject->Next(WBEM_INFINITE, 1, -, -)
Line: 396 File: d:\nt\admin\wmi\wbem\tools\wmic\execengine.cpp
Node - ENTECHORELDEV
ERROR:
Code = 0x80041010
Description = The specified class is not valid.
Facility = WMI
我正在尝试在具有管理员权限的 Windows Server 2003 R2 的标准安装上运行它。
谢谢
斯图
答案1
有很多方法可以自动安装(卸载)MSI,WMIC 就是其中之一。您是否考虑过一种更简单的方法,例如执行以下操作的批处理文件:
rem Uninstall old program:
msiexec /qb /x {05EC21B8-4593-3037-A781-A6B5AFFCB19D}
rem Install new program:
msiexec /qb /i MyNewProgram.msi
(当然,用你的程序的 GUID 或Uninstall
键名替换上面的 GUID)。
或者,您可以使用Windows 安装程序的自动化接口。
或者,您可以通过 VBScript 或 PowerShell 使用 WMI 来完成与 WMIC 相同的任务。但看起来 WMI 可能有点不给力。
我没有办法修复我所看到的问题,但我确实有几个方法可以供您尝试。我最近花了一些时间来解决 WMI 问题,所以也许其中的一些技巧在这里会起作用。
首先,这里有一个 VBScript,它应该输出与 相同的内容product get name
。将其保存到文件getProductNames.vbs
并执行。
Option Explicit
Dim strComputer
Dim objWMIService, colProducts, objProduct
Dim arrstrProducts(), i
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProducts = objWMIService.ExecQuery("Select * From Win32_Product")
i = 0
For Each objProduct in colProducts
ReDim Preserve arrStrProducts(i)
arrStrProducts(i) = objProduct.Name
i = i + 1
Next
WScript.Echo Join(arrStrProducts, vbNewLine)
现在,如果可行,则尝试使用同样的事情wbemtest
。
- 启动该
wbemtest
程序。 - 点击
Connect...
- 更改
root\default
为root\cimv2
,然后单击Connect
。 - 点击
Query...
- 输入
Select * from Win32_Product
,然后单击Apply
。
这应该会返回产品列表。如果返回,则 WMI 可能没有问题,而 WMIC 出了问题。如果脚本有效,但这个无效,请在命令提示符下尝试以下命令:
regsvr32 wbemdisp.dll
然后再次运行wbemtest
查询。
如果脚本和wbemtest
工作都不起作用,那么 WMI 可能受到了严重影响,您必须修复它。
答案2
您是否已确认 WMI 提供程序已启用?在某些版本的 Windows 上,它不是默认安装的。
添加/删除程序 -> 添加/删除 Windows 组件 -> 管理和监控工具 -> WMI Windows 安装程序提供程序。