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 :

[sys] besoin d'aide pour exécuter une fonction d'un DLL


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [sys] besoin d'aide pour exécuter une fonction d'un DLL
    Bonjour,

    je suis actuellement en train d'apprendre à programmer en Python en autodidacte.

    Pour me lancer dans un défi qui corresponds à un besoin dans mon travail (Automaticien/Roboticien dans la programmation de machine Spé), j'essais de programme un logiciel de changement D'IP automatique de ma/mes carte(s) Réseau.

    l'idée est que le logiciel puisse afficher une GUI avec 3 ou 4 info sur la carte réseau actuellement utilisé/sélectionné et des boutons pour assigner une IP fixe à ma carte, mettre la carte en DHCP, écrire le masque-sous-réseau, etc...

    Pour ce faire, je m'aide d'une librairie qui effectue ses actions mais sous un autre langage (AutoIT 3) (lien de la librairie : Impossible de mettre un lien dans le message ) et j'essais de réécrire cette librairie en Python pour partager cette librairie au plus grand nombre

    mon soucis est le suivant quand j'essais d'exécuté la fonction "DisableNetAdapter" j'ai plusieurs erreur qui apparaisse.

    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    from pprint import pprint
    import winreg
    import ctypes
    import win32com.client
    import platform
     
    wbemFlagReturnImmediately = 0x10
    wbemFlagForwardOnly = 0x20
    Name_PC =platform.node()
     
     
     
    # #FUNCTION# ====================================================================================================================
    # Name...........: _DisableNetAdapter
    # Description....: Disables the specified network adapter.
    # Syntax.........: _DisableNetAdapter($sNetAdapter)
    # Parameters.....: $sNetAdapter    - Name of the network adapter.
    #                                    The Windows network connection name can be used instead of network adapter.
    # Return values..: Success  - 1
    #                  Failure  - 0
    # ===============================================================================================================================
     
    def DisableNetAdapter(NetAdapter):
        wmi_instance = win32com.client.GetObject(r"winmgmts:\\"+ Name_PC + r"\root\cimv2")
        if wmi_instance == 0:
            return 0
        adapterName = GetNetworkAdapterFromID(NetAdapter)
        QueryNetAdapterConfig = str("select * from Win32_NetworkAdapter Where Name = '" + adapterName + "'")
        colNetAdapterConfig = wmi_instance.ExecQuery(QueryNetAdapterConfig,"WQL",(wbemFlagReturnImmediately+wbemFlagForwardOnly))
        if not type(colNetAdapterConfig) is win32com.client.CDispatch:
            return 0
        for objNetAdapter in colNetAdapterConfig:
            try:
                return_obj = ctypes.c_uint32(objNetAdapter.Disable()).value
                if return_obj == 0:
                    return 1
            except:
                pass
        return 0
     
    # #FUNCTION# ====================================================================================================================
    # Name...........: _GetNetworkAdapterFromID
    # Description....: Get the network card name from its Windows network connection name
    # Syntax.........: _GetNetworkAdapterFromID($sNetworkID)
    # Parameters.....: $sNetworkID        - Name of the network connection (ex: Local Area Network).
    # Return values..: Success  - Returns the network adapter name
    #                  Failure  - 0
    # ===============================================================================================================================
     
    def GetNetworkAdapterFromID(NetworkID):
        NetworkList = GetNetworkAdapterList()
        if NetworkList == 0:
            return 0
        for i in range(len(NetworkList)):
            if NetworkList[i][1] == NetworkID:
                return NetworkList[i][0]
        return 0
     
    # #FUNCTION# ====================================================================================================================
    # Name...........: _GetNetworkAdapterList
    # Description....: Get a list of Ethernet network adapter installed on the system
    # Syntax.........: _GetNetworkAdapterList()
    # Return values..: Success  - Returns a 2 dimensional array.
    #                    element[n][0] - Name of the network adapter
    #                    element[n][1] - Name of the network ID
    #                  Failure  - 0
    # ===============================================================================================================================
     
    def GetNetworkAdapterList():
     
        Reg = winreg.ConnectRegistry(None,winreg.HKEY_LOCAL_MACHINE)
        Key = winreg.OpenKey(Reg,r"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces")
        Guid = [];index = [];list1 = [];list2 = [];i = 0
        while 1:
            try:
                Guid.append(winreg.EnumKey(Key,i).upper())
                i += 1
            except: 
                break
        winreg.CloseKey(Key)
        i = 0
        while 1:
            index.append(winreg.EnumKey((winreg.OpenKey(Reg,r"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\")),i)) 
            try:
                for j in range(len(Guid)):
                    if (winreg.QueryValueEx(winreg.OpenKey(Reg,(r"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\" + str(index[i]))),"NetCfgInstanceId")[0]== Guid[j]):
                        list1.append(winreg.QueryValueEx(winreg.OpenKey(Reg,(r"SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\"+ str(index[i])) ,1),"DriverDesc")[0])
                        list2.append(winreg.QueryValueEx(winreg.OpenKey(Reg,(r"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\"+ str(Guid[j]) + "\\Connection") ,1),"Name")[0])     
            except:
                break
            i += 1
        return tuple(zip(list1,list2))
     
    pprint(DisableNetAdapter("Ethernet"))

    donc si j'exécute pprint(DisableNetAdapter("Ethernet")) ma carte réseau est bien désactivé mais je n'ai pas le bon retour avec mon PPRINT car je devrais avoir un retour a 1 quand j'ai pas exécuté la fonction. sauf qu'en "Mode Débuggage" j'ai pu constaté que cette ligne pose problème et arrête l'exécution du "try" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return_obj = ctypes.c_uint32(objNetAdapter.Disable()).value
    j'ai donc décomposé la fonction en commentant toutes la partie "gestion défaut" avec le try et j'obtiens cette erreur :
    Une exception s'est produite : TypeError
    'int' object is not callable
    File "D:\2-Documents\Personnel\Changeur_IP_TEST.py", line 34, in DisableNetAdapter
    return_obj = ctypes.c_uint32(objNetAdapter.Disable()).value
    ^^^^^^^^^^^^^^^^^^^^
    File "D:\2-Documents\Personnel\Changeur_IP_TEST.py", line 250, in <module>
    pprint(DisableNetAdapter("Ethernet"))
    ^^^^^^^^^^^^^^^^^^
    TypeError: 'int' object is not callable
    j'ai beaucoup chercher sur internet mais je ne comprends pas bien l'erreur pouvez-vous m'aidez a la comprendre ?

    je ne comprends pas comment utilisé ctypes pour pouvoir "charger" les fonctions d'un DLL dans mon projet Python.
    si j'ai bien compris la librairie utilise le DLL cimwin32.dll .
    Fichiers attachés Fichiers attachés
    Dernière modification par ProgElecT ; 22/02/2024 à 14h11. Motif: Bienvenue sur DVP, pour les citations - -> balises[QUOTE] . . . [/QUOTE]

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Le code se comporte comme si objNetAdapter.Disable était un entier.
    A vous de le vérifier... Et le cas échéant, ça veut dire que vous n'utilisez pas correctement l'API de cet objet COM (et question à poser dans un forum Windows).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    ça te dit que tu essayes d'utiliser un entier comme une fonction (un "callable").
    après test, objNetAdapter.Disable est un entier (en tout cas chez moi) et non une fonction, d'où le message d'erreur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Tous d'abord merci de vos réponses.

    d'après la documentation de "Win32_NetworkAdapter Class" ci-dessous nous avons 2 méthodes nommées "Disable" et "Enable" qui désactive ou active la carte réseau.

    Voici la documentation : www.learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-networkadapter

    je pense donc que oui "objNetAdapter" est un objet COM et que "Disable()" est une fonction sans paramètres. est-ce-que je me trompe ?

    est-ce-que j'ai un moyen de savoir qu'est ce que sais cette l'objet COM (genre sa class ou sont type) "objNetAdapter" ?

    est ce que cela viens de ma (non) déclaration de l'objet "objNetAdapter" ?

    merci beaucoup de vos réponses et a bientôt sur "l'internet".
    Dernière modification par ProgElecT ; 22/02/2024 à 18h26. Motif: Bienvenue sur DVP, citation inutile, il existe un bouton "répondre à la discussion", vous n’êtes pas obligé d’utiliser le bouton "répondre avec citation".

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par Weezix Voir le message
    je pense donc que oui "objNetAdapter" est un objet COM et que "Disable()" est une fonction sans paramètres. est-ce-que je me trompe ?
    Le fait est que la machine y trouve un entier.
    Après je comprends que vous souhaitiez de l'aide... je vous dis juste que ce n'est peut être pas dans un forum Python que ce genre d'expertise traîne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    Citation Envoyé par Weezix Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
                return_obj = ctypes.c_uint32(objNetAdapter.Disable()).value
    Pouquoi mets-tu un .value ? dans la doc c'est indiqué :
    The Disable method disables the network adapter.
    Syntax
    uint32 Disable();
    Parameters
    This method has no parameters.
    Return value
    Returns zero (0) to indicate success. Any other number indicates an error. For error codes, see WMI Error Constants or WbemErrorEnum.
    Ami calmant, J.P

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Pouquoi mets-tu un .value ? dans la doc c'est indiqué :
    Le .value s'applique à l'objet retourné par ctypes.c_uint32(...).
    Et la documentation de ce bout là est ctypes.

    Et si objNetAdapter.Disable n'est pas une méthode, ça veut peut être dire que la collection colNetAdapterConfig contient des items d'un autre type que ceux attendus où que...

    Plus simple sera d'appeler l'interface WMI ligne de commande via subprocess.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 545
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,

    Pouquoi mets-tu un .value ? dans la doc c'est indiqué :


    Ami calmant, J.P
    le .value est sur le ctype.c_uint32(..), pas sur le Disable


    Sinon, chez moi objNetAdapter est de type 'win32com.client.CDispatch', pas "Win32_NetworkAdapter Class"; et comme dit précédemment objNetAdapter.Disable un entier (non modifiable d'ailleurs)

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    Hello,
    avec le paquet wmi disponible sur pypi c'est beaucoup plus simple. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import wmi
    def disable_network_adapter(NetAdapter):
        c = wmi.WMI()
        network_adapters = c.Win32_NetworkAdapter(NetConnectionID=NetAdapter)
        for adapter in network_adapters:
            ret = adapter.Disable()
            print(ret)
     
    disable_network_adapter("Ethernet")
    A noter qu'il faut être administrateur pour lancer ce code sinon au lieu d'avoir 0 en retour on a 5 (access denied)

    Ami calmant, J.P

  10. #10
    Invité
    Invité(e)
    Par défaut
    merci je ne connaissais pas ce paquet il a l'air vraiment intéressant.

    je vais regarder cela de plus près merci.
    Dernière modification par ProgElecT ; 23/02/2024 à 16h20. Motif: Bienvenue sur DVP, citation inutile, il existe un bouton "répondre à la discussion", vous n’êtes pas obligé d’utiliser le bouton "répondre avec citation".

Discussions similaires

  1. Besoin d'aide pour créer une fonction
    Par Arnvincent dans le forum R
    Réponses: 3
    Dernier message: 07/06/2020, 19h32
  2. [AC-2013] Besoin d'aide pour modifier une fonction
    Par Jsiorat dans le forum VBA Access
    Réponses: 4
    Dernier message: 15/11/2018, 10h27
  3. besoin d'aide pour faire une fonction explicite
    Par killianfer dans le forum Général Python
    Réponses: 1
    Dernier message: 03/11/2018, 11h20
  4. Besoin d'aide pour créer une fonction
    Par xavxx58 dans le forum Prolog
    Réponses: 13
    Dernier message: 14/09/2008, 13h03
  5. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29

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