Проверьте, существует ли раздел реестра

Я думал, что это будет легко, но, похоже, никто этого не делает... Я пытаюсь посмотреть, существует ли раздел реестра. Меня не волнует, есть ли внутри него какие-либо значения, такие как (по умолчанию).

Это то, что я пытался.

Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
objRegistry.GetStringValue &H80000003,".DEFAULT\Network","",regValue

If IsEmpty(regValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If

Я хочу знать только, существует ли HKEY_USERES \.DEFAULT \.Network. Все, что я нахожу при поиске в основном, похоже, обсуждает манипулирование ими и в значительной степени предполагает, что ключ существует, поскольку он создан магически, если он этого не делает.

Ответ 1

Я нашел решение.

dim bExists
ssig="Unable to open registry key"

set wshShell= Wscript.CreateObject("WScript.Shell")
strKey = "HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\"
on error resume next
present = WshShell.RegRead(strKey)
if err.number<>0 then
    if right(strKey,1)="\" then    'strKey is a registry key
        if instr(1,err.description,ssig,1)<>0 then
            bExists=true
        else
            bExists=false
        end if
    else    'strKey is a registry valuename
        bExists=false
    end if
    err.clear
else
    bExists=true
end if
on error goto 0
if bExists=vbFalse then
    wscript.echo strKey & " does not exist."
else
    wscript.echo strKey & " exists."
end if

Ответ 2

Второй из этих двух способов делает то, что вы хотите. Я только что использовал его (не найдя успеха в этой теме), и это сработало для меня.

http://yorch.org/2011/10/two-ways-to-check-if-a-registry-key-exists-using-vbscript/

Код:

Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKCU = &H80000001 'HKEY_CURRENT_USER
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKUS = &H80000003 'HKEY_USERS
Const HKCC = &H80000005 'HKEY_CURRENT_CONFIG

Function KeyExists(Key, KeyPath)
    Dim oReg: Set oReg = GetObject("winmgmts:!root/default:StdRegProv")
    If oReg.EnumKey(Key, KeyPath, arrSubKeys) = 0 Then
        KeyExists = True
    Else
        KeyExists = False
   End If
End Function

Ответ 3

Простейший способ избежать ошибок RegRead и обработки ошибок. Дополнительные дружественные константы для реестра:

Const HKEY_CLASSES_ROOT   = &H80000000
Const HKEY_CURRENT_USER   = &H80000001
Const HKEY_LOCAL_MACHINE  = &H80000002
Const HKEY_USERS          = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005

Затем установите флажок:

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

If oReg.EnumKey(HKEY_LOCAL_MACHINE, "SYSTEM\Example\Key\", "", "") = 0 Then
  MsgBox "Key Exists"
Else
  MsgBox "Key Not Found"
End If

ВАЖНЫЕ ЗАМЕЧАНИЯ ДЛЯ ВЫШЕ:

  • В EnumKey передаются 4 параметра, а не обычные 3.
  • Одиночный нуль означает ключ EXISTS.
  • Слэш после имени ключа является необязательным и не требуется.

Ответ 4

В случае, если кто-то еще сталкивается с этим, я взял пример WhoIsRich и немного изменил его. При вызове ReadReg мне нужно было сделать следующее: ReadReg ( "Приложение", "HKEY_CURRENT_USER\App\Version" ), который затем сможет прочитать номер версии из реестра, если он существует. Я также использую HKCU, поскольку он не требует прав администратора для записи.

Function ReadReg(RegKey, RegPath)
      Const HKEY_CURRENT_USER = &H80000001
      Dim objRegistry, oReg
      Set objRegistry = CreateObject("Wscript.shell")
      Set oReg = GetObject("winmgmts:!root\default:StdRegProv")

      if oReg.EnumKey(HKEY_CURRENT_USER, RegKey) = 0 Then
        ReadReg = objRegistry.RegRead(RegPath)
      else
        ReadReg = ""
      end if
End Function

Ответ 5

изменить (извините, я думал, что вы хотите VBA).

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

Используйте IsNull not IsEmpty.

Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & _ 
    strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "Test Value"
objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

If IsNull(strValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If

Ответ 6

Посмотрите на сценариста! Блог:

Как я могу узнать, существует ли ценность в реестре?

Они обсуждают выполнение проверки на удаленном компьютере и показывают, что если вы читаете строковое значение из ключа, и если значение Null (в отличие от Empty), ключ не существует.

Что касается использования метода RegRead, если термин "ключ" относится к пути (или папке), где хранятся значения реестра, и если листовые элементы в этом ключе называются "значениями", использование WshShell.RegRead( strKey), чтобы обнаружить существование ключа (в отличие от значения), рассмотрим следующее (как это наблюдается в Windows XP):

Если имя strKey не является именем существующего пути реестра, Err.Description читает "Недопустимый корень в разделе реестра"... с номером ошибки 0x80070002.

Если strKey называет путь к реестру, который существует, но не содержит завершающий "\" метод RegRead, как представляется, интерпретирует strKey как ссылку на путь\значение, а не как простую ссылку на путь, и возвращает тот же номер Err.Number, но с Err.Description "Не удается открыть раздел реестра". Термин "ключ" в сообщении об ошибке означает "значение". Это тот же результат, полученный, когда strKey ссылается на путь \value, где существует путь, но значение не существует.