IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

souci lecture detail registre [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut souci lecture detail registre
    Bonjour,

    j'ai un souci de lecture registre dans le détail d'une sous/clé mais sur un ensemble de lecture de clés.
    voici mon code
    Je voudrais lire la valeur des sous clés, il s'agit de clés de service, donc certaines clés de possède pas la valeur Start qui définie si actif, désactivé etc...

    Lire la suite des clés de services pas de souci mais dans la boucle chaque clé possède une valeur start ,enfin généralement, donc quand cette clé ne la possède pas je sors du traitement.
    J'ai essayé divers combinaison, mais rien, que neni.. à force d'essai je commence a ne plus pouvoir être cohérent

    si on pouvais me donner une solution, merci....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    TxtSecurite2.delete("1.0",END)     
     
            TxtSecurite2.insert(END,'\n\n\r'+'Liste des Services ..'+'\n\r')
            typevaleur=0
            regHandle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"SYSTEM\\ControlSet001\\Services",0, _winreg.KEY_READ)
            try:
                i=0
     
                while 1:
                    name = _winreg.EnumKey(regHandle,i)
                    (typevaleur) = _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE,"SYSTEM\\ControlSet001\\Services\\"+(name))
                    (val01,val02) = _winreg.QueryValueEx(regHandle,'Start')
                    TxtSecurite2.insert(END,u'service....... : '+name+' '+str(val01)+val02+'\n\r')
     
                    i += 1
     
     
            except EnvironmentError as err:
                TxtSecurite2.insert(END,u'impossible de lire '+name)
                pass 
     
            _winreg.CloseKey(regHandle)

    Alors que là les services je les lis, mais comme plus haut, c'est la valeur de ces clés ,la valeur 'start' qui pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    regHandle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"SYSTEM\\ControlSet001\\Services",0, _winreg.KEY_READ)
    try:
        i=0
     
        while 1:
            name = _winreg.EnumKey(regHandle,i)
            print('service....... : '+name+'\n\r')     
            i += 1     
     
    except EnvironmentError as err:
        print('impossible de lire '+name)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    MS-Windows n'est pas trop mon monde mais juste en me basant sur la doc officielle suivante : https://docs.python.org/2.7/library/_winreg.html

    J'ai établi ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from __future__ import unicode_literals
    import os
    import _winreg
     
    def win_path (path_str):
        "reconstruit un chemin conforme à Windows"
        return os.path.normpath(str(path_str))
    # end def
     
    def build_path (path_str, *args):
        "construit un chemin conforme à Windows"
        return win_path(os.path.join(path_str, *args))
    # end def
     
    def dump_subkey (path_str):
        """
            retourne un dict() de valeurs et une list() des sous-clés d'une
            clé de registre donnée; on peut aussi se servir de cette
            fonction en récursivité dans une arborescence;
        """
        dict_values = dict()
        list_subkeys = list()
        with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, win_path(path_str)) as h_key:
            nb_subkeys, nb_values, last_modified = _winreg.QueryInfoKey(h_key)
            # on remplit le dict() de valeurs
            for i in range(nb_values):
                kv_name, kv_value, kv_type = _winreg.EnumValue(h_key, i)
                dict_values[kv_name] = str(kv_value)
            # end for
            # on remplit la liste de noms de sous-clés
            for i in range(nb_subkeys):
                subkey_name = _winreg.EnumKey(h_key, i)
                list_subkeys.append(subkey_name)
            # end for
        # end with
        # on retourne un tuple
        return (dict_values, list_subkeys)
    # end def
     
    # début du test (output: console IDLE)
     
    dict_values, list_subkeys = dump_subkey("SYSTEM/ControlSet001/Services")
     
    print "\nValues:\n"
    print dict_values
    print "\nSubkeys:\n"
    print list_subkeys
    Je ne sais pas si c'est exactement ce que vous cherchez, mais c'est peut-être un début de piste... ?

    @+.

  3. #3
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut
    bonjour tarball69

    le problème est que dict_values reste vide avec _winreg.EnumValue(h_key, i)
    d'après ce que j'ai pu voir la fonction EnumValue serait buguée

    car ce que je veux c'est :

    "SYSTEM/ControlSet001/Services"

    sous clé : par exemple = AdobeARMservice

    Ensuite les valeurs de sous clés = liste de toutes les valeurs registre avec (Nom, Type, Données)

    ensuite suivant le nom et valeur de la donnée, je donne une information supplémentaire


    dur dur, il y a bien une fonction a utiliser !!

    merci encore pour ton temps.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Thierry_V Voir le message
    bonjour tarball69

    le problème est que dict_values reste vide avec _winreg.EnumValue(h_key, i)
    d'après ce que j'ai pu voir la fonction EnumValue serait buguée
    ah ben pas chez moi en tout cas (voir ci-dessous).

    j'obtiens bien des valeurs pour les sous-clés qui en ont (lorsqu'elles en ont).

    car ce que je veux c'est :

    "SYSTEM/ControlSet001/Services"

    sous clé : par exemple = AdobeARMservice

    Ensuite les valeurs de sous clés = liste de toutes les valeurs registre avec (Nom, Type, Données)

    ensuite suivant le nom et valeur de la donnée, je donne une information supplémentaire


    dur dur, il y a bien une fonction a utiliser !!

    merci encore pour ton temps.
    Essayez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from __future__ import unicode_literals
    import os
    import _winreg
     
    def win_path (path_str):
        "reconstruit un chemin conforme à Windows"
        return os.path.normpath(str(path_str))
    # end def
     
    def build_path (path_str, *args):
        "construit un chemin conforme à Windows"
        return win_path(os.path.join(path_str, *args))
    # end def
     
    def dump_subkey (path_str):
        """
            retourne un dict() de valeurs et une list() des sous-clés d'une
            clé de registre donnée; on peut aussi se servir de cette
            fonction en récursivité dans une arborescence;
        """
        dict_values = dict()
        list_subkeys = list()
        with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, win_path(path_str)) as h_key:
            nb_subkeys, nb_values, last_modified = _winreg.QueryInfoKey(h_key)
            # on remplit le dict() de valeurs
            for i in range(nb_values):
                kv_name, kv_value, kv_type = _winreg.EnumValue(h_key, i)
                dict_values[kv_name] = kv_value
            # end for
            # on remplit la liste de noms de sous-clés
            for i in range(nb_subkeys):
                subkey_name = _winreg.EnumKey(h_key, i)
                list_subkeys.append(subkey_name)
            # end for
        # end with
        # on retourne un tuple
        return (dict_values, list_subkeys)
    # end def
     
    # début du test (output: console IDLE)
     
    root_path = "SYSTEM/ControlSet001/Services"
    dict_values, list_subkeys = dump_subkey(root_path)
    nb_items = 10
    # liste les 10 premiers
    for subkey in list_subkeys[:nb_items]:
        sk_path = build_path(root_path, subkey)
        d_values, l_subkeys = dump_subkey(sk_path)
        print "Key:", sk_path
        print "Values:", d_values
        print "Subkeys:", l_subkeys
        print "-" * 80
    # end for
    Pour l'instant, c'est juste histoire d'éventrer la bête on pourra optimiser le code plus tard.

    Note: j'ai limité le dump à 10 sous-clés parce que sinon, il m'en sortait plus de 500 !

    Vous pouvez modifier la variable nb_items = 10 avec le nombre de sous-clés que vous souhaitez analyser.

    Avec ce snippet, j'obtiens sous Win 8 :

    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Key: SYSTEM\ControlSet001\Services\.NET CLR Data
    Values: {}
    Subkeys: ['Linkage', 'Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\.NET CLR Networking
    Values: {}
    Subkeys: ['Linkage', 'Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\.NET CLR Networking 4.0.0.0
    Values: {}
    Subkeys: ['Linkage', 'Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\.NET Data Provider for Oracle
    Values: {}
    Subkeys: ['Linkage', 'Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\.NET Data Provider for SqlServer
    Values: {}
    Subkeys: ['Linkage', 'Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\.NET Memory Cache 4.0
    Values: {}
    Subkeys: ['Linkage', 'Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\.NETFramework
    Values: {}
    Subkeys: ['Performance']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\1394ohci
    Values: {'Owners': [u'1394.inf'], 'ImagePath': u'\\SystemRoot\\System32\\drivers\\1394ohci.sys', 'DisplayName': u'@1394.inf,%PCI\\CC_0C0010.DeviceDesc%;1394 OHCI Compliant Host Controller', 'Start': 3, 'ErrorControl': 1, 'Group': u'', 'Type': 1}
    Subkeys: []
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\3ware
    Values: {'Owners': [u'3ware.inf'], 'ImagePath': u'System32\\drivers\\3ware.sys', 'Group': u'SCSI miniport', 'Start': 0, 'Tag': 66, 'ErrorControl': 1, 'Type': 1}
    Subkeys: ['Parameters', 'StartOverride']
    --------------------------------------------------------------------------------
    Key: SYSTEM\ControlSet001\Services\ACPI
    Values: {'Owners': [u'acpi.inf'], 'ImagePath': u'System32\\drivers\\ACPI.sys', 'DisplayName': u'@acpi.inf,%ACPI.SvcDesc%;Microsoft ACPI Driver', 'Start': 0, 'Tag': 2, 'ErrorControl': 3, 'Group': u'Core', 'Type': 1}
    Subkeys: ['Parameters', 'Enum']
    --------------------------------------------------------------------------------
    

    Apparemment, il suffirait de tester par exemple if "Start" in d_values: à chaque itération de subkey pour rajouter des infos spécifiques.

    C'est un exemple, il faut adapter à vos besoins persos, évidemment.

    @+.

  5. #5
    Membre confirmé Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Par défaut
    Bonsoir

    ça fonctionne , donc pour déterminer le nombre de clé j'ai fais cette fonction et mis :
    nb_items = nbcle()

    Est-ce correcte ?

    ce qui veux dire dans la fin de votre code je teste les valeurs et les places dans un fichier pour organiser un rapport txt ?
    ce qui me surprends c'est la syntaxe des print, il n'y a pas de (

    un bout de teste ok

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for subkey in list_subkeys[:nb_items]:
        sk_path = build_path(root_path, subkey)
        d_values, l_subkeys = dump_subkey(sk_path)
        if 'Start' in d_values:
     
            print "Subkeys:", l_subkeys
            for i in d_values:
                print "Values:", d_values[i], i
     
            print "Key:", sk_path
            print "-" * 80
    # end for

    En tout cas merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # fonction de compteur Nb services
     
    def nbcle(): 
        regHandle = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"SYSTEM\\ControlSet001\\Services",0, _winreg.KEY_READ)
        i=0
        nb=0
        try:
            while 1:
                sid = _winreg.EnumKey(regHandle,i)
                nb += 1
                i += 1       
        except EnvironmentError as err:
            return (nb)

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Thierry_V Voir le message
    Bonsoir

    ça fonctionne , donc pour déterminer le nombre de clé j'ai fais cette fonction et mis :
    nb_items = nbcle()

    Est-ce correcte ?
    Bah non, il suffit d'enlever la bride :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    from __future__ import unicode_literals
    import os
    import _winreg
     
    def win_path (path_str):
        "reconstruit un chemin conforme à Windows"
        return os.path.normpath(str(path_str))
    # end def
     
    def build_path (path_str, *args):
        "construit un chemin conforme à Windows"
        return win_path(os.path.join(path_str, *args))
    # end def
     
    def dump_subkey (path_str):
        """
            retourne un dict() de valeurs et une list() des sous-clés d'une
            clé de registre donnée; on peut aussi se servir de cette
            fonction en récursivité dans une arborescence;
        """
        dict_values = dict()
        list_subkeys = list()
        with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, win_path(path_str)) as h_key:
            nb_subkeys, nb_values, last_modified = _winreg.QueryInfoKey(h_key)
            # on remplit le dict() de valeurs
            for i in range(nb_values):
                kv_name, kv_value, kv_type = _winreg.EnumValue(h_key, i)
                dict_values[kv_name] = kv_value
            # end for
            # on remplit la liste de noms de sous-clés
            for i in range(nb_subkeys):
                subkey_name = _winreg.EnumKey(h_key, i)
                list_subkeys.append(subkey_name)
            # end for
        # end with
        # on retourne un tuple
        return (dict_values, list_subkeys)
    # end def
     
    # début du test (output: console IDLE)
     
    root_path = "SYSTEM/ControlSet001/Services"
    dict_values, list_subkeys = dump_subkey(root_path)
    # mettez 0 ou None pour enlever la bride
    nb_items = 10
    #nb_items = None
    if nb_items:
        sk_list = list_subkeys[:nb_items]
    else:
        sk_list = list_subkeys
    # end if
    # liste les nnn premiers
    # ou tout si bride enlevée
    for subkey in sk_list:
        sk_path = build_path(root_path, subkey)
        d_values, l_subkeys = dump_subkey(sk_path)
        if 'Start' in d_values:
            print "Key:", sk_path
            print "Subkeys:", l_subkeys
            print "Values:"
            for key, value in d_values.items():
                print key, "=", value
            # end for
            print "-" * 80
        # end if
    # end for
    ce qui veux dire dans la fin de votre code je teste les valeurs et les places dans un fichier pour organiser un rapport txt ?
    Vous disposez de données structurées : vous en faites bien ce que vous voulez (affichage console, affichage tkinter.Text() ou encore dump fichier.txt, etc).

    ce qui me surprends c'est la syntaxe des print, il n'y a pas de (
    c'est le print statement de Python2 : https://docs.python.org/2.7/referenc...mts.html#print

    voir la fonction print : https://docs.python.org/2.7/library/...ons.html#print

    si vous voulez la notation Python3, il vous faut mettre from __future__ import print_function en tête de script.

    un bout de teste ok

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for subkey in list_subkeys[:nb_items]:
        sk_path = build_path(root_path, subkey)
        d_values, l_subkeys = dump_subkey(sk_path)
        if 'Start' in d_values:
     
            print "Subkeys:", l_subkeys
            for i in d_values:
                print "Values:", d_values[i], i
     
            print "Key:", sk_path
            print "-" * 80
    # end for
    Oui, vous pouvez simplifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for subkey in sk_list:
        sk_path = build_path(root_path, subkey)
        d_values, l_subkeys = dump_subkey(sk_path)
        if 'Start' in d_values:
            print "Key:", sk_path
            print "Subkeys:", l_subkeys
            print "Values:"
            for key, value in d_values.items():
                print key, "=", value
            # end for
            print "-" * 80
        # end if
    # end for
    @+.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. RegEnumValue() pour la lecture de registre
    Par scarlaty dans le forum Windows
    Réponses: 5
    Dernier message: 28/02/2008, 09h04
  2. Lecture du Registre Windows
    Par mourbare dans le forum Windows
    Réponses: 2
    Dernier message: 27/02/2008, 08h42
  3. Lecture du registre style parseur
    Par Verbalinsurection dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2007, 15h15
  4. [CR9] Lecture du registre
    Par exyacc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/11/2005, 11h17
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo