[..] Récupérer une clé registre 32bits sur un système 64bits

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

[..] Récupérer une clé registre 32bits sur un système 64bits

#1

Message par franco »

Bonjour.

Je suppose que tout le monde connait l'outil java. :)

Qu'il est possible d'installer java 32 bits et/ou java 64 bits donc sur un système 64 bits.


Pour tout vous dire : j'ai les deux sur mon PC.

J'essaye donc de récupérer les ID désinstallation des 2 java.


Le souci, c'est que :
-> Si le script est compilé en 32 bits, je ne récupère que l'ID de désinstallation de java 32 bits.
-> Si le script est compilé en 64 bits, je ne récupère que l'ID de désinstallation de java 64 bits.

Comment faire pour récupérer les deux clés sous mon système en 64 bits ? Telle est la question. ^^
Sachant que les deux ID sont quasiment similaire.

Exemple :
Je récupère les ID de désinstallation de java via la clé HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
-> ID de désinstallation de java 64 bits : {26A24AE4-039D-4CA4-87B4-2F86418011FF}
-> ID de désinstallation de java 32 bits : {26A24AE4-039D-4CA4-87B4-2F83218011FF}

J'ai pensé à faire un stringreplace avec 64/32.
Mais le hic, c'est qu'il se peut qu'il n'existe qu'un seul JAVA.


J'aimerais bien avoir vos idées sur le fait de récupérer les fameuses ID.
Merci. 8)

Ah oui, voici le code :

Code : Tout sélectionner

$UninstallKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"

$a = 1
While @error = 0
    RegEnumKey($UninstallKey, $a)
    $a += 1
WEnd

For $i = 1 To $a - 2
    If StringLeft(RegEnumKey($UninstallKey, $i), 1) = "{" Then
        If RegRead($UninstallKey & RegEnumKey($UninstallKey, $i), "Contact") = "http://java.com" Then
            MsgBox(0,"",RegEnumKey($UninstallKey, $i))
        EndIf
    EndIf
Next
Cordialement,
Thomas.
L'entraide, c'est mon dada ;)
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#2

Message par Faco »

Ton code a l'aire bien, tu vas peux être pas tout chercher :

"HKLM\SOFTWARE\Microsoft\windows\CurrentVersion\uninstall"
"HKLM\SOFTWARE\Wow6432Node\Microsoft\windows\CurrentVersion\uninstall"
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#3

Message par franco »

Salut.

merci à toi. ^^

Au lancement du script (sans compiler) ça fonctionne pas.
Mais à la compilation, ça fonctionne.

Donc, il faut que je fasse deux fois la détection avec les deux clés.
A priori.


Je reviens dès que j'ai des nouvelles.


@+
L'entraide, c'est mon dada ;)
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#4

Message par franco »

Salut.

Juste pour info
La clé "HKLM\SOFTWARE\Wow6432Node\Microsoft\windows\CurrentVersion\uninstall" ne donne rien.

J'ai été voir la doc. http://www.autoitscript.fr/autoit3/docs ... upport.htm
Pour la base de registre, utilisez HKCR64 ou HKLM64 pour contourner le mécanisme de redirection (Voir les fonctions pour la base de registre dans la documentation).
Maintenant, je comprends mieux.


Je pense que c'est résolu.
Je vais tester.



++
L'entraide, c'est mon dada ;)
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#5

Message par franco »

Salut.

Donc : pas du tout résolu. :mrgreen:

Ce que j'ai compris
=> Si c'est compilé en X86, il ne reconnait pas la clé "HKLM\SOFTWARE\Wow6432Node\Microsoft\windows\CurrentVersion\uninstall"

Logique.

Je ne vais pas me casser la tête je pense.

====

Vu que l'ID est la même - sauf l'élément 32/64 - je vais faire une condition lié à l'architecture.

=> Car si le pc utilisé est un PC en 32 bits, donc forcément, il n'y aura jamais de java 64bits.

=> Mais si le PC est un pc en 64 bits, je récupère l'ID.
Si présence de 32 dans le nom, je créé une variable contenant l'ID mais en modifiant 32 par 64.
Et vice versa.

Je ne vois que cela à faire.


Voici le code fonctionnel :
► Afficher le textecode
Il n'est pas fini, mais le reste je sais le faire.


En tout cas merci.


J'aurais préféré une solution plus... propre. ^^


Mais bon, si elle fonctionne, tant mieux.

Note :
Je posterais le code fini bien sur. ;)



@+
L'entraide, c'est mon dada ;)
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#6

Message par Faco »

il y a peux être des truc à trouver ici "HKLM\SOFTWARE\Classes\Installer\Products"
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#7

Message par franco »

Salut. Et merci, je ne connaissais pas cette clé.

Mais contrairement à la clé uninstall, on ne trouve pas l'ID (entre { } ), utilisé pour la désinstallation de java en mode silencieux.


Merci à toi de m'aider à creuser ^^


++
L'entraide, c'est mon dada ;)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#8

Message par Tlem »

franco a écrit :=> Si c'est compilé en X86, il ne reconnait pas la clé "HKLM\SOFTWARE\Wow6432Node\Microsoft\windows\CurrentVersion\uninstall"
Le code ci-dessous devrait répondre à votre demande :

Code : Tout sélectionner

Global $Arch = "", $IDJAVA = "", $a = 1
If @OSArch =  "X64" Then $Arch = "\Wow6432Node"

Global $UninstallKey = "HKLM\SOFTWARE" & $Arch & "\Microsoft\Windows\CurrentVersion\Uninstall\"


While RegRead($UninstallKey & "\" & RegEnumKey($UninstallKey, $a), "Contact") <> "http://java.com"
    $a += 1
WEnd
$IDJAVA = RegEnumKey($UninstallKey, $a)

MsgBox(0, "ID Java", $IDJAVA)
Le code compilé en x86 fonctionne très bien sur un OS x64 ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#9

Message par jguinch »

franco :
- Un script compilé en 32 bits lit par défaut les clés 32 bits, donc pas besoin de spécifier Wow6432Node. Par contre il faudra utiliser HKLM64 pour lire les clés 64 bits (qui sont dans HKLM\Software)
- Un script compilé en 64 bits lit par défaut les clés 64 bits, donc pas besoin de spécifier HKLM64. Par contre, il faudra utiliser Wow6432Node pour lire les clés 32 bits (qui sont dans HKLM\Software\Wow6432Node)

Pour créer un truc universel, tu as à ta disposition @AutoItX64 qui te permettra d'aiguiller ton script vers les différentes possibilités.

Tlem, tu as pensé à celui qui n'a pas Java ? :P
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#10

Message par orax »

jguinch a écrit :Par contre, il faudra utiliser Wow6432Node pour lire les clés 32 bits (qui sont dans HKLM\Software\Wow6432Node)
Voir : http://msdn.microsoft.com/en-us/library ... 85%29.aspx
MSDN a écrit :Note The Wow6432Node key is reserved. For compatibility, applications should not use this key directly.
J'ai donc pensé qu'avec les fonctions d'AutoIt (Reg...) on pouvait récupérer la version 32 bits du registre depuis un système 64 bits (comme on peut le faire avec RegOpenKeyEx et KEY_WOW64_32KEY). Je n'ai pas pu y arriver. Est-ce normal ? Par contre avec _WinAPI_RegOpenKey on peut récupérer la clef 32 bits sans problème (et surtout sans utiliser Wow6432Node).
► Afficher le texte
Et ça c'est ce que j'ai ajouté au registre pour les tests.
► Afficher le texteAutoIt.reg
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#11

Message par jguinch »

Merci orax.
Effectivement, Wow6432Node est une clé réservée (à ne pas utiliser dans un programme normalement). Mais ici, on parle d'un programme qui a justement besoin d'accéder à cette ruche.
Donc je pense qu'à partir du moment où on sait où on met les pieds, on peut se permettre d'y aller (prudemment). En plus, ici c'est uniquement pour de la lecture de clé.
Cela dit, la doc est intéressante :)

De tout façon, le programme que va réaliser Franco devra être compilé en 32 bits; s'il doit pouvoir s'exécuter sur un système 32 bits.
Donc les deux clés à lire sont :
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall (pour la partie 32bits)
- HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall (pour la partie 64 bits) - seulement si OSArch = 64 bits
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#12

Message par Tlem »

jguinch a écrit :Tlem, tu as pensé à celui qui n'a pas Java ? :P
Java est omniprésent sur les machines actuelle. Ceci dit le cas peux effectivement ce présenter et dans ce cas on est prisonnier de la boucle While, donc pour résoudre le problème tout en prenant en compte la remarque d'orax (Note The Wow6432Node key is reserved. For compatibility, applications should not use this key directly.) :

Code : Tout sélectionner

Global $Arch = "", $IDJAVA = "", $IDRead, $a = 1
If @OSArch =  "X64" Then $Arch = "64"

Global $UninstallKey = "HKLM" & $Arch & "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"


While 1
    $IDJAVA = RegEnumKey($UninstallKey, $a)
    If @error Then ExitLoop
    If RegRead($UninstallKey & "\" & $IDJAVA, "Contact") = "http://java.com" Then ExitLoop
    $a += 1
WEnd


MsgBox(0, "ID Java", $IDJAVA)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#13

Message par orax »

Avec ce code, il n'y a qu'avec la version 32 bits (compilée) que j'arrive à avoir le résultat souhaité. (Je n'ai pas la βετα d'AutoIt.)

Pour la version 32 bits du script :
– avec $UninstallKey = "HKLM..., ça me retourne la clef 32 bits (la partie dans \SOFTWARE\Wow6432Node\Microsoft\...)
– avec $UninstallKey = "HKLM64..., ça me retourne la clef 64 bits (la partie dans \SOFTWARE\Microsoft\...)

Pour la version 64 bits du script :
– avec HKLM ou HKLM64, c'est pareil, ça me retourne la clef 64 bits
Dans cette version, je n'ai donc pas accès à ce qui ce trouve dans Wow6432Node à moins d'y accéder directement par la clef "HKLM\SOFTWARE\Wow6432Node\".

Je ne sais pas si c'est bien le comportement normal des fonctions RegEnumKey, etc. mais ça me semble bizarre. C'est comme si, quand le script est compilé en 64 bits, le fait d'ajouter "64" après "HK..." ne faisait rien de plus.

D'ailleurs en passant directement par les fonctions de l'API Windows, j'ai bien le comportement souhaité. Que le script soit compilé (ou pas) en 32 ou 64 bits, je récupère bien les IDs de désinstallation de Java 32 et 64 bits.
J'ai aussi ajouté une condition sur "DisplayName" sinon il récupérait aussi l'ID du JDK de Java.
► Afficher le texte
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#14

Message par jguinch »

orax a écrit :C'est comme si, quand le script est compilé en 64 bits, le fait d'ajouter "64" après "HK..." ne faisait rien de plus
C'est le comportement "normal" : un script compilé/exécuté en 64 bits n'est pas concerné par la redirection Wow6432Node, donc HKLM = HKLM64.
Alors que pour un script compilé/exécuté en 32 bits, le redirection s'applique et on a HKLM\Software = HKLM\software\Wow6432Node.

L'exemple de la fonction RegEnumVal utilise Wow6432Node pour lister des clés 32 bits. Si c'est dans l'exemple, c'est qu'on peut se servir de Wow6432Node (un peu ce que déconseille MSDN du coup).

Pour clarifier les choses, petit test à faire chez soi :
Ouvrir deux invites de commande : l'une normale, depuis Démarrer, Exécuter : CMD, et l'autre depuis C:\Windows\SysWOW64\cmd.exe. On a ici deux invites de commandes, l'une en 64 et l'autre en 32 bits.
Dans chaque invite de commande, taper reg query "HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt" /v Version
L'une nous dira que le chemin est introuvable (64 bits), l'autre nous donnera la valeur (32 bits).

Les solutions avec la commande reg.exe pour lire des valeurs natives ou redirigées sont :
- spécifier le chemin "complet" : Wow6432Node (par ex)
- utiliser la commande reg.exe sous c:\windows\SysWOW64 (depuis invite x64) ou c:\windows\sysnative (depuis invite x86)
- utiliser le commutateur /reg:32 ou /reg:64
Concernant AutoIt, il y a la possibilité d'utiliser HKLM64, mais il n'existe pas de HKLM32 (dommage).

Donc au final avec AutoIt, c'est soit utilisation de HKLM64 et/ou Wow6432Node avec les fonctions Reg natives, soit utilisation des fonctions WinAPI (comme proposé par Orax).

Je sais pas si j'ai été clair :?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#15

Message par orax »

En fait, mon interprétation de la doc était mauvaise, parce qu'en lisant :
When running on 64-bit Windows if you want to enum a value specific to the 64-bit environment you have to suffix the HK... with 64 i.e. HKLM64.
Par "value specific to the 64-bit environment" je comprenais qu'il s'agissait des clefs contenues dans Wow6432Node. Car les clefs/valeurs dans Wow6432Node sont justement spécifiques à un environnement 64 bits.
Et le fait que cela ne concerne que la version 32 bits du script n'est pas indiqué sur cette page mais sur une autre :
Titre > Exécuter la version 32-bit de AutoIt sur un système x64
Pour la base de registre, utilisez HKCR64 ou HKLM64 pour contourner le mécanisme de redirection (Voir les fonctions pour la base de registre dans la documentation).
En tout cas merci pour cette réponse, ça m'a aidé à y voir plus clair ! Il n'y avait donc pas de problème, ce n'était qu'une fonctionnalité ! :mrgreen:
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#16

Message par Tlem »

Tout à fait. D'ailleurs la chose qui pose le plus de problème, c'est la lecture d'une clé x86 dans un environnement x64 avec un script compilé en x64. J'avais écrit cela il y à 2 ans (http://www.autoitscript.fr/forum/viewto ... 091#p74091).

Maintenant, vu que vous ne faites que de la lecture de clé, l'utilisation de Wow6432Node ne pose pas de problème particulier.
Je vous ai refait le script pour prendre en compte vos remarques et pour vous donner la liste des IDs en fonction des versions de Java installé, car vous pouvez en avoir plusieurs (Java 6, Java 7, x32, x64). ;)
► Afficher le texte
Après, pourquoi ne compilez vous pas votre script uniquement en x86 ?
Cela vous simplifierait la tache ... :roll:
Cela vous éviterait seulement d'utiliser Wow6432Node dans le chemin de la clé de registre. :mrgreen:
Et donc dans le code ci-dessus, la ligne :

Code : Tout sélectionner

$RootKeyx86 = "HKLM\SOFTWARE\Wow6432Node"
deviendrait

Code : Tout sélectionner

$RootKeyx86 = "HKLM\SOFTWARE"
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#17

Message par jguinch »

Peut-être que ça peut vous intéresser : _UninstallList : Liste/recherche des applications installées :wink:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
franco
Niveau 7
Niveau 7
Messages : 343
Enregistré le : lun. 03 oct. 2011 22:37
Localisation : Liévin
Status : Hors ligne

Re: [..] Récupérer une clé registre 32bits sur un système 64

#18

Message par franco »

Salut.

Oh pinaise, y'a eu du peuple ici :shock:
Désolé de répondre que maintenant, j'étais occupé.

Le dernier code de TLEM fonctionne. ;)


Un grand merci à tous. :D
Je vais tout relier, y compris les codes, afin de mieux comprendre.

Moi qui détectai une seule ID et ensuite "la convertissait" sans savoir si elle existait, le code permet donc une réelle et propre détection de Java.

Ouf ^^
Merci encore.


Le reste étant déjà codé, me reste plus qu'à adapter le code.

Je reviendrai avec le code final.



@+
L'entraide, c'est mon dada ;)
Répondre