PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Récupérer les informations des adaptateurs réseaux (API Iphlpapi)
Récupérer les informations des adaptateurs réseaux (API Iphlpapi)
Débuté par Michael MAURAY, 16 juil. 2014 11:25 - 5 réponses
Membre enregistré
22 messages
Popularité : +0 (2 votes)
Posté le 16 juillet 2014 - 11:25
Bonjour,

Si ça peut aider quelqu'un d'autre, voici un petit bout de code qui permet de récupérer les informations des adaptateurs réseaux du poste local :

LOCAL
sNomDllest une chaîne="Iphlpapi.dll"
eNumDllest un entier
eErreur, eTailleTable sont des entiers
sBuf est une chaîne
nNbEntréesest un entier
sAdresseMac est une chaîne

IP_ADDRESS_STRING est une structure
sString est une chaîne fixe de 16 //char String[4 * 4];
FIN

IP_MASK_STRING est une structure
sString est une chaîne fixe de 16 //char String[4 * 4];
FIN

IP_ADDR_STRING est une structure
nNext est un entier //struct _IP_ADDR_STRING *Next;
IpAddress est un IP_ADDRESS_STRING // IP_ADDRESS_STRING IpAddress;
IpMask est un IP_MASK_STRING // IP_MASK_STRING IpMask;
Context est un entier sans signe sur 4 octets //DWORD Context;
FIN

IP_ADAPTER_INFO est une structure
nNext est un entier // struct _IP_ADAPTER_INFO *Next;
nComboIndex est un entier sans signe sur 4 octets //DWORD ComboIndex;
sAdapterName est une chaîne ASCIIZ sur 260 //char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
sDescription est une chaîne ASCIIZ sur 132 //char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
nAddressLength est un entier sans signe sur 4 octets //UINT AddressLength;
sAddress est une chaîne fixe sur 8 //BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
nIndex est un entier sans signe sur 4 octets // DWORD Index;
nType est un entier sans signe sur 4 octets //UINT Type;
nDhcpEnabled est un entier sans signe sur 4 octets //UINT DhcpEnabled;
nCurrentIpAddress est un entier //PIP_ADDR_STRING CurrentIpAddress;
IpAddressList est un IP_ADDR_STRING //IP_ADDR_STRING IpAddressList;
GatewayList est un IP_ADDR_STRING // IP_ADDR_STRING GatewayList;
DhcpServer est un IP_ADDR_STRING //IP_ADDR_STRING DhcpServer;
nHaveWins est un entier sur 4 octets //BOOL HaveWins;
PrimaryWinsServer est un IP_ADDR_STRING //IP_ADDR_STRING PrimaryWinsServer;
SecondaryWinsServer est un IP_ADDR_STRING //IP_ADDR_STRING SecondaryWinsServer;
nLeaseObtained est un entier //time_t LeaseObtained;
nLeaseExpires est un entier //time_t LeaseExpires;
FIN

Adapter est un IP_ADAPTER_INFO
Adaptateurinfoest un tableau dynamique de 0 IP_ADAPTER_INFO
ERROR_BUFFER_OVERFLOW est un entier = 111
ERROR_INVALID_DATA est un entier = 13
ERROR_INVALID_PARAMETER est un entier = 87
ERROR_NO_DATA est un entier = 232
ERROR_NOT_SUPPORTED est un entier = 50
ERROR_SUCCESS est un entier = 0
NO_ERROR est un entier = 0
MIB_IF_TYPE_OTHER est un entier = 1
MIB_IF_TYPE_ETHERNET est un entier = 6
IF_TYPE_ISO88025_TOKENRING est un entier = 9
MIB_IF_TYPE_PPP est un entier = 23
MIB_IF_TYPE_LOOPBACK est un entier = 24
MIB_IF_TYPE_SLIP est un entier = 28
IF_TYPE_IEEE80211 est un entier = 71

//charge la dll nécessaire
eNumDll=ChargeDLL(sNomDll)
SI eNumDll=0 ALORS
Erreur(ErreurInfo())
FIN

//---1ier appel pour avoir la taille nécessaire
eTailleTable = 0
sBuf =""
eErreur = API(sNomDll,"GetAdaptersInfo",&sBuf, &eTailleTable)
//on devrait avoir une erreur de taille insuffisante
SI eErreur <> ERROR_BUFFER_OVERFLOW ALORS
//Autre erreur ??
Erreur(ErreurInfo())
GOTO Finproc
FIN

//---2ième appel pour avoir les infos
//eTailleTable a été renseigné par l'appel précédent
sBuf =Répète(" ",eTailleTable) //on met à la bonne taille le buffer
eErreur = API(sNomDll,"GetAdaptersInfo",&sBuf, &eTailleTable)
SI eErreur <> NO_ERROR ALORS
//erreur
Erreur(ErreurInfo())
GOTO Finproc
FIN

SI Taille(sBuf) >= Dimension(Adapter) ALORS
nNbEntrées = 1
Dimension(Adaptateurinfo,nNbEntrées)
Transfert(&Adaptateurinfo[nNbEntrées],&sBuf,Dimension(Adapter))

TANTQUE Adaptateurinfo[nNbEntrées]:nNext
nNbEntrées++
Dimension(Adaptateurinfo,nNbEntrées)
Transfert(&Adaptateurinfo[nNbEntrées],Adaptateurinfo[nNbEntrées-1].nNext,Dimension(Adapter))
FIN
FIN

