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 :

Compatibilité winreg / seven


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 88
    Par défaut Compatibilité winreg / seven
    Bonjour,

    je cherche a créer une clef de registre avec un script python. J'ai déjà utilisé le même script sous XP et tout marche niquel.

    Seulement je suis passé a W7 et mon script ne fonctionne plus.

    Voici mon code si vous trouvé une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import _winreg
     
    try:
                    key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, 'Folder\\shell\\CheckFileFormat')
                    key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, 'Folder\\shell\\CheckFileFormat\\command')
                    key = _winreg.OpenKey( _winreg.HKEY_CLASSES_ROOT, 'Folder\\shell\\CheckfileFormat\\command',0, _winreg.KEY_SET_VALUE)                       
                    _winreg.SetValueEx(key, '', 0, _winreg.REG_SZ, '"toto" -i "%1"')
                    _winreg.CloseKey(key)
            except WindowsError,e:
                    print
                    print 'The key registry is not created'
    Après je ne sais pas si winreg est compatible Windows 7 donc je vous pose la question étant donnée que je n'est pas trouvé la moindre info.

    EDIT: Après test l'erreur retournée est :accès refusé

    J'en conclu que j'ai pas les droit d'écrire dans ma propre base de registre en tant qu'administrateur ? O_o ?

    un moyen de contourner tout sa s'il vous plait ?

    Merci.

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Pas de Seven sous la main pour tester. Ce n'est pas l'UAC qui te bloque par hasard ? Mets le (Panneau de configuration > Compte Utilisateur > Modifier les paramètres de contrôle de compte utilisateur) à Ne jamais m'avertir pour tester.



    A tester
    runas /user:Administrator "python tonscript.py"
    @+

  3. #3
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Par défaut
    De mémoire c'est uniquement certaine section du registre qui sont verrouillés.
    A l'époque ou j'ai eu le problème, j'ai simplement déplacé l'écriture de ma clef dans une section autorisée.
    Je n'ai pas eu a modifier quoique ce soit en terme d'administration de Seven.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    C'est en effet l'UAC qui bloque. Modifier HKLM est une opération qui nécessite une élévation, même pour un administrateur. Désactiver l'UAC est une solution un peu trop radicale à mon goût. La difficulté est de faire apparaître le prompt UAC. Il y a beaucoup de méthodes, mais malheureusement aucune, à ma connaissance, ne permet de le faire depuis le script lui-même (à part faire un script qui se relance lui-même mais beurk).

    La solution "runas" de PauseKawa ne fonctionne pas, la commande n'est pas exécutée avec élévation.

    Pour un exécutable, il suffit d'aller dans les propriétés de Compatibilité et de cocher "Exécuter en tant qu'administrateur". Malheureusement ça ne fonctionne pas pour un script. Il faudrait le faire sur python.exe lui-même, mais du coup n'importe quel script ferait apparaître le prompt UAC.

    Deux solutions (parmi d'autres):
    1) Créer un raccourci avec comme cible "C:\Python27\python.exe" "C:\Prog\python\MonScript.py" (par exemple). Dans les propriétés avancées du raccourci, cocher "Exécuter en tant qu'administrateur"

    2) Recopier le script elevate.js qui se trouve ici quelque part dans le PATH et ensuite dans une fenêtre de commande on peut taper: elevate c:\python27\python MonScript.py

    [EDIT:] Pour le fun, la version Python de elevate.js:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from sys import argv
    from ctypes import windll
     
    windll.shell32.ShellExecuteA(None, "runas", argv[1], ' '.join(argv[2:]), None, 1)

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    windll.shell32.ShellExecuteA fonctionne avec du texte comme exec (cela semble être le cas vu le 'runas') ? Si c'est le cas pourquoi ne pas faire de la partie qui touche au registre une variable (comprendre func="""code""") et l'exécuter en interne avec un 'runas' (on ne relance pas donc) ?
    Si windll.shell32.ShellExecuteA n'as pas besoin d'un descripteur de fichier c'est jouable.
    Toujours pas de poste Seven pour tester donc à vous de voir.

    @+

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    re,

    Si le fileno est obligatoire, et vu que je n'ai pas de solution style ramdisk, il reste la possibilité de faire un fichier temporaire à partir d'un texte (func="""code""") pour pouvoir utiliser runas.
    Pas très joli mais cela fonctionne.

    @+

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour PauseKawa,

    Ce que tu proposes est assez similaire au "script qui se relance lui-même", si j'ai bien compris. Le principe est de passer un argument spécial au script; si cet argument spécial est présent, le code s'exécute normalement, sinon le script se relance lui-même avec un ShellExecuteA en passant cet argument spécial. Comme ça, pas besoin de fichier temporaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    if __name__ == '__main__':
        if sys.argv[-1] == 'IamElevated':
            sys.argv.pop()
            main(...)
        else:
            sys.argv.append('IamElevated')
            windll.shell32.ShellExecuteA(None, "runas", sys.executable, ' '.join(sys.argv), None, 1)
    Si, au final, l'application sera "packagée" avec py2exe ou équivalent, là on peut le faire de la façon "propre", c'est-à-dire associer un manifest à l'exécutable.

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Heu... Non en fait.

    Je ne part pas sur un elevate.js mais sur le code Python lui même.
    Je pars sur la supposition (personnelle, je ne l'utilise pas sur ma banquise) que windll.shell32.ShellExecuteA a besoin d'un descripteur de fichier (fileno).

    Dans ce cas, et pour intégrer le tout dans le même code, je ne vois qu'un ramdisk ou la création d'un fichier disque temporaire contenant le code.
    Soit ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    lecode="""import _winreg
     
    try:
        key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, 'Folder\\shell\\CheckFileFormat')
        key = _winreg.CreateKey(_winreg.HKEY_CLASSES_ROOT, 'Folder\\shell\\CheckFileFormat\\command')
        key = _winreg.OpenKey( _winreg.HKEY_CLASSES_ROOT, 'Folder\\shell\\CheckfileFormat\\command',0, _winreg.KEY_SET_VALUE)                       
        _winreg.SetValueEx(key, '', 0, _winreg.REG_SZ, '"toto" -i "%1"')
        _winreg.CloseKey(key)
    except WindowsError,e:
        print
        print 'The key registry is not created'"""
    Écriture d'un fichier contenant le code de 'lecode' dans le dossier temporaire du système et faire le windll.shell32.ShellExecuteA avec.

    Ce n'est pas propre mais bon.

    @+

    Edit: Maintenant si vous avez une solution pour envoyer du texte à un exécutable en tant que fichier... Je prend.

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/06/2011, 21h00
  2. [WD14] Compatibilité WD14 / Windows Seven
    Par step37 dans le forum WinDev
    Réponses: 3
    Dernier message: 29/07/2010, 10h37
  3. Compatibilité driver 32 bit sur seven 64 bit
    Par michelw dans le forum Windows 7
    Réponses: 1
    Dernier message: 09/05/2010, 19h36
  4. Compatibilité Windows Seven
    Par CDA2010 dans le forum Oracle
    Réponses: 1
    Dernier message: 05/12/2009, 16h28
  5. vs compatibilité seven->xp
    Par inconnu259 dans le forum Visual Studio
    Réponses: 8
    Dernier message: 08/09/2009, 16h29

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