2013-09-20 1 views
0

Я работаю с хостингом Windows Script (JScript). И моя главная цель - узнать, существует ли ключ реестра. Я пытаюсь «RegRead» этот ключ, и если он выдает ошибку, то ключа не существует (так говорится в документации http://msdn.microsoft.com/en-us/library/x05fawxd(v=vs.84).aspx). Все отлично работает в Win7, но когда я тестирую свой код в WinXP, он терпит неудачу. Проблема в том, что когда вы пытаетесь использовать ключ RegRead, который не имеет значения по умолчанию, он выдает ошибку (только на WinXP, на Win7 все в порядке). И тем более отвратительным моментом является то, что числа ошибок равны при попытке прочитать не существующий ключ (сообщение об ошибке: недопустимый корень в разделе реестра «HKEY_CURRENT_USER \ Software \ NonExistKey \». Код ошибки: 80070002) и существующий ключ, который не имеет значения по умолчанию (Сообщение об ошибке: Не удается открыть раздел реестра «HKEY_CURRENT_USER \ Software \» для чтения. Код ошибки: 80070002). Да, сообщения об ошибках разные, но я не хочу сравнивать сообщения или использовать indexOf («invalid») или indexOf («невозможно»), чтобы отличать одну ошибку от другой, потому что в дефференциальных локалях Windows будут разные сообщения и слова. Это мой код samle. Просто создайте JS-файл с этим контентом и запустите его.Ошибка WshShell.RegRead при чтении ключа со значением по умолчанию не установлено (только WinXP)

var shell = new ActiveXObject('WScript.Shell'); 

try{ 
    var valueKeyExist = shell.RegRead('HKEY_CURRENT_USER\\Software\\'); 
}catch(e2) { 
    WScript.Echo([e2.message, e2.number]); 
} 

if (e2 !== undefined) { 
    try{ 
     var valueNonExistKey = shell.RegRead('HKEY_CURRENT_USER\\Software\\NonExistKey\\'); 
    }catch(e1) { 
     WScript.Echo([e1.message, e1.number]); 
    } 

    WScript.Echo('Seems like you are running this script on WinXP and reading reg key with default value not set throws an error.\nError messages are equal: ' + (e1.message == e2.message) + '\nError numbers are equal: ' + (e1.number == e2.number)); 
} else { 
    WScript.Echo('Seems like you are running this script on Win7 and reading reg key with default value not set is ok'); 
} 

Любые предложения по устранению этого или как я могу узнать, существует ли ключ реестра?

ответ

1

В конце концов я использовал WMI для этого:

function _getRootCode(root) { 
    var rootCode = null; 
    switch(root){ 
     case 'HKCR': 
     case 'HKEY_CLASSES_ROOT': 
      rootCode = 0x80000000; 
      break; 
     case 'HKCU': 
     case 'HKEY_CURRENT_USER': 
      rootCode = 0x80000001; 
      break; 
     case 'HKLM': 
     case 'HKEY_LOCAL_MACHINE': 
      rootCode = 0x80000002; 
      break; 
     case 'HKU': 
     case 'HKEY_USERS': 
      rootCode = 0x80000003; 
      break; 
     case 'HKCC': 
     case 'HKEY_CURRENT_CONFIG': 
      rootCode = 0x80000005; 
      break; 
    } 
    return rootCode; 
}, 

function keyExist(root, path) { 
    var WMIRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default:StdRegProv"); 
    var keys; 
    return WMIRegistry.EnumKey(_getRootCode(root), path, keys) == 0; 
} 

отлично работает на Win7 и WinXP.