web-dev-qa-db-fra.com

Vérifier si la clé de registre existe en utilisant VBScript

Je pensais que cela serait facile, mais apparemment personne ne le fait .... J'essaie de voir s'il existe une clé de registre. Peu m'importe s'il y a des valeurs à l'intérieur telles que (par défaut).

C'est ce que j'ai essayé.

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

Je veux seulement savoir si HKEY_USERES\.DEFAULT\.Network existe. Tout ce que je trouve en cherchant semble porter sur la manipulation et suppose que la clé existe, car elle est créée comme par magie si ce n’est pas le cas.

12
MTeck

J'ai trouvé la solution.

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
10
MTeck

La seconde des deux méthodes ici fait ce que vous voulez. Je viens de l'utiliser (après avoir trouvé aucun succès dans ce fil) et cela a fonctionné pour moi.

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

Le code:

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
8
chris_k

Le moyen le plus simple d'éviter les astuces de RegRead et de gestion des erreurs. Constantes amicales facultatives pour le registre:

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

Alors vérifiez avec:

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

NOTES IMPORTANTES POUR LES MEMBRES CI-DESSUS:

  • Il y a 4 paramètres passés à EnumKey, pas les 3 habituels.
  • Égal à zéro signifie que la clé EXISTS.
  • La barre oblique après le nom de la clé est facultative et non requise.
5
WhoIsRich

Au cas où quelqu'un d'autre se heurterait à cela, j'ai pris l'exemple de WhoIsRich et l'ai légèrement modifié. Lors de l'appel de ReadReg, je devais effectuer les opérations suivantes: ReadReg ("App", "HKEY_CURRENT_USER\App\Version") qui serait alors en mesure de lire le numéro de version du registre, s'il existait déjà. J'utilise aussi HKCU car il ne nécessite pas de privilèges d'administrateur pour écrire.

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
2
Jonathan

Voir le scripteur! Blog:

Comment puis-je savoir si une valeur existe dans le registre?

Ils discutent de la vérification sur un ordinateur distant et montrent que si vous lisez une valeur de chaîne à partir de la clé et que la valeur est Null (par opposition à Vide), la clé n'existe pas.

En ce qui concerne l’utilisation de la méthode RegRead, si le terme "clé" désigne le chemin (ou le dossier) dans lequel les valeurs de registre sont conservées, et si les éléments feuille de cette clé sont appelés "valeurs", utilisez WshShell.RegRead (strKey) pour détecter l’existence de la clé (par opposition à l’existence de la valeur), tenez compte des éléments suivants (observés sous Windows XP):

Si strKey nom n'est pas le nom d'un chemin de registre existant, Err.Description lit "Racine non valide dans la clé de registre" ... avec un numéro d'erreur Err.Number de 0x80070002.

Si strKey nomme un chemin de registre existant mais n'inclut pas un "\" final, la méthode RegRead semble interpréter strKey comme une référence chemin\valeur plutôt que comme une référence de chemin simple et renvoie le même numéro Err.Number mais avec un code d'erreur. Description de "Impossible d'ouvrir la clé de registre". Le terme "clé" dans le message d'erreur semble signifier "valeur". Ce résultat est identique à celui obtenu lorsque strKey fait référence à un chemin\valeur où le chemin existe, mais la valeur n'existe pas.

0
kbulgrien

edit (désolé je pensais que tu voulais VBA).

Chaque fois que vous essayez de lire une valeur inexistante dans le registre, vous obtenez un Null. Ainsi, tout ce que vous avez à faire est de vérifier la valeur Null. 

Utilisez IsNull pas 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
0
vulkanino