Obtenir une mac adresse en c++

xantra Messages postés 56 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 2 septembre 2011 - 21 juin 2009 à 18:53
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 30 juin 2009 à 10:22
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

xantra Messages postés 56 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 2 septembre 2011
21 juin 2009 à 20:12
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 juin 2009 à 21:58
#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++
0
xantra Messages postés 56 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 2 septembre 2011
22 juin 2009 à 01:49
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?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 juin 2009 à 09:04
VC++ Express est gratuit.
Pour faire du Windows, on utilise des outils Windows.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
30 juin 2009 à 10:22
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
0
Rejoignez-nous