当我通过双击自行运行以下脚本时,它可以正常工作。它按预期返回上次登录的用户。但是当我从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
答案 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? 原因如下:
事实证明各种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