Конференция "Сети" » Определение Mac-адреса [D7]
 
  • KeIIIa33 © (04.04.12 17:03) [0]
    Всем доброго времени суток. Такая вот делема: в инете нашел пару функций, который определяют мак-адрес, но проблема в том, что при отсоединении от сети мак не определяется.

    function GetAdapterInfo(Lana: Char): String;

    var

    Adapter: TAdapterStatus;

    NCB: TNCB;

    begin

    FillChar(NCB, SizeOf(NCB), 0);

    NCB.ncb_command := Char(NCBRESET);

    NCB.ncb_lana_num := Lana;

    if Netbios(@NCB) <> Char(NRC_GOODRET) then

    begin

     Result := 'mac not found';

     Exit;

    end;

    FillChar(NCB, SizeOf(NCB), 0);

    NCB.ncb_command := Char(NCBASTAT);

    NCB.ncb_lana_num := 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 := 'mac not found';

     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 GetMACAddress: string;

    var

    AdapterList: TLanaEnum;

    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(AdapterList.lana[0])

    else

     Result := 'mac not found';

    end;


    и вот другая:

    function GetMACAdress: string;
    var
      NCB: PNCB;
      Adapter: PAdapterStatus;

      URetCode: PChar;
      RetCode: char;
      I: integer;
      Lenum: PlanaEnum;
      _SystemID: string;
      TMPSTR: string;
    begin
      Result    := '';
      _SystemID := '';
      Getmem(NCB, SizeOf(TNCB));
      Fillchar(NCB^, SizeOf(TNCB), 0);

      Getmem(Lenum, SizeOf(TLanaEnum));
      Fillchar(Lenum^, SizeOf(TLanaEnum), 0);

      Getmem(Adapter, SizeOf(TAdapterStatus));
      Fillchar(Adapter^, SizeOf(TAdapterStatus), 0);

      Lenum.Length    := chr(0);
      NCB.ncb_command := chr(NCBENUM);
      NCB.ncb_buffer  := Pointer(Lenum);
      NCB.ncb_length  := SizeOf(Lenum);
      RetCode         := Netbios(NCB);

      i := 0;
      repeat
        Fillchar(NCB^, SizeOf(TNCB), 0);
        Ncb.ncb_command  := chr(NCBRESET);
        Ncb.ncb_lana_num := lenum.lana[I];
        RetCode          := Netbios(Ncb);

        Fillchar(NCB^, SizeOf(TNCB), 0);
        Ncb.ncb_command  := chr(NCBASTAT);
        Ncb.ncb_lana_num := lenum.lana[I];
        // Must be 16
       Ncb.ncb_callname := '*               ';

        Ncb.ncb_buffer := Pointer(Adapter);

        Ncb.ncb_length := SizeOf(TAdapterStatus);
        RetCode        := Netbios(Ncb);
        //---- calc _systemId from mac-address[2-5] XOR mac-address[1]...
       if (RetCode = chr(0)) or (RetCode = chr(6)) then
        begin
          _SystemId := IntToHex(Ord(Adapter.adapter_address[0]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[1]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[2]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[3]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[4]), 2) + '-' +
            IntToHex(Ord(Adapter.adapter_address[5]), 2);
        end;
        Inc(i);
      until (I >= Ord(Lenum.Length)) or (_SystemID <> '00-00-00-00-00-00');
      FreeMem(NCB);
      FreeMem(Adapter);
      FreeMem(Lenum);
      GetMacAdress := _SystemID;
    end

  • KeIIIa33 © (04.04.12 17:11) [1]
    за решение этой проблемы могу даже заплатить
  • brother © (04.04.12 17:41) [2]
    > что при отсоединении от сети мак не определяется.

    мак чего не определяется? удаленного хоста?
  • KeIIIa33 © (04.04.12 17:46) [3]
    нет, свой
  • brother © (04.04.12 18:13) [4]
    имхо, он определяет только на активоном сетевом интерфейсе и это правильно...
  • KeIIIa33 © (04.04.12 18:24) [5]
    идея в чем: стандартно на компе 1 сетевая карта (конечно бывает и 2, но это не важно). и мне надо просто достать этот мак
  • brother © (04.04.12 18:36) [6]
    имхо, мак можно узнать только в ответ при восылке пакетна на сетевой интерфейс, если он отключен - ответить некому)
  • brother © (04.04.12 18:38) [7]
    http://delphi-faq.zoxt.net/c14.htm
    Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
    и своей) датагpамный пакет с заполненным NCB.

  • Сергей М. © (06.04.12 22:49) [8]

    > Такая вот делема


    дечего ?)


    > при отсоединении от сети


    в смысле шефклинер бабаклава шваброй задела шнурок ? или что ?
  • KeIIIa33 © (08.04.12 17:26) [9]
    когда комп без сети
  • Anatoly Podgoretsky © (08.04.12 19:02) [10]

    > когда комп без сети

    Когда комп без сети то никакого интерфейса нет, по крайней мере в XP+
  • Сергей М. © (09.04.12 09:37) [11]

    > когда комп без сети


    "комп без сети" - понятие растяжимое.
  • han_malign (10.04.12 13:57) [12]

    > Когда комп без сети то никакого интерфейса нет, по крайней мере в XP+

    - если в папке "Сетевые подключения" есть интерфейсы, то GetIfTable  отдаст все физические - независимо от программного(MIB_IFROW.dwAdminStatus) и аппаратного(MIB_IFROW.dwOperStatus) состояния...
    (в Vista - GetIfTable2(Ex) отдаст также логические)

    см. IP Helper(Iphlpapi.dll)
 
Конференция "Сети" » Определение Mac-адреса [D7]
Есть новые Нет новых   [134435   +15][b:0][p:0.003]