Windows 8.1:单独调用VBS时无法使用从HTA调用的VBS编辑注册表

时间:2015-02-17 09:55:27

标签: vbscript registry windows-8.1 hta

我正在开发实现各种操作的Windows 8.1 HTA。在某些时候,我需要在注册表中插入值(用于autologon和runonce目的)。

以下是VBS代码:

Sub RunOnce()

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objShell = CreateObject("WScript.Shell")
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
strNewKeyPath = "Software\Microsoft\Windows\CurrentVersion\RunOnce"
strNewValue = "AppsInstaller"
strCurDir    = objShell.CurrentDirectory
strScriptPath = strCurdir & "\2_Install_Apps.hta"
objRegistry.SetStringValue HKEY_LOCAL_MACHINE, strNewKeyPath, strNewValue, strScriptPath

End Sub

Function AutoLogon(strLogin, strPassword)

Set objShell = CreateObject("WScript.Shell")
strAutoLogon = "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\winlogon"
objShell.RegWrite strAutoLogon & "\AutoAdminLogon", "1", "REG_DWORD"
objShell.RegWrite strAutoLogon & "\DefaultUserName", strLogin, "REG_SZ"
objShell.RegWrite strAutoLogon & "\DefaultPassword", strPassword, "REG_SZ"

End Function

我在Windows 7下的计算机上开发。当我从具有管理员权限的HTA调用RunOnce和AutoLogon时,一切正常。 我的目标是Windows 8.1下的Surface Pro 3。当我从在此计算机上使用administrive权限启动的HTA调用RunOnce和AutoLogon时,不会编辑注册表。但是,如果我使用管理员权限启动以下VBS文件,它可以正常工作。

Sub RunOnce()

    Const HKEY_LOCAL_MACHINE = &H80000002
    strComputer = "."
    Set objShell = CreateObject("WScript.Shell")
    Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
    strNewKeyPath = "Software\Microsoft\Windows\CurrentVersion\RunOnce"
    strNewValue = "AppsInstaller"
    strCurDir    = objShell.CurrentDirectory
    strScriptPath = strCurdir & "\2_Install_Apps.hta"
    objRegistry.SetStringValue HKEY_LOCAL_MACHINE, strNewKeyPath, strNewValue, strScriptPath

End Sub


Function AutoLogon(strLogin, strPassword)

    Set objShell = CreateObject("WScript.Shell")
    strAutoLogon = "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\winlogon"
    objShell.RegWrite strAutoLogon & "\AutoAdminLogon", "1", "REG_DWORD"
    objShell.RegWrite strAutoLogon & "\DefaultUserName", strLogin, "REG_SZ"
    objShell.RegWrite strAutoLogon & "\DefaultPassword", strPassword, "REG_SZ"

End Function

RunOnce()
Test = AutoLogon("login", "password")

我真的不知道这里发生了什么。它肯定与管理员权利有关,但我一无所知,我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

确保使用64位版本的mshta.exe运行HTA。 (选择正确的位数)。

来自帮助。

  

注册表重定向器

     

注册表重定向程序通过在WOW64上提供注册表关键部分的单独逻辑视图来隔离32位和64位应用程序。

     

注册表重定向器拦截对每个逻辑注册表视图的32位注册表调用,并将它们映射到相应的物理注册表位置。

     

重定向过程对应用程序是透明的。因此,即使数据存储在64位Windows上的其他位置,32位应用程序也可以访问注册表数据,就像它在32位Windows上运行一样。

     

为以下注册表项启用了重定向:

     

HKEY_LOCAL_MACHINE \ Software

     

HKEY_USERS * \ Software \ Classes

     

HKEY_USERS * _Classes

     

注意*表示所有用户安全ID(SID)匹配。

     

以下方案说明了这些逻辑视图的使用:

     

32位应用程序检查以下注册表项是否存在:HKEY_LOCAL_MACHINE \ Software \ Hello。如果密钥不存在,则使用默认值“Hello 32-bit world”创建密钥;否则,它会读取并显示该值。

     

修改相同的应用程序以编写“Hello 64-bit world”而不是“Hello 32-bit world”并重新编译为64位应用程序。   当32位应用程序在64位Windows上运行时,它显示“Hello 32位世界”。运行64位应用程序时,它显示“Hello 64位世界”。两个应用程序使用相同的预定义句柄和相同的键名称调用相同的注册表函数;不同之处在于每个应用程序都在其注册表的逻辑视图上运行,并且每个视图都映射到注册表的单独物理位置,这使得字符串的两个版本保持不变。

     

为了帮助将包含%ProgramFiles%的REG_EXPAND_SZ密钥写入注册表的应用程序,WOW64拦截这些写入并用“%ProgramFiles(x86)%”替换它们。为所有进程定义此环境变量。例如,如果Program Files目录位于C驱动器上,则“%ProgramFiles(x86)%”将扩展为“C:\ Program Files(x86)”。

     

为了通过COM和其他机制启用应用程序互操作性,WOW64使用注册表反射,它会复制两个注册表视图之间的特定注册表项和值,以使它们保持同步。反射器是智能的,并且在视图之间复制本地服务器的COM激活数据,但不复制进程内数据,因为在64位Windows上不允许32/64进程内数据混合。

     

有关详细信息,请参阅以下主题:

     

注册表反思

     

共享注册表项

     

访问备用注册表视图

     

WOW64上的注册表反射和重定向示例

     

64位Windows中的远程注册表访问

     

将有关此主题的评论发送给Microsoft

     

建造日期:2006年10月2日

相关问题