OVH Cloud OVH Cloud

Impossible de lire une clef de registre

8 réponses
Avatar
FRED
Bonjour,

Je fais le script suivant pour lire une clef de registre, afin de vérifier
sa présence.

dim registre, clef
Set registre = CreateObject ("Wscript.Shell")
clef = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing\"
Wscript.Echo registre.RegRead (clef)

Mais invariablement, j'obtiens une erreur me disant:
"impossible d'ouvrir la clef de registre"

... Quelqu'un saurait-il où se trouve l'erreur?

Merci.

FERD

8 réponses

Avatar
François Rivierre
Est-ce qu'il ne faut pas d'abord tester l'existence de la clef ? Si elle
n'est pas présente dans le registre, on doit obtenir ce genre d'erreur...
Par contre, je ne sais pas comment on fait pour tester l'existence de cette
clef.

Cordialement,

François RIVIERRE
Avatar
FRED
Bonjour,

Effectivement, ce qui m'intéresserait serait d'abord de tester, puis si elle
existe, la supprimer.
Le problème est que si je n'arrive pas à la lire, comment puisje tester sa
présence?

Merci de ta réponse,

FRED.



"François Rivierre" a écrit dans le message de news:
%
Est-ce qu'il ne faut pas d'abord tester l'existence de la clef ? Si elle
n'est pas présente dans le registre, on doit obtenir ce genre d'erreur...
Par contre, je ne sais pas comment on fait pour tester l'existence de
cette
clef.

Cordialement,

François RIVIERRE




Avatar
Stéphane [MS]
Quelques pistes :

Function RegKeyExists(strHive,StrRegKey)
Set objReg = GetObject("winmgmts:rootdefault:StdRegProv")
If objReg.EnumValues(varRegHive, varRegKey, arrayValueNames,
arrayValueTypes) = 0 Then
RegKeyExists = True
Else
RegKeyExists = False
End If
Set objReg = Nothing
End Function

Référence
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/enumvalues_method_in_class_stdregprov.asp

--
Cdlt
Stéphane



Bonjour,

Effectivement, ce qui m'intéresserait serait d'abord de tester, puis si elle
existe, la supprimer.
Le problème est que si je n'arrive pas à la lire, comment puisje tester sa
présence?

Merci de ta réponse,

FRED.



"François Rivierre" a écrit dans le message de news:
%
Est-ce qu'il ne faut pas d'abord tester l'existence de la clef ? Si elle
n'est pas présente dans le registre, on doit obtenir ce genre d'erreur...
Par contre, je ne sais pas comment on fait pour tester l'existence de
cette
clef.

Cordialement,

François RIVIERRE









Avatar
Jean-Claude BELLAMY
Dans le message news:% ,
FRED s'est ainsi exprimé:

Bonjour,

Je fais le script suivant pour lire une clef de registre, afin de
vérifier sa présence.

dim registre, clef
Set registre = CreateObject ("Wscript.Shell")
clef = "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
Wscript.Echo registre.RegRead (clef)

Mais invariablement, j'obtiens une erreur me disant:
"impossible d'ouvrir la clef de registre"

... Quelqu'un saurait-il où se trouve l'erreur?


Quand tu écris :
clef = "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
avec un "" final

la commande RegRead (clef)

signifie que tu demandes à lire la VALEUR PAR DÉFAUT de cette clef
Or elle n'existe pas forcément ("(valeur non définie)" dans REGEDIT)
D'où erreur ...


Il faut donc effectuer des tests d'existence, et pour cela désactiver la
gestion des erreurs :

Voila la fonction "passe-partout" que j'ai écrite :

Function ReadKey(key)
On Error Resume Next
ReadKey=shell.RegRead(key)
If Err.Number<>0 Then
If right(key,1)<>"" Then key=key & ""
Err.Clear
ReadKey=shell.RegRead(key)
If Err.Number<>0 Then Wscript.Echo "Erreur dans la lecture de la clef" &
vbcrlf & key
End If
end function

Explication :

On Error Resume Next
Si une erreur survient, on continue quand même !

If Err.Number<>0 Then
On teste si une erreur a eu lieu (clef non trouvée)

If right(key,1)<>"" Then key=key & ""
Test de clef au lieu d'entrée

Err.Clear
effacement de l'erreur

ReadKey=shell.RegRead(key)
on recommence (avec un à la fin)

If Err.Number<>0 Then Wscript.Echo ....
L'erreur persiste, donc la clef ou l'entrée n'existe pas
(ici j'écris un message, mais on pourrait aussi positionner un flag)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
FRED
J'essaie cela.
Merci

"Stéphane [MS]" a écrit dans le message de
news:
Quelques pistes :

Function RegKeyExists(strHive,StrRegKey)
Set objReg = GetObject("winmgmts:rootdefault:StdRegProv")
If objReg.EnumValues(varRegHive, varRegKey, arrayValueNames,
arrayValueTypes) = 0 Then
RegKeyExists = True
Else
RegKeyExists = False
End If
Set objReg = Nothing
End Function

Référence :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/enumvalues_method_in_class_stdregprov.asp

--
Cdlt
Stéphane



Bonjour,

Effectivement, ce qui m'intéresserait serait d'abord de tester, puis si
elle
existe, la supprimer.
Le problème est que si je n'arrive pas à la lire, comment puisje tester
sa
présence?

Merci de ta réponse,

FRED.



"François Rivierre" a écrit dans le message de news:
%
Est-ce qu'il ne faut pas d'abord tester l'existence de la clef ? Si
elle
n'est pas présente dans le registre, on doit obtenir ce genre
d'erreur...
Par contre, je ne sais pas comment on fait pour tester l'existence de
cette
clef.

Cordialement,

François RIVIERRE











Avatar
FRED
Bonjour,

Merci, je vais essayer en espérant plus de succés...
J'ai bien compris, il faut rajouter mon nom de clef :If
right(key,1)<>"HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing" Then
key=key & "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
?

Merci et bon Week-End,

FRED.


"Jean-Claude BELLAMY" a écrit dans le
message de news:
Dans le message news:% ,
FRED s'est ainsi exprimé:

Bonjour,

Je fais le script suivant pour lire une clef de registre, afin de
vérifier sa présence.

dim registre, clef
Set registre = CreateObject ("Wscript.Shell")
clef = "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
Wscript.Echo registre.RegRead (clef)

Mais invariablement, j'obtiens une erreur me disant:
"impossible d'ouvrir la clef de registre"

... Quelqu'un saurait-il où se trouve l'erreur?


Quand tu écris :
clef = "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
avec un "" final

la commande RegRead (clef)

signifie que tu demandes à lire la VALEUR PAR DÉFAUT de cette clef
Or elle n'existe pas forcément ("(valeur non définie)" dans REGEDIT)
D'où erreur ...


Il faut donc effectuer des tests d'existence, et pour cela désactiver la
gestion des erreurs :

Voila la fonction "passe-partout" que j'ai écrite :

Function ReadKey(key)
On Error Resume Next
ReadKey=shell.RegRead(key)
If Err.Number<>0 Then
If right(key,1)<>"" Then key=key & ""
Err.Clear
ReadKey=shell.RegRead(key)
If Err.Number<>0 Then Wscript.Echo "Erreur dans la lecture de la clef"
& vbcrlf & key
End If
end function

Explication :

On Error Resume Next
Si une erreur survient, on continue quand même !

If Err.Number<>0 Then
On teste si une erreur a eu lieu (clef non trouvée)

If right(key,1)<>"" Then key=key & ""
Test de clef au lieu d'entrée

Err.Clear
effacement de l'erreur

ReadKey=shell.RegRead(key)
on recommence (avec un à la fin)

If Err.Number<>0 Then Wscript.Echo ....
L'erreur persiste, donc la clef ou l'entrée n'existe pas
(ici j'écris un message, mais on pourrait aussi positionner un flag)


--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*





Avatar
Jean-Claude BELLAMY
Dans le message news: ,
FRED s'est ainsi exprimé:

Bonjour,

Merci, je vais essayer en espérant plus de succés...
J'ai bien compris, il faut rajouter mon nom de clef :If
right(key,1)<>"HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
Then key=key & "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
?


?????????????
Ouh la la !!!!!!!!
Tu N'AS PAS LU DU TOUT ce que j'ai écrit !

If right(key,1)<>"" Then key=key & ""
Test de clef au lieu d'entrée


En VBS, quand on utilise RegRead ou RegWrite, qui servent EXCLUSIVEMENT à
lire ou écrire une ENTRÉE,

Si le paramètre transmis ne se termine pas par "",
cela signifie que le dernier segment est le nom
d'une entrée.

HKLMSoftwareProgToto
-> on lit (ou écrit) l'entrée "toto"
de la clef HKLMSoftwareProg


Si le paramètre transmis se termine par "",
cela signifie que l'on traite l'entrée par DÉFAUT

HKLMSoftwareProgToto
-> on lit (ou écrit) l'entrée par défaut
de la clef HKLMSoftwareProgToto


Et je t'ai donné un script GÉNÉRIQUE !

Une fonction à laquelle on passe une clef en paramètre ...

Dans *TON* cas, avec une clef BIEN PRÉCISE, tu ne vas pas t'amuser à çà,
réfléchis un peu!
(sauf si ton script doit être utilisé pour autre chose)

Ce qui compte, c'est que tu empêches l'arrêt du script en cas d'erreur ...

On error resume next
....
Set registre = CreateObject ("Wscript.Shell")
clef = "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
valeur=registre.RegRead (clef)

if Err.Number<>0 then
Wscript.Echo "Entrée par défaut non définie"
else
Wscript.Echo valeur
end if

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*

Avatar
FRED
Bonjour Jean-Claude,

Merci pour tes éclairsissements.

FRED.

"Jean-Claude BELLAMY" a écrit dans le
message de news: %
Dans le message news: ,
FRED s'est ainsi exprimé:

Bonjour,

Merci, je vais essayer en espérant plus de succés...
J'ai bien compris, il faut rajouter mon nom de clef :If
right(key,1)<>"HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
Then key=key & "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
?


?????????????
Ouh la la !!!!!!!!
Tu N'AS PAS LU DU TOUT ce que j'ai écrit !

If right(key,1)<>"" Then key=key & ""
Test de clef au lieu d'entrée


En VBS, quand on utilise RegRead ou RegWrite, qui servent EXCLUSIVEMENT à
lire ou écrire une ENTRÉE,

Si le paramètre transmis ne se termine pas par "",
cela signifie que le dernier segment est le nom
d'une entrée.

HKLMSoftwareProgToto
-> on lit (ou écrit) l'entrée "toto"
de la clef HKLMSoftwareProg


Si le paramètre transmis se termine par "",
cela signifie que l'on traite l'entrée par DÉFAUT

HKLMSoftwareProgToto
-> on lit (ou écrit) l'entrée par défaut
de la clef HKLMSoftwareProgToto


Et je t'ai donné un script GÉNÉRIQUE !

Une fonction à laquelle on passe une clef en paramètre ...

Dans *TON* cas, avec une clef BIEN PRÉCISE, tu ne vas pas t'amuser à çà,
réfléchis un peu!
(sauf si ton script doit être utilisé pour autre chose)

Ce qui compte, c'est que tu empêches l'arrêt du script en cas d'erreur ...

On error resume next
....
Set registre = CreateObject ("Wscript.Shell")
clef = "HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSLicensing"
valeur=registre.RegRead (clef)

if Err.Number<>0 then
Wscript.Echo "Entrée par défaut non définie"
else
Wscript.Echo valeur
end if

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org
*