Netbios, l'addresse MAC ne se dévoile pas correctment

Résolu
cs_Keneda Messages postés 32 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 3 octobre 2012 - 23 nov. 2006 à 18:24
cs_Keneda Messages postés 32 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 3 octobre 2012 - 27 nov. 2006 à 11:43
Salut à tous, j'utilise l'api Netbios de netapi32.dll pour récupérer l'adresse MAC d'une carte réseau, on trouve ce code facilement sur google et il semble être le standard pour rechercher ce genre d'information.

Seul Hic qui n'est pas des moindres, lorsque l'on récupère l'adresse MAC avec le cable réseau branché, ça fonctionne bien, si on débranche le cable réseau, l'API renvoi 00-00-00-00-00
chose que je ne comprend pas ? Pour quelle raison on a cela ?

Pourquoi lorsque l'on débranche le cable et que l'on fait un simple Ipconfig /All on obtient bien l'adresse MAC et lorsque l'on utilise l'API celle-ci renvoi du vent ?
Microsoft ou quelqu'un d'autre aurait-il un moyen de renvoyer à tout les coups l'information correcte et de façon sûr ?

Merci à toute personne qui pourrait me renseigner sur ce point qui me pose un réel problème

Keneda, la fusée rouge

1 réponse

cs_Keneda Messages postés 32 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 3 octobre 2012
27 nov. 2006 à 11:43
Et bien voilou, j'ai trouvé une méthode qui fonctionne parfaitement bien et qui renvoi
a chaque fois de manière sûr l'adresse MAC, même lorsque le cable réseau est débranché.

voici comment faire: (utilisation de WMI)

uses ComObj, OleServer;



function MACAdresse: string;
var
  WmiService : SWbemServices;
  WmiObjet   : SWbemObject;
  wmiObjetSet: SWbemObjectSet;
  ObjectEnumerator: IEnumVariant;
  ArrayVariant: OleVariant; 
  NumberItem  : LongWord;
  WMILocator  : TSWbemLocator;
begin
  Result:= '';
  WMILocator:= TSWbemLocator.Create(self);
  try
    try
     WMILocator.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
     WMILocator.Security_.Set_AuthenticationLevel(wbemAuthenticationLevelDefault);
     WmiService:= WMILocator.ConnectServer('.', 'ROOT\CIMV2', '', '', '', '', 0, nil);
    except
      on E:EOleException do
       begin
         ShowMessage(SysErrorMessage(E.ErrorCode)+' ['+IntToHex(E.ErrorCode,8)+'] '+E.Message);
         Raise;
       end;
    end;
    wmiService.Security_.Privileges.Add(wbemPrivilegeShutdown, True);
    wmiObjetSet := wmiService.ExecQuery('Select * from Win32_NetworkAdapterConfiguration',
                                         'WQL', wbemFlagReturnImmediately, nil);
    ObjectEnumerator:= (WmiObjetSet._NewEnum) as IEnumVariant;
    while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
    begin
      WmiObjet := IUnknown(ArrayVariant) as SWBemObject;
      if Boolean(WmiObjet.Properties_.Item('IPEnabled', 0).Get_Value) then
        Result:= WmiObjet.Properties_.Item('MACAddress', 0).Get_Value;
    end;
  finally
    WMILocator.Free;
  end;
end;




voila, avec l'utilisation des WMI, plus de soucis, attention, il faut importer l'activeX
WbemScripting_TLB.pas

si vous avez besoin de précision sur ce code, n'hésitez pas à me contacter, je n'ai mis aucun commentaire et j'ai adapté un code source que j'avais fait pour faire des reboot à distance, d'ou le nom de certaines variables ;-)

Keneda, la fusée rouge
3
Rejoignez-nous