VBScript/HTA - 使用 WMI 搜索注册表

VBScript/HTA - Using WMI to search registry

当我尝试从 HTA 应用程序中 运行 VBScript 代码时,我 运行 遇到了一个有趣的问题。具体来说,当我使用 WMI 查询注册表时。下面是我用来确定 SQL 服务器安装的实例名称的 VBscript(在 .HTA 文件中)代码:

<script language="VBScript">
    Sub searchRegistry
        Const HKEY_LOCAL_MACHINE = &H80000002

        strComputer = "."

        Set oReg=GetObject( "winmgmts:{impersonationLevel=impersonate}!\" & strComputer & "\root\default:StdRegProv")
        strKeyPath = "Software\Microsoft\Microsoft SQL Server\Instance Names\SQL"
        oReg.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

        msgbox "SQL Instances already installed: "
        For i=0 To UBound(arrValueNames)
            msgbox arrValueNames(i)     
        Next
    End Sub

返回 Null,循环抛出绑定错误。但是,当我 运行 来自独立 VBScript (.vbs) 文件的相同代码时,它 returns 正确的值没问题。我认为这是一个权限问题,但不知道从哪里开始;不知道如何授予 windows HTA 文件使用 WMI 搜索注册表的权限。此外,我可以使用 HTA 的 WMI 来做其他事情(获取驱动器 space 等)而不会出现问题,所以这一定是注册表限制?有什么想法吗?

根据 this ,Windows 允许 HTA 更新注册表。

如果它对您不起作用,可能与您的 'User Account Control' 设置有关。禁用并尝试!

折腾了几天,终于想通了...

在某些 64 位系统上,HTA 与 32 位 MSHTA 版本 (%windir%\SYSWOW64\mshta.exe) 错误关联 - 导致只能访问某些 WMI 类 .

在这种情况下,将正确(64 位)MSHTA 的路径添加到命令行。示例:“%windir%\system32\mshta.exe”"c:\whatever.hta" 并且 HTA 应该 运行 具有对 WMI 的完全访问权限。