Einzelnen Beitrag anzeigen

hesch21

Registriert seit: 31. Aug 2004
Ort: Basel
114 Beiträge
 
Delphi XE2 Enterprise
 
#1

MAC-Adresse auslesen über NetBIOS

  Alt 24. Apr 2013, 12:04
Ich staune !
Die wohl allseits bekannte Funktion zum auslesen der MAC-Adresse über NetBIOS:
Code:
{Lokale MAC-Adresse ermitteln}
function GetAdapterInfo(Lana: Char): String;
var  Adapter : TAdapterStatus;
var  NCB    : TNCB;
begin
  FillChar(NCB, SizeOf(NCB), 0);
  NCB.ncb_command := Char(NCBRESET);
  NCB.ncb_lana_num := AnsiChar(Lana);
  if Netbios(@NCB) <> Char(NRC_GOODRET) then
     begin
     Result := 'not found 1';
     Exit;
     end;
  FillChar(NCB, SizeOf(NCB), 0);
  NCB.ncb_command := Char(NCBASTAT);
  NCB.ncb_lana_num := AnsiChar(Lana);
  NCB.ncb_callname := '*';
  FillChar(Adapter, SizeOf(Adapter), 0);
  NCB.ncb_buffer := @Adapter;
  NCB.ncb_length := SizeOf(Adapter);
  if Netbios(@NCB) <> Char(NRC_GOODRET) then
     begin
     Result := 'not found 2';
     Exit;
     end;
  Result :=
    IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' +
    IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' +
    IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' +
    IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' +
    IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' +
    IntToHex(Byte(Adapter.adapter_address[5]), 2);
end;

function GetMACAdress: string;
var AdapterList : TLanaEnum;
var NCB        : TNCB;
begin
  FillChar(NCB, SizeOf(NCB), 0);
  NCB.ncb_command := Char(NCBENUM);
  NCB.ncb_buffer := @AdapterList;
  NCB.ncb_length := SizeOf(AdapterList);
  Netbios(@NCB);
  if Byte(AdapterList.length) > 0 then
     Result := GetAdapterInfo(Char(AdapterList.lana[0]))
  else
     Result := 'not found 3';
end;
funktioniert bestens... fast! Ich habe einen esten Kunden mit über 150 Rechnern, alle dieselbe Marke, nur 3 Modelle, alle genau gleich mit NetInstall mit W-XP aufgesetzt. Mein Programm, das von einem Netzlaufwerk gestartet wird, kann genau bei einem Rechner mit obiger Routine der MAC-Adresse nicht ermitteln. Kommt mit Byte(AdapterList.length) = 0 ('not found 3') zurück.
Code:
  MacAddressStrings := TStringList.Create();
  JclSysInfo.GetMacAddresses('', MacAddressStrings);
  Label2.Caption   := MacAddressStrings[0];
  MacAddressStrings.Free();
Das hingegen funktioniert! Da bekomme ich die korrekte MAC-Adresse zurück.
Aber damit nicht genug. Bei einem zweiten Kunden mit über 1300 Rechner habe ich genau dasselbe Problem. Bei einem einzigen Rechner bekomme ich über NetBIOS keine MAC-Adresse zurück.

Hat jemand eine Idee, woran das liegen könnte?
Heinz Schneider
  Mit Zitat antworten Zitat