带有HTA的VBScript奇怪问题和类型不匹配错误

时间:2015-11-03 17:18:15

标签: vbscript hta type-mismatch

当我通过双击自行运行以下脚本时,它可以正常工作。它按预期返回上次登录的用户。但是当我从HTA运行它时,我一直在开发所有脚本的前端,我在“wscript.echo strvalue”行上遇到类型不匹配错误。我已经尝试了一切来使它工作,比如将mshta.exe的权限更改为我自己的完全控制权。我根本无法在没有出现错误的情况下从HTA运行它,但它可以按预期自行运行100%。我完全难过了。

strinput = "myserver"
Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
strinput & "\root\default:StdRegProv")
 strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
strValueName = "LastLoggedOnUser"
 objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
 Wscript.Echo strValue

3 个答案:

答案 0 :(得分:1)

使用Msgbox function代替Wscript.Echo方法。 HTA使用 Internet Explorer脚本对象模型,它不包含Wscript对象(这属于Windows Script Host Object Model)。

阅读HTA: Why Can’t I Use Wscript.Echo?

  

您可能已经注意到,到时候报告回来了   操作系统版本我们使用的是VBScript Msgbox函数   比较常见的Wscript.Echo。我们为什么不使用Wscript.Echo?   原因如下:

     

Error Message

     

事实证明各种Wscript方法 - Wscript.Echo,   Wscript.Sleep,Wscript.Quit等 - 仅设计用于运行   Windows脚本宿主环境。当我们在HTA工作时   我们不是在WSH下运行;相反,我们在MSHTA下运行   处理。因此,我们无法使用Wscript方法   (我们也不能创造它们)。因此,我们需要找到解决方法   每种方法,Msgbox是一个非常适合的替代品   Wscript.Echo。 (我们将讨论其他方法的变通方法 - 例如   as Wscript.Sleep - 当我们到达他们时。)

     

故事的寓意:不要打扰Wscript.Echo;它不会起作用。

修改:使用Wscript.Echo TypeName(strValue) & vbNewLine & VarType(strValue)

==> C:\Windows\System32\cscript.exe D:\VB_scripts\SO\33505295.vbs
String
8

==> C:\Windows\SysWOW64\cscript.exe D:\VB_scripts\SO\33505295.vbs
Null
1

尝试使用简单的HTA来提供相同(不同)的结果

==> C:\Windows\System32\mshta.exe 33505295.hta

==> C:\Windows\SysWOW64\mshta.exe 33505295.hta

<强>结论即可。检查HTA文件类型关联。例如,我的Windows 8(64位)中的ftype htafile返回(令人惊讶的?)相同的值,导致双击时出现错误行为:

==> assoc .hta
.hta=htafile

==> ftype htafile
htafile=C:\Windows\SysWOW64\mshta.exe "%1" {1E460BD7-F1C3-4B2E-88BF-4E770A288AF5}%U{1E460BD7-F1C3-4B2E-88BF-4E770A288AF5} %*    

答案 1 :(得分:1)

默认情况下,Windows 64位使用MSHTA.EXE 32位。注册表有64位和32位应用程序的单独分支,因此WMI找不到您要查找的注册表值。 将下面的代码保存到e。 G。 C:\test\tmp.hta,尝试通过双击(默认为32位)从资源管理器启动它 - 您将获得null,然后通过“运行”对话框启动( Win + < kbd> R )路径:%windir%\system32\mshta.exe "C:\test\tmp.hta"(64位),结果将是您的用户名。

<html>
    <head>
        <script language="vbscript">
            Sub window_onload()
                Const HKEY_LOCAL_MACHINE = &H80000002 
                Set objRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
                strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI"
                strValueName = "LastLoggedOnUser"
                objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
                document.body.innerText = strValue
            End Sub
        </script>
    </head>
    <body>
    </body>
</html>

请注意,脚本中的许多其他内容取决于应用程序架构,例如: G。 ActiveX的数量仅在32位版本中可用,因此它们应通过%windir%\SysWOW64\(Windows 64位子系统上的Windows 32位)启动。

答案 2 :(得分:1)

几周前我遇到了同样的挑战。 以下代码使我可以查看当前登录到远程计算机的用户。

我希望这可以帮到你。

foo