Obtenir une mac adresse en c++

Signaler
Messages postés
56
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
2 septembre 2011
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour,
Je cherche un code permettant de récupérer la mac adresse de la carte réseau numéro 1 d'un pc. Après une journée de recherche je commence a croire que c'est impossible, tout les codes que je trouve ne fonctionne pas.
Je code avec Code Blocks en C++ une appli Win32.
Merci d'avance.

5 réponses

Messages postés
56
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
2 septembre 2011

Mieu encore, si je pouvais récupérer le numéro de série du CPU. Ce que je sais c'est que c'est possible, voir ici : http://www.cppfrance.com/codes/TAG-CLE-UNIQUE_47949.aspx
Mais j'ai pas assez de connaissance pour y extraire juste ce qu'il me faut. Trop complexe sont code.
Quelqu'un peu m'aider pour récupérer le numero de serie du CPU?
Merci d'avance.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
#include <windows.h>
#include <rpc.h>
#pragma comment(lib, "Rpcrt4.lib")

char szappname[] = "MacAddress";


__declspec(naked) char* __fastcall bnbhex(unsigned int value, char* pdst){ // ECX value, EDX pdst
  __asm {
    add       edx, 2
    mov       al, cl
    mov       byte ptr[edx], 0
    and       al, 15
    shr       cl, 4
    add       al, 48
    cmp       al, 57
    jbe       short btohx1
    add       al, 7
 btohx1:
    add       cl, 48
    mov       [edx-1], al
    cmp       cl, 57
    mov       eax, edx
    jbe       short btohx2
    add       cl, 7
 btohx2:
    mov       [edx-2], cl
    ret       0
  }
}


void __stdcall DireMacAddress()
{ //00-E0-81-51-4B-52
  UUID gd;
  char buf[20], *c;
  if(UuidCreateSequential(&gd)) goto errMAC;
  c = bnbhex(gd.Data4[2], buf);
  *c++ = '-';
  c = bnbhex(gd.Data4[3], c);
  *c++ = '-';
  c = bnbhex(gd.Data4[4], c);
  *c++ = '-';
  c = bnbhex(gd.Data4[5], c);
  *c++ = '-';
  c = bnbhex(gd.Data4[6], c);
  *c++ = '-';
  bnbhex(gd.Data4[7], c);
  goto goDIRE;
errMAC:
  *((DWORD*) buf) = 'ERRE';
  *((DWORD*) (buf+4)) = 'RU';
goDIRE:
  MessageBox(0, buf, szappname, 0);
}

ciao...
BruNews, MVP VC++
Messages postés
56
Date d'inscription
jeudi 24 août 2006
Statut
Membre
Dernière intervention
2 septembre 2011

Houa, je suis gâté, mais malheureusement mon compilo n'est pas de cette avis.
La ligne   "__asm {" renvoi l'erreur suivant "error: expected `(' before '{' token"
Il n'y a pas autre chose que librpcrt4.a à linker? Ou un autre .h a inclure?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
VC++ Express est gratuit.
Pour faire du Windows, on utilise des outils Windows.

ciao...
BruNews, MVP VC++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Salut,

Pour ce qui est de l'adresse mac...
Trois méthodes sont présentées ici, dont la méthode de BruNews (UuidCreateSequential inclus l'adresse mac dans le numéro unique généré) et la méthode de f_l_a_s_h_b_a_c_k (Utilisation de la fonction NetBios).

La méthode de BruNews nécessite Windows 2000 ou plus, UuidCreate pouvant servir pour les versions précédentes.

La méthode de f_l_a_s_h_b_a_c_k ne fonctionne pas sous Vista et Windows server 2008.

La troisième méthode proposée, GetAdaptaterInfo, fonctionne à partir de Windows 2000.

Il y a une quatrième méthode en passant par la classe WMI Win32_NetworkAdapterConfiguration, qui propose une propriété MACAddress. Exemple d'utilisation de WMI en C ici.

Concernant "le numéro de série du CPU"...
Je ne crois pas qu'il soit récupérable de manière logiciel, sauf exceptions. Dans le source de f_l_a_s_h_b_a_c_k, l'instruction cpuid
est exécutée après avoir mis eax à 1. Autrement dit, il récupère des
informations sur les capacités du processeur, pas un numéro unique ou
de série. On demande le numéro de série en lui mettant eax à 3 avant
d'appeler cpuid. Mais cela ne fonctionne que sur certains processeurs (cf wikipedia).

Côté WMI, la classe Win32_Processor
propose ProcessorId qui correspond à cpuid avec eax = 1 (Donc je le
rappelle, pas du tout à un ID, mais aux fonctionnalités disponibles).
Elle propose aussi UniqueId, mais cette propriété est à null partout où
je l'ai essayé. Elle correspond très certainement à cpuid avec eax = 3.

Voilà
un petit script vbscript qui affiche l'adresse MAC (Ou les adresses
MAC) ainsi que les info sur le processeur via WMI (Donc c'est très
lent). Encore une fois, pour une traduction en C, voir cette source.

Mettre ce code dans un fichier .vbs. Double cliquer dessus, ou lancer une invite de commande et taper :
cscript /nologo NomDuFichiervbs.vbs
Dim objWMIService
Dim objProcessors
Dim objProcessor
Dim objNetworkConfigs
Dim objNetworkConfig

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objProcessors = objWMIService.ExecQuery("Select * from Win32_Processor")
For Each objProcessor In objProcessors
  Wscript.Echo "DeviceId = " & objProcessor.DeviceId
  Wscript.Echo "Name = " & objProcessor.Name
  Wscript.Echo "Caption = " & objProcessor.Caption
  Wscript.Echo "Manufacturer = " & objProcessor.Manufacturer
  Wscript.Echo "MaxClockSpeed = " & objProcessor.MaxClockSpeed
  Wscript.Echo "ProcessorId = " & objProcessor.ProcessorId
  Wscript.Echo "UniqueId = " & objProcessor.UniqueId
  Wscript.Echo vbCrLf
Next

Set objNetworkConfigs = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration")
For Each objNetworkConfig In objNetworkConfigs
  If objNetworkConfig.IPEnabled Then
    Wscript.Echo "Description = " & objNetworkConfig.Description
    Wscript.Echo "MACAddess = " & objNetworkConfig.MACAddress
    Wscript.Echo vbCrLf
  End If
Next