На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как узнать MAC-адреса.
    Хи то АЛЛ.
    Помогите плиз, в сетевом программирование полный ноль :(
    Надо написать программку, которая бы сканила все ипишники и узнавала МАК адреса сетевух, после чего сверяла с уже имеющейся БД.

    Как бы общая суть понятно, но не знаю как по ИПи узнать Мак-адрес :( К тому же желательно что бы все это дело работало через НетБиос. (т.к. стоят фаерволы, но НетБиос они не блочат (так настроены)).

    Заранее сенкс.
      CODE
      Вариант1:
      From : Sergey Gazimagomedov 2:453/11.13
      Мне нужен был МАС адpес, так я его получал, пользуясь NetBIOS.
      Добавляешь имя NetBIOS и посылаешь на имя станции, нужной для опpеделения(можно
      и своей) датагpамный пакет с заполненным NCB.
      Вот исходник моей функции для опpеделения МАС адpеса.


      UCHAR MYLIBAPI GetAdapterID(char *Name, // NetBIOS ??? ???????
      UINT lana_num,
      CARDID *ID) // 6 ???????? ??????
      {
      UCHAR rc = 0;
      UCHAR Status[256];
      while( lstrlen(Name) - 15)
      lstrcat(Name, " ");
      memset(&SNcb, 0, sizeof(NCB));
      SNcb.ncb_command = NCBASTAT;
      SNcb.ncb_buffer = (LPSTR)Status;
      SNcb.ncb_length = 256;
      lstrcpy(SNcb.ncb_callname, Name);
      SNcb.ncb_lana_num = lana_num;
      rc = Netbios( &SNcb );
      if(rc ==0){
      memcpy(ID, Status, 6);
      }
      return(SNcb.ncb_cmd_cplt);
      }

      Это под Win32. Конечно должен быть пpотокол NetBIOS, но он в фоpточках и так
      необходим.


      Взято с Vingrad.ru http://forum.vingrad.ru

      Вариант2:
      From : Alexey Grachyov

      #include  
      #include  
      #include  
      #include  
      #include  
      void main()
      {
      int iAdapters,iOpt=sizeof(iAdapters),iSize=sizeof(SOCKADDR_IPX);
      SOCKET skNum;
      SOCKADDR_IPX Addr;
      WSADATA Wsa;
      if(WSAStartup(0x0101,&Wsa)) return;
      if((skNum=socket(AF_IPX,SOCK_DGRAM,NSPROTO_IPX))!=INVALID_SOCKET)
      {
      memset(&Addr,0,sizeof(Addr));
      Addr.sa_family=AF_IPX;
      if(bind(skNum,(SOCKADDR *)&Addr,iSize)!=SOCKET_ERROR)
      {
      if(getsockopt(skNum,NSPROTO_IPX,IPX_MAX_ADAPTER_NUM,
      (char *)&iAdapters,&iOpt)!=SOCKET_ERROR)
      {
      while(iAdapters)
      {
      IPX_ADDRESS_DATA Data;
      memset(&Data,0,sizeof(Data));
      Data.adapternum=iAdapters-1;
      iOpt=sizeof(Data);
      if(getsockopt(skNum,NSPROTO_IPX,IPX_ADDRESS,(char
      *)&Data,&iOpt)!=SOCKET_ERROR)
      {
      printf("Addr: %02X%02X%02X%02X:%02X%02X%02X%02X%02X%02X\n",
      (int)Data.netnum[0],(int)Data.netnum[1],(int)Data.netnum[2],
      (int)Data.netnum[3],(int)Data.netnum[4],(int)Data.netnum[5],
      (int)Data.netnum[6],(int)Data.netnum[7],(int)Data.netnum[8],
      (int)Data.netnum[9]);
      }
      iAdapters--;
      }
      }
      }
      closesocket(skNum);
      }
      WSACleanup();
      }

      Взято с Vingrad.ru http://forum.vingrad.ru

      Вариант3:
      From: MSDN

      #include  
      #include  
      #include  
      #include  
      #include  
      typedef struct _ASTAT_
      {
      ADAPTER_STATUS adapt;
      NAME_BUFFER NameBuff [30];
      }ASTAT, * PASTAT;
      ASTAT Adapter;
      void main (void)
      {
      NCB Ncb;
      UCHAR uRetCode;
      char NetName[50];
      memset( &Ncb, 0, sizeof(Ncb) );
      Ncb.ncb_command = NCBRESET;
      Ncb.ncb_lana_num = 0;
      uRetCode = Netbios( &Ncb );
      printf( "The NCBRESET return code is: 0x%x \n", uRetCode );
      memset( &Ncb, 0, sizeof (Ncb) );
      Ncb.ncb_command = NCBASTAT;
      Ncb.ncb_lana_num = 0;
      strcpy( Ncb.ncb_callname, "* " );
      Ncb.ncb_buffer = (char *) &Adapter;
      Ncb.ncb_length = sizeof(Adapter);
      uRetCode = Netbios( &Ncb );
      printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
      if ( uRetCode == 0 )
      {
      printf( "The Ethernet Number is: %02x%02x%02x%02x%02x%02x\n",
      Adapter.adapt.adapter_address[0],
      Adapter.adapt.adapter_address[1],
      Adapter.adapt.adapter_address[2],
      Adapter.adapt.adapter_address[3],
      Adapter.adapt.adapter_address[4],
      Adapter.adapt.adapter_address[5] );
      }
      }


      Автор ответа: Garik

      Взято с Vingrad.ru http://forum.vingrad.ru

      --------------------------------------------------------------------------------


      Автор: Daniel Wischnewski

      Для того, чтобы этот код работал, необходимо включить в проект юнит NB30. Простой вызов функции GetMACAddress возвращает адрес первого установленного сетевого адаптера.

      Совместимость: Delphi 3.x (или выше)

      Данный пример был составлен на основе статьи на сайте Borland:
      http://community.borland.com/article/0,1410,26040,00.html


      uses  
       NB30;  

      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;  

      Взято с Исходников.ru http://www.sources.ru


      Только зачем тебе это надо?
        Diamond
        Для защиты.
          Премного благодарен за код. Вобще нужно не совсем для защиты. Просто у нас локалка в общяге, инет халявный но трафик ограничен. Так вот некоторые умельцы просто меняют ипишники и лазят сколько хотят, а потом банят других. Я же хочу написать небольшую прогу которая бы сидела в трее и раз в час сканила и сверяла с БД. Что бы потом "казнить" врагов народа Ж)
            2Гость
            МАК тоже можно поменять, правда нужно хорошо постараться.
              QUOTE (Diamond @ 15.11.03, 16:46)
              Только зачем тебе это надо?

              Ну например это ещё нужно для того чтобы "разбудить" компьютер по сетке.
                2 Vit расскажи как разбыдить комп ?
                2 Гость кинь на мыло если не в падлу как трафик ограничивать, а то я тоже в некотором смысле сисадмин.
                  QUOTE (Diamond @ 16.11.03, 10:39)
                  2 Vit расскажи как разбыдить комп ?
                  .

                  Не скажу, потому как не знаю, но в какой-то умной книге читал, что это каким-то образом завязано на MAC адресе, ведь когда комп спит, процессор не работает, и узнать там IP например вроде бы нельзя, но BIOS может определить МАС адрес, по которому и проводится аутентификация, ведь тебе не надо чтобы сигнал будил все компьютеры... Вроде так, но ручатся за правдивость не буду, так как видел краем глаза, а необходимости в этом не было никакой...
                  Сообщение отредактировано: Vit -
                    Diamond
                    CODE
                    {$APPTYPE CONSOLE}

                    uses
                    SysUtils,
                    Classes,
                    IdBaseComponent,
                    IdComponent,
                    IdUDPBase,
                    IdUDPClient;

                    function HexStringToBinString(const HexStr: string): string;
                    var
                    i, l: integer;
                    begin
                    Result := '';
                    l := length(HexStr);
                    l := l div 2;
                    SetLength(Result, l);
                    for i := 1 to l do
                     if HexToBin(PChar(Copy(HexStr, (i - 1) * 2 + 1, 2)),
                    PChar(@Result[i]), 1) = 0 then
                      raise Exception.Create('Invalid hex value');
                    end;

                    procedure SendMagicPacket(MACAddress: string);
                    var
                    s, packet: string;
                    i: integer;
                    begin
                    if Length(MACAddress) <> 12 then
                     raise Exception.CreateFmt('Invalid MAC Address: %s', [MACAddress]);
                    packet := HexStringToBinString('FFFFFFFFFFFF');
                    s := HexStringToBinString(MACAddress);
                    for i := 1 to 16 do
                     packet := packet + s;
                    with TIdUDPClient.Create(nil) do
                     try
                      Active := true;
                      BroadcastEnabled := true;
                      Broadcast(packet, 9);
                     finally
                      Free;
                     end;
                    end;

                    begin
                    if ParamCount <> 1 then
                     WriteLn('usage: WakeOnLan MACAddress' + #10 + #13 + 'exmple: WakeOnLan 000102030405')
                    else
                     SendMagicPacket(ParamStr(1));
                    end.
                      Вроде для WakeOnLan нужна специальная карточка, или пройдет на всех?
                        Причём тут карточка? Это функция Bios в ATX матерях.
                          2 Song Нужна сетевуха у которой есть подключение к материнке через разъем WOL и еще и поддержка в биосе, на всех компах не прокатит.
                            Diamond
                            Нужен ATX компьюьтер и WOL в биосе. Никаких разъёмов не надо.
                              Цитата
                              Song, 19.11.03, 13:19
                              Нужен ATX компьюьтер и WOL в биосе. Никаких разъёмов не надо.

                              Если сетевуха в виде платы в гнезде расширения (не встроенная в маму) то нужны и разьемы (на маме и на плате) и кабель между ними sad.gif
                                Нет! Я пробовал.
                                ATX компьютер в выключенном состоянии находится под напряжением. Южный мост вкалывает и обрабатывает такие запросы. Поэтому при появлении броадкаста, сетевуха + биос сразу сработает. Вы о каких-то доисторических компьютерах говорите.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0336 ]   [ 17 queries used ]   [ Generated: 28.03.24, 09:26 GMT ]