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"
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
Code : Tout sélectionner
#RequireAdmin
#NoTrayIcon
#include <MsgBoxConstants.au3>
Opt("TrayIconHide", 1)
;On verifie la version dans le registre de IE et on prend que le premier chiffre
$verifIE = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer", "W2kVersion" )
$versionIE = StringMid ($verifIE, 1, 1)
;On fait une boucle qui va recuperer et mettre en variable les SID des utilisateurs
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\"
; Suivant le cas et ce que l'on trouve on va appliqué ou non les clé de registre
[color=#0000FF] if RegRead( $key , "ProxyEnable") = "0" or RegRead( $key , "ProxyEnable") = "1" Then
MsgBox($MB_SYSTEMMODAL, "proxy", $key)[/color]
#cs
Select
Case @OSVersion = "WIN_XP" AND @OSArch = "X86" AND $versionIE = "8"
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", "REG_DWORD", "1" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyOverride", "REG_SZ", "<local>" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyServer", "REG_SZ", "ip" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Internet Explorer\Main", "Start Page", "REG_SZ", "liens" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Internet Explorer\Main", "IE8RunOncePerInstallCompleted", "REG_DWORD", "1" )
Case @OSVersion = "WIN_XP" AND @OSArch = "X86" AND $versionIE = "6"
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", "REG_DWORD", "1" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyOverride", "REG_SZ", <local>" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyServer", "REG_SZ", "ip" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Internet Explorer\Main", "Start Page", "REG_SZ", "liens" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Internet Explorer\Main", "Search Page", "REG_SZ", "https://google.fr" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Internet Explorer\Main", "Default_Page_URL", "REG_SZ", "liens" )
RegWrite( "HKEY_USERS\" & $sSubKey & "\SOFTWARE\Microsoft\Internet Explorer\Main", "Default_Search_URL", "REG_SZ", "https://google.fr" )
EndSelect
#ce
Else
MsgBox($MB_SYSTEMMODAL, "pas proxy", $key)
EndIf
Next
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
Code : Tout sélectionner
$key = "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\"
if RegRead( $key , "ProxyEnable") = 0 or RegRead( $key , "ProxyEnable") = 1 Then
MsgBox(0, "proxy", "La valeur ProxyEnable est renseignée")
Else
MsgBox(48, "pas proxy", "La valeur ProxyEnable n'est pas renseignée")
EndIf
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
#RequireAdmin
#include <MsgBoxConstants.au3>
#NoTrayIcon
Opt("TrayIconHide", 1)
;On verifie la version dans le registre de IE et on prend que le premier chiffre
$verifIE = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer", "W2kVersion" )
$versionIE = StringMid ($verifIE, 1, 1)
;On fait une boucle qui va recuperer et mettre en variable les SID des utilisateurs
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\"
; Suivant le cas et ce que l'on trouve on va appliqué ou non les clé de registre
if RegRead( $key , "ProxyEnable") = "0" or RegRead( $key , "ProxyEnable") = "1" Then
msgbox(0, "", $sSubKey & "il y a le proxy")
Else
msgbox(0, "", $sSubKey & "il y a pas le proxy")
EndIf
Next
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
Code : Tout sélectionner
$proxy = RegRead( $key , "ProxyEnable")
If @error Then
ConsoleWrite("@error=" & @error & @TAB & $key & @CRLF)
; ConsoleWrite($key & " : il y a pas le proxy" & @CRLF)
; if RegRead( $key , "ProxyEnable") = 0 or RegRead( $key , "ProxyEnable") = 1 Then
Else
ConsoleWrite($key & " : il y a le proxy" & @CRLF)
EndIf
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