SI TableauOccurrence(Adaptateurinfo) ALORS
POUR x = 1 _A_ TableauOccurrence(Adaptateurinfo)
Trace("Index : " + Adaptateurinfo[x]:nComboIndex)
Trace("Adapter Name : " + Adaptateurinfo[x]:sAdapterName)
Trace("Adapter Desc : " + Adaptateurinfo[x]:sDescription)
//on récupère l'adresse MAC en clair
sAdresseMac = ""
POUR IndiceBuffer=1 _A_ Adaptateurinfo[x]:nAddressLength
sAdresseMac += Majuscule(NumériqueVersChaîne(Asc(Adaptateurinfo[x]:sAddress[[IndiceBuffer]]),"02x"))+" "
FIN
Trace("Adapter Addr : " + sAdresseMac)
SELON Adaptateurinfo[x]:nType
CAS MIB_IF_TYPE_OTHER:
Trace("Type : ","Other")
CAS MIB_IF_TYPE_ETHERNET:
Trace("Type : ","Ethernet");
CAS IF_TYPE_ISO88025_TOKENRING:
Trace("Type : ","Token Ring");
CAS IF_TYPE_IEEE80211:
Trace("Type : ","FDDI");
CAS MIB_IF_TYPE_PPP:
Trace("Type : ","PPP");
CAS MIB_IF_TYPE_LOOPBACK:
Trace("Type : ","Lookback");
CAS MIB_IF_TYPE_SLIP:
Trace("Type : ","Slip");
AUTRE CAS
Trace("Type : ","Unknown type : ", Adaptateurinfo[x]:nType)
FIN
Trace("IP Address : " + Adaptateurinfo[x]:IpAddressList:IpAddress:sString)
Trace("IP Mask : " + Adaptateurinfo[x]:IpAddressList:IpMask:sString)
Trace("Gateway : " + Adaptateurinfo[x]:GatewayList:IpAddress:sString)
SI (Adaptateurinfo[x]:nDhcpEnabled) ALORS
Trace("DHCP Enabled : Yes")
Trace("DHCP Server : " + Adaptateurinfo[x]:DhcpServer:IpAddress:sString)
Trace("Lease Obtained : " + DateHeureUTCVersLocale(ChaîneConstruit("%1%2%3%4%5",EntierVersDate(DateVersEntier("19700101") + PartieEntière(Adaptateurinfo[x]:nLeaseObtained/86400)),...
Modulo(PartieEntière(Adaptateurinfo[x]:nLeaseObtained/3600),24),Modulo(PartieEntière(Adaptateurinfo[x]:nLeaseObtained/60),60),Modulo(Adaptateurinfo[x]:nLeaseObtained,60),"00")))
Trace("Lease Expires : " + DateHeureUTCVersLocale(ChaîneConstruit("%1%2%3%4%5",EntierVersDate(DateVersEntier("19700101") + PartieEntière(Adaptateurinfo[x]:nLeaseExpires/86400)),...
Modulo(PartieEntière(Adaptateurinfo[x]:nLeaseExpires/3600),24),Modulo(PartieEntière(Adaptateurinfo[x]:nLeaseExpires/60),60),Modulo(Adaptateurinfo[x]:nLeaseExpires,60),"00")))
SINON
Trace("DHCP Enabled : NO")
FIN
SI (Adaptateurinfo[x]:nHaveWins) ALORS
Trace("Have Wins : Yes")
Trace("Primary Wins Server : " + Adaptateurinfo[x]:PrimaryWinsServer:IpAddress:sString)
Trace("Secondary Wins Server : " + Adaptateurinfo[x]:SecondaryWinsServer:IpAddress:sString)
SINON
Trace("Have Wins : No")
FIN
Trace(RC)
FIN
FIN

//traitemet de fin
Finproc:

//on décharge
SI eNumDll<>0 ALORS DéchargeDLL(eNumDll)


Pour info, ce code a été écrit rapidement dans un bouton. Si vous avez des commentaires, je suis preneur.

Cordialement,

Michael MAURAY
Membre enregistré
63 messages
Popularité : +4 (4 votes)
Posté le 03 décembre 2015 - 17:24
Merci beaucoup pour ce code....
Membre enregistré
280 messages
Popularité : +22 (28 votes)
Posté le 04 décembre 2015 - 02:08
Bonjour,
Merci pour le partage.

--
Cordialement.

Olivier
http://www.impulse-web.com
Membre enregistré
63 messages
Popularité : +4 (4 votes)
Posté le 04 décembre 2015 - 09:35
Bonjour

Peut on récupérer aussi le nom du réseau associé à la carte réseau avec cette dll?

D'avance merci pour votre réponse...
Cordialement
Membre enregistré
22 messages
Popularité : +0 (2 votes)
Posté le 04 décembre 2015 - 11:44
Bonjour,

La fonction "GetAdaptersInfo" permet juste d'obtenir la description de la carte réseau par exemple : "Realtek PCIe GBE Family Controller".

Microsoft conseille d'utiliser maintenant la fonction "GetAdaptersAddresses" et vous pourrez récupérer beaucoup plus d'informations sur les adaptateurs réseaux.

Avec cette fonction, vous pouvez récupérer ceci : https://msdn.microsoft.com/en-us/library/windows/desktop/aa366058(v=vs.85).aspx

Il y a aussi la fonction "GetNetworkParams" qui permet de récupérer ceci : https://msdn.microsoft.com/en-us/library/windows/desktop/aa365900(v=vs.85).aspx

Cordialement,

Michael MAURAY
Membre enregistré
22 messages
Popularité : +0 (2 votes)
Posté le 04 décembre 2015 - 14:30
Bonjour,

Pour information, vous trouverez le code de la fonction "GetAdaptersAddresses" dans ce post :
http://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/189559-recuperer-informations-adaptateurs-reseaux-avec-fonction-getadaptersaddresses-api/read.awp

Cordialement,

Michael MAURAY