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

C++ Discussion :

Comment émuler "ipconfig /all" avec l'API Windows ?


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Comment émuler "ipconfig /all" avec l'API Windows ?
    Bonjour,

    Je cherche à récupérer une adresse MAC sur mon PC à partir de la fonction NetBios de l'API Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <windows.h>
    ...
    int main () {
        NCB ncb;
        UCHAR uRetCode;
        char NetName[50];
     
        memset( &ncb, 0, sizeof(ncb) );
        ncb.ncb_command = NCBRESET;
        ncb.ncb_lana_num = 0;// 0
     
        uRetCode = Netbios( &ncb );
        printf( "The NCBRESET return code is: 0x%x \n", uRetCode );
    et le code de retour est 0x023, ce qui veut dire : "NB_INVALID_ADAPTER"

    Le problème est que ma liste d'adaptateurs est vide !!!

    C'est quoi ces "adaptateurs" ?
    Comment récupérer l'adresse MAC alors ?

    Dans ma configuration j'ai une carte ethernet qui me sert pour le réseau local avec un autre PC (déconnecté lorsque j'ai exécuté ce code).
    Ma connexion internet passe par un modem et un port USB...

    Tout en écrivant, j'ai démarré mon second PC et mon programme m'a retourné l'adresse mac exacte de ma carte ethernet...

    Pourtant, si je tape en mode console "ipconfig /all", j'obtiens bien l'adresse physique (mac) de ma carte éthernet et de ma carte internet ADSL (celle qui m'intéresse)

    Si je change cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ncb.ncb_lana_num = 1;// 0 avant
    , j'obtiens de nouveau un code 023

    ipconfig /all me récupère bien les deux adresses mac même sans être connecté. Commet pourrais-je émuler le fonctionnement de cette commande avec l'API Windows ?

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Tu peux toujours utiliser les tubes (pipes en anglais) pour exécuter "ipconfig /all" et récupérer sa sortie. Après, je ne sais pas ce qu'il en est pour ton code.
    Renseigne donc toi sur _popen,_pclose, etc.
    http://msdn2.microsoft.com/en-us/lib...4b(VS.80).aspx est un bon début.

    Par contre, attention c'est issu du C donc il faut passer par FILE* & compagnie. Donc essaye de bien encapsuler cela afin de ne pas laisser le C envahir ton code C++.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Pourquoi ne pas utiliser "GetAdaptersInfo", ici:

    http://msdn2.microsoft.com/en-us/lib...14(VS.85).aspx

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 106
    Points : 153
    Points
    153
    Par défaut
    Citation Envoyé par moldavi Voir le message
    Bonjour.

    Pourquoi ne pas utiliser "GetAdaptersInfo", ici:

    http://msdn2.microsoft.com/en-us/lib...14(VS.85).aspx
    Comme le dit moldavi, GetAdaptersInfo est parfait, tu peux recuperer pour chaque adaptateur les IPs, gateways, addresse MAC, si oui on non l'adaptateur est en DHCP, nom du driver, ... Avec les masques, tu peux aussi savoir si une IP est locale ou internet, tres tres pratique cette fonction!

  5. #5
    Invité
    Invité(e)
    Par défaut
    Cool, merci pour ces réponses !

    Citation Envoyé par Alp Voir le message
    Tu peux toujours utiliser les tubes (pipes en anglais) pour exécuter "ipconfig /all" et récupérer sa sortie.
    Merci pour cette proposition, mais je ne veux pas, parce que ipconfig n'est pas compatible Windows 98 et je voudrais que le code fonctionne sur Win98 à XP.


    Citation Envoyé par moldavi
    Pourquoi ne pas utiliser "GetAdaptersInfo", ici:
    Citation Envoyé par unmanos
    Comme le dit moldavi, GetAdaptersInfo est parfait
    Je l'ai fait, mais il ne fonctionne pas comme ipconfig. Si la connexion n'est pas établie, la liste des adaptateurs est vide !!!!
    Sinon effectivement, j'ai essayé cette fonction, je récupère bien la même adresse Mac de ma carte Ethernet qu'avec IPConfig...

    L'avantage de IPConfig est qu'il n'a pas besoin que la connexion soit établie, il fonctionne tout le temps...

    De plus, IPConfig me renvoie l'adresse mac "PPP carte Internet ADSL" que je n'arrive pas à avoir avec "GetAdaptersInfo"...

    Je cherche la fonction qui est vraiment utilisée par IPconfig, et ce n'est apparemment pas GetAdaptersInfo...

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Re.

    Peut-être que du côté de WMI (Windows Management Instrumentation), tu trouveras ton bonheur.

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 109
    Points : 48
    Points
    48
    Par défaut
    Salut

    Attention avec les WMI, j avoue que ca simplifie beaucoup la vie , et encore plus avec wmi code creator de MS.

    mais toutes les fonctions ne sont pas disponible selon la version de windows que l on a, docn attention a ce que tu veux faire exactement avec. Sinon probleme de portabilité en perspective.
    Mais bon d un autre cote si c ets uniquement avec pour avoir les MAC ca devrai aller .. Tout a fait daccord. moi aussi je vote pour ca

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par lezurp Voir le message
    Attention avec les WMI, j avoue que ca simplifie beaucoup la vie , et encore plus avec wmi code creator de MS.

    mais toutes les fonctions ne sont pas disponible selon la version de windows que l on a,
    A priori, WMI est préinstallé sur Windows Server 2003, Windows XP, Windows Me, Windows 2000, et Windows Vista... et pas sur Windows 98... ?
    C'est pas bon alors... je voudrais une compatibilité de Windows 98 à Windows XP.

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    De mémoire, ipconfig est livré avec Win95 et Win98...
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Niark13 Voir le message
    De mémoire, ipconfig est livré avec Win95 et Win98...
    Effectivement, je m'étais embrouillé avec Winipcfg qui n'existe que sur Windows 95 et 98.
    Bonne nouvelle, merci.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Alp Voir le message
    Tu peux toujours utiliser les tubes (pipes en anglais) pour exécuter "ipconfig /all" et récupérer sa sortie. Après, je ne sais pas ce qu'il en est pour ton code.
    Renseigne donc toi sur _popen,_pclose, etc.
    http://msdn2.microsoft.com/en-us/lib...4b(VS.80).aspx est un bon début.

    Par contre, attention c'est issu du C donc il faut passer par FILE* & compagnie. Donc essaye de bien encapsuler cela afin de ne pas laisser le C envahir ton code C++.
    Merci, j'ai écrit ce code qui fonctionne, à partir d'un exemple Microsoft :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <fstream>
     
    using namespace std;
     
    int main( void ) {
       char   psBuffer[128];
       FILE   *fRead;
     
       if( ( fRead = _popen( "ipconfig /all", "rt" )) == NULL )
          exit( 1 );
     
       ofstream f_Out;
       f_Out.open("fichier test.txt" , ios::out | ios::binary );
       while( ! feof( fRead ) ) {
          if( fgets( psBuffer, 128, fRead ) != NULL ) {
             //printf( psBuffer );
             f_Out << psBuffer;
          }
       }
       f_Out.close();
       /* Close pipe and print return value of CHKDSK. */
       printf( "\nProcess returned %d\n", _pclose( fRead ) );
       system("PAUSE");
    }// main
    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
    Configuration IP de Windows 2000
     
    	Nom de l'h“te . . . . . . . . . . : xxx
    	Suffixe DNS principal . . . . . . : A
    	Type de noud. . . . . . . . . . . : Diffuser
    	Routage IP activ‚ . . . . . . . . : Non
    	Proxy WINS activ‚ . . . . . . . . : Non
    	Liste de recherche de suffixe DNS : A
     
    Ethernet carte Connexion au r‚seau localÿ:
     
    	tat du media . . . . . . . . . . : Cƒble D‚connect‚
    	Description . . . . . . . . . . . : VIA Rhine II Fast Ethernet Adapter
    	Adresse physique. . . . . . . . . : : xx-xx-xx-xx-xx-xx
     
    PPP carte Internet ADSLÿ:
     
    	Suffixe DNS sp‚c. … la connexion. : 
    	Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
    	Adresse physique. . . . . . . . . : xx-xx-xx-xx-xx-xx
    	DHCP activ‚ . . . . . . . . . . . : Non
    	Adresse IP. . . . . . . . . . . . : xxx
    	Masque de sous-r‚seau . . . . . . : 255.255.255.255
    	Passerelle par d‚faut . . . . . . : xxx
    	Serveurs DNS. . . . . . . . . . . : xxx
    Par contre, sur un Windows "étranger", je ne trouverais pas "Adresse physique", "Physical Address", par exemple... Comment récupérer les "bons" champs à coup sûr ?
    Je pensais me baser sur le ":" et les séparateurs "-" qui n'existent que pour les adresses physiques...
    Dernière modification par Invité ; 26/03/2008 à 17h24. Motif: Oubli..

Discussions similaires

  1. Comment ajouter une chaîne dans une liste avec les API Windows ?
    Par DelphiCool dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 02/02/2013, 13h47
  2. Réponses: 69
    Dernier message: 15/06/2006, 11h42
  3. Réponses: 1
    Dernier message: 26/02/2005, 12h55
  4. Réponses: 3
    Dernier message: 09/11/2004, 10h44

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