JavaScript: чтение реестра без 64-битного перенаправления?

У меня есть следующая запись реестра в моей 64-битной системе:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner\DisplayVersion

И я пытаюсь прочитать его с помощью 32-битного JS-приложения, но меня автоматически перенаправляют на:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner\DisplayVersion

(которого не существует)

Вот мой код:

var WshShell = new ActiveXObject("WScript.Shell");
var installedVersion = WshShell.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\CCleaner\\DisplayVersion");

Итак, как я могу отключить это перенаправление в 64-битной ОС (для RegRead, RegWrite и RegDelete)?


person Forivin    schedule 15.07.2014    source источник


Ответы (1)


Вы можете сделать это двумя способами:

  1. Запустите скрипт под 32-разрядной версией Windows Script Host (%windir%\SysWOW64\wscript.exe). В коде скрипта используйте имя ключа без Wow6432Node:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner\DisplayVersion
    
  2. Прочтите реестр с помощью класса WMI StdRegProv и включите 32-разрядный режим. с помощью флага __ProviderArchitecture. Вот пример:

    var HKEY_LOCAL_MACHINE = 0x80000002;
    var sValue = ReadRegStr(HKEY_LOCAL_MACHINE,
                            "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\CCleaner",
                            "DisplayVersion",
                            32);  // <------------
    WScript.Echo(sValue);
    
    // Reads a REG_SZ value from the local computer's registry using WMI.
    // Parameters:
    //   RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788.aspx for possible values).
    //   Key - The key that contains the needed value.
    //   Value - The value to get.
    //   RegType - The registry bitness: 32 or 64.
    function ReadRegStr (RootKey, KeyName, ValueName, RegType)
    {
      var oCtx = new ActiveXObject("WbemScripting.SWbemNamedValueSet");
      oCtx.Add("__ProviderArchitecture", RegType);
    
      var oLocator = new ActiveXObject("WbemScripting.SWbemLocator");
      var oWMI = oLocator.ConnectServer("", "root\\default", "", "", "", "", 0, oCtx);
      var oReg = oWMI.Get("StdRegProv");
    
      var oInParams = oReg.Methods_("GetStringValue").Inparameters;
      oInParams.Hdefkey = RootKey;
      oInParams.Ssubkeyname = KeyName;
      oInParams.Svaluename = ValueName;
    
      var oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, 0, oCtx);
      return oOutParams.SValue;
    }
    
person Helen    schedule 15.07.2014