使用Javascript在HTA文件中读写Windows注册表

3

我目前正在尝试编写Javascript代码,以便在HTA文件中读写Windows注册表。以下是我当前使用的代码:

writeInRegistry = function (sRegEntry, sRegValue) {
    Regpath = "HKEY_LOCAL_MACHINE\\Software\\CompanyName\\CompanyValues\\" + sRegEntry;

    try {
        var oWSS = new ActiveXObject("WScript.Shell");

        oWSS.RegWrite(Regpath, sRegValue, "REG_DWORD");
        oWSS = null;


    } catch (e) {
        alert('Error trying to write "' + sRegValue + '" to registry entry "' + sRegEntry + '"');
    }
}

很遗憾的是,当我在注册表中检查这些值时,它们没有改变。我确保反复检查了注册表路径,确认它与JavaScript代码中的完全一致。它并没有返回错误,所以我认为路径是正确的。
我还尝试了...
var oWSS = WScript.CreateObject("WScript.Shell");

如此MSDN页面所述,应该使用
var oWSS = new ActiveXObject("WScript.Shell");

但那只给我带来了更多问题。

任何帮助都将不胜感激!谢谢!


我在未测试您的代码之前提出了一种替代方法。然而,在测试后,我完全改变了我的原始答案。 - Abbas
我已经运行了你的代码,它完美地工作了。请确保你以管理员身份运行注册表编辑器(regedit)和你的HTA应用程序,以观察你的代码所做出的更改。 - Abbas
2个回答

1
我根据您的代码编写了一个包括writeinRegistry()和readFromRegistry()函数的HTA HTML应用程序示例。它将一个值写入注册表并检索它。问题是它放在哪里。在搜索注册表后,我发现它位于HKEY_CURRENT_USER\VirtualStore\MACHINE\SOFTWARE\Wow6432None\CompanyName\CompanyValues下。这是因为:
  • 我在64位Windows 7机器上运行此程序,但执行32位版本的MSHTA.exe(默认)
  • 我以普通用户身份运行,没有提升权限
所以,我创建了一个指向C:\Windows\System32\MSHTA.exe TheNameOfMyScript.hta的Windows快捷方式。为确保我运行的是64位版本,我使用提升权限运行了该快捷方式(以管理员身份运行)。这样做后,HKLM分支下的注册表键已更新。
<html>
<head>
<title>RegTest</title>
<script language="JavaScript">
function writeInRegistry(sRegEntry, sRegValue)
{
  var regpath = "HKEY_LOCAL_MACHINE\\Software\\CompanyName\\CompanyValues\\" + sRegEntry;
  var oWSS = new ActiveXObject("WScript.Shell");
  oWSS.RegWrite(regpath, sRegValue, "REG_DWORD");
}

function readFromRegistry(sRegEntry)
{
  var regpath = "HKEY_LOCAL_MACHINE\\Software\\CompanyName\\CompanyValues\\" + sRegEntry;
  var oWSS = new ActiveXObject("WScript.Shell");
  return oWSS.RegRead(regpath);
}

function tst()
{
  writeInRegistry("Version", "101");
  alert(readFromRegistry("Version"));
}
</script>
</head>
<body>
Click here to run test: <input type="button" value="Run" onclick="tst()"
</body>
</html>

0

我发现,当你在代码中更新注册表键时,如果regedit.exe处于打开/运行状态,最好在代码运行后按下F5regedit中刷新它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接