Page 1 sur 1

[R] If et RegRead

Posté : lun. 17 nov. 2014 14:39
par yoyox
Bonjour,

j'ai un petit problème concernant la lecture d'une clé registre

Mon script va vérifier si une clé registre existe dans le SID d'un utilisateur

Mon problèmes c'est que je fais une vérification à savoir si le RegRead me renvoie rien un 1 ou un 0 or quand il renvoi 0 ou rien, il me renvoi sur la condition then

Le problème c'est que 0 et rien ne représente pas la même chose ?

aurais-je pas fait une erreur ?

Merci

Code : Tout sélectionner

#RequireAdmin
#NoTrayIcon
#include <MsgBoxConstants.au3>

Opt("TrayIconHide", 1)

Local $sSubKey = "ProfileImagePath"
For $i = 1 To 50
    $sSubKey = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", $i)
    If @error Then ExitLoop
    MsgBox($MB_SYSTEMMODAL, "SubKey #" & $i & " under HKLM\SOFTWARE: ", $sSubKey)
    $key = "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\"
    ;MsgBox(0, "key", $key)
   if RegRead( $key , "ProxyEnable") = ""  Then
      MsgBox(0, "key", "Variable non existante")
   Else
      MsgBox(0, "key", "Variable existante")
       EndIf
Next

Re: [..] If et RegRead

Posté : lun. 17 nov. 2014 15:02
par yoyox
J'ai trouvé la solution en inversant la chose, mais si quelqu'un a la réponse à ma question ça serait cool

merci

Code : Tout sélectionner

#RequireAdmin
#NoTrayIcon
#include <MsgBoxConstants.au3>

Opt("TrayIconHide", 1)

Local $sSubKey = "ProfileImagePath"
For $i = 1 To 50
    $sSubKey = RegEnumKey("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList", $i)
    If @error Then ExitLoop
    MsgBox($MB_SYSTEMMODAL, "SubKey #" & $i & " under HKLM\SOFTWARE: ", $sSubKey)
    $key = "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\"
    ;MsgBox(0, "key", $key)
   if RegRead( $key , "ProxyEnable") = "0" or RegRead( $key , "ProxyEnable") = "1"  Then
      MsgBox(0, "key", "Bon")
   Else
      MsgBox(0, "key", "Pas bon")
       EndIf
Next

Re: [..] If et RegRead

Posté : lun. 17 nov. 2014 17:54
par jguinch
La valeur retournée par RegRead ici est de type Int (car ProxyEnable est de type REG_DWORD)
Si tu compares un entier à une chaîne (comme "" ou "0"), la chaîne sera convertie en entier pour effectuer la comparaison.

Exemple :

Code : Tout sélectionner

; pour le test, il faut que ProxyEnable soit à 0
$ProxyEnable = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable")
If $ProxyEnable = "" Then ConsoleWrite("ProxyEnable est egal a ''" & @CRLF) ; On compare la valeur avec une chaîne vide
If $ProxyEnable = "pouet" Then ConsoleWrite("ProxyEnable est egal a 'pouet'" & @CRLF) ; On compare la valeur avec une chaine
Etonnant non ? 0 = "pouet" :wink:
C'est normal, car une comparaison ne peut comparer que ce qui est comparable.. :?
Donc la valeur "pouet" est convertie en entier (Int), ce qui revient à écrire :

Code : Tout sélectionner

If $ProxyEnable = Int("pouet") Then ConsoleWrite("ProxyEnable est egal a 'pouet'" & @CRLF) ; On compare la valeur avec une chaine

Re: [..] If et RegRead

Posté : lun. 17 nov. 2014 18:38
par yoyox
d'ou l'obligation de faire comme j'ai fais, à l'enver ? en lui disant que si c'est 1 ou 0 alors il continue

mais comment faire si un jour je tombe sur une chaine vide ou inexistante avec RegRead ?

Re: [..] If et RegRead

Posté : lun. 17 nov. 2014 21:47
par jguinch
C'est là qu'intervient @error.
Par exemple, si tu lis une valeur inexistante, RegRead te renverra une valeur vide et @error aura comme valeur -1.
Regarde dans la doc la description de @error pour RegRead (et pour chaque fonction).

Dans ton cas, tu aurais pu faire le test simplement en comparant la valeur avec un entier, et non pas avec une chaîne :
If $ProxyEnable = 0 est différent de If $ProxyEnable = "0"

If $ProxyEnable = 0 (ou 1) => OK : On compare deux entier
If $ProxyEnable = "0" => Pas OK : On compare un entier avec une chaîne. Dans ce cas la chaîne est convertie en entier avant d'être comparée : toute chaîne non numérique deviendra alors 0. C'est pour ça que la condition If 0 = "pouet" est vraie
If String($ProxyEnable) = "0" => OK : On compare deux chaînes

C'est plus clair ?

Re: [..] If et RegRead

Posté : mar. 18 nov. 2014 08:37
par yoyox
Ok, j'ai bien compris la différence entre les deux mais peut etre que j'ai du mal l'appliqué au code
► Afficher le texte
La parti en bleu est un int hors mon if comporte des chaine "0" ou "1"

j'ai donc fait comme tu me la expliqué, j'ai enlever les "" pour mettre mes valeur en int
sauf que cela ne fonctionne plus quand j’enlève les guillemet

peut être que j'ai fait une gaff ?

Merci

Ps: le code fonctionne mais je cherche à comprendre le pourquoi ;)

Re: [..] If et RegRead

Posté : mar. 18 nov. 2014 09:04
par jguinch
Tu veux dire que ce code te renvoi à chaque fois "la valeur ProxyEnable n'est pas renseignée" ?
► Afficher le texte

Edit : pense à utiliser la balise Spoiler pour le code (quand il a y plus de 10 lignes environ...)

Re: [..] If et RegRead

Posté : mar. 18 nov. 2014 10:07
par yoyox
Quand je met les guillemet le script fonctionne correctement, j'ai vérifier dans tout les SID à la main

tu peux essayer le script suivant, essai avec et sans les guillemets
► Afficher le texte

Re: [..] If et RegRead

Posté : mar. 18 nov. 2014 10:46
par jguinch
Avant de poursuivre, j'ai besoin de comprendre : est-ce que le script sera exécuté sur un serveur ? Si non, il n'y a aucune chance pour que ça fonctionne...

Essai ça :
► Afficher le texte

Re: [..] If et RegRead

Posté : mar. 18 nov. 2014 13:29
par orax

Code : Tout sélectionner

if RegRead( $key , "ProxyEnable") [color=#FF0000]==[/color] 0 or RegRead( $key , "ProxyEnable") = 1  Then
Sinon la condition sera toujours vraie.

Ou alors

Code : Tout sélectionner

if RegRead( $key , "ProxyEnable") = "0" or RegRead( $key , "ProxyEnable") = "1"  Then

Code : Tout sélectionner

$a = ''
If $a = 0 Then MsgBox(0, '', '=')
If $a == 0 Then MsgBox(0, '', '==')

Re: [..] If et RegRead

Posté : mar. 18 nov. 2014 15:47
par yoyox
Oui il sera exécute sur un serveur

Re: [..] If et RegRead

Posté : mer. 19 nov. 2014 15:14
par yoyox
Merci orax, mais mon script fonctionne très bien je me posé juste la question posé ci-dessus à propos des int et string sur les clés de registre