Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Как на сервере определить MAC клиента?   Найти похожие ветки 

 
MegaVolt ©   (2004-11-08 18:23) [0]

Есть приложение сервер исспользуется TServerSocket. Можно ли узнать MAC подключившегося пользователя? IP прописан явно в RemotAddress может так же просто можно получить и MAC?


 
MegaVolt ©   (2004-11-08 19:33) [1]

Попробовал SendARP пишет сетевой запрос не поддерживается. 98 похоже не поддерживает :(


 
Piter ©   (2004-11-08 20:13) [2]

http://rouse.front.ru/

infofromip.zip:

Демонстрационная программа получения информации о компьютере на основе IP адреса
Позволяет узнать:
- Имя компьютера
- Список залогиненных пользователей
- Коментарий к компьютеру
- Провайдер (не тот который вы подумали :)
- MAC адресс
- Домен в который входит компьютер
- Если сеть доменная то дополнительно определяет имя сервера домена и группы в которые входит текущий пользователь...


 
Piter ©   (2004-11-08 20:13) [3]

там исходник на Delphi


 
Piter ©   (2004-11-08 20:14) [4]

насчет SendARP:
"Client: Requires Windows XP or Windows 2000 Professional.
Server: Requires Windows Server 2003 or Windows 2000 Server"


 
Verg ©   (2004-11-08 20:33) [5]

Бессмысленная задача.


 
Piter ©   (2004-11-08 23:19) [6]

Verg ©   (08.11.04 20:33) [5]
Бессмысленная задача.


Это почему же?

Например, в локальной сети раздача интернета идет по логину, паролю на прокси сервере, но при этом дополнительно проверяется MAC адрес - так очень часто делают. И с каких пор это стало бессмысленным?


 
MegaVolt ©   (2004-11-09 09:08) [7]

Задача не очень бессмысленна если учесть пристрастие к изменению IP. Хорошо что ещё не все умеют MAC-и менять.

PiterНа счёт того что в MSDN такой функции нет ты прав. Но возможно что в MSDN уже и нету инфы про 98 :( Так что я посмотрел что библиотека есть и решил проверить :) Большущее спасибо за ссылку.


 
MegaVolt ©   (2004-11-09 09:25) [8]

К сожалению пример только под 2k и выше :(

Короче я решил вопрос вот так:

function GetMAC(IP:PChar):string;      // Получение MAC-адреса сетевого компьютера
const Data  : string = "Test";
var   UDP_in    : TSockAddrIn;
     pBuf      : PChar;
     TableSize : DWORD;
     Error     : DWORD;
     NumEntries: DWORD;
     IpNetRow  : TMibIpNetRow;
     I         : Integer;
     MAC       : string;
     UDP_Socket:TSocket;
     WSA_Data  : TWSAData;
begin
  UDP_Socket:=Socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);       // Создаём UDP-сокет
  MAC:="00-00-00-00-00-00";
  UDP_in.sin_family:=AF_INET;
  UDP_in.sin_port:=htons(5232);                                      // Шлем на любой порт
  UDP_in.sin_addr.S_addr:=inet_addr(IP);                             // Указываем нужный адрес
  if SendTo(UDP_Socket,Data,5,0,UDP_in,SizeOf(UDP_in)) > 0
    then
      begin
        TableSize:=0;
        Error:=GetIpNetTable(PTMibIpNetTable(pBuf),@TableSize,True);    // first call: get memsize needed
        if Error <> ERROR_NO_DATA
          then
            begin
              GetMem(pBuf,TableSize);
              Error:=GetIpNetTable(PTMibIpNetTable(pBuf),@TableSize,True); // get table pointer
              if Error = NO_ERROR
                then
                  begin
                    NumEntries:=PTMibIpNetTable(pBuf)^.dwNumEntries;
                    if NumEntries > 0
                      then
                        begin
                          inc(pBuf,SizeOf(NumEntries));
                          for I:=1 to NumEntries do
                            begin
                              IpNetRow:=PTMibIpNetRow(pBuf)^;
                              with IpNetRow do
                                if (dwAddr = inet_addr(IP))and(dwType<>2)
                                  then MAC:=MacAddr2Str(bPhysAddr,dwPhysAddrLen);
                                inc(pBuf,SizeOf(IpNetRow));
                            end;
                          dec(pBuf,SizeOf(DWORD)+NumEntries*SizeOf(IpNetRow));
                        end;
                  end;
              FreeMem(pBuf);
            end;
      end;
  Result:=MAC;
  CloseSocket(UDP_Socket);
end;


 
Verg ©   (2004-11-09 10:04) [9]


> [8] MegaVolt ©   (09.11.04 09:25)


Во-первых. Если ты хочешь найти в арп кеше запись подключившегося клиента, то зачем спрашивается отправлять ему какие-то UDP датаграммы? Подключение-то уже произошло и значит, обмен IP пакетами уже произошел. Т.о. в арп-кеше либо уже есть инф-ция о клиенте, либо ее нет. Если нет, то и никогда не будет. Хоть запосылайся UDP. Просто клиент в другом сегменте.
Во-вторых. Если задача не из разряда "учебных" и если речь идет об авторизации, то еще раз посоветую - не трать сил попусту. Привязка ip-mac еще ничего, кроме неудобств не приносила. Это как привязка софта с серийнику аппартуры. Лучше уж потратиться на какой-либо криптоалгоритм авторизации или вообще шифрования. И знаний прибавится и система будет гибче на порядок. У нас в городе, например, по-моему всего один провайдер остался, у которого все еще ip-mac привязка осталась. Да и то как "копчик"...
Все ушли на VPN. Нет, можно напрямую работать, но
"п.2.3.7. В целях предотвращения несанкционированного доступа злоумышленников в Сеть с реквизитами Абонента, Абонент должен использовать систему авторизации. Если система авторизации Абонентом не использовалась, претензии по начисленному на Лицевой Счет Абонента объему трафика не принимаются. Система авторизации и статистика работы системы авторизации предоставляется Абоненту Оператором кабельных сетей."
В данный момент Вы можете воспользоваться для защиты либо программой авторизации, либо установить VPN-тоннелирование (с точки зрения п.2.3.7 Регламента приравнивается к системе авторизации).


 
MegaVolt ©   (2004-11-09 11:25) [10]

VergСпасибо за ответ :)
1. Задача сейчас поймать хулиганов в чате. Для этого был нарисован прозрачный экран который анализирует пакеты и плохие пихает в логи :) Чтобы понять кто это гадит нуна знать IP и желательно MAC. Вот для того чтобы можно было поймать и надавать по ушам и делаю поиск мака.

2. Ты пишешь что не обязательно посылать запрос. Т.е. всё что связано с сокетом я могу просто удалить и оставить просто работу с таблицей?


 
MegaVolt ©   (2004-11-09 11:27) [11]

VergСпасибо за ответ :)
1. Задача сейчас поймать хулиганов в чате. Для этого был нарисован прозрачный экран который анализирует пакеты и плохие пихает в логи :) Чтобы понять кто это гадит нуна знать IP и желательно MAC. Вот для того чтобы можно было поймать и надавать по ушам и делаю поиск мака.

2. Ты пишешь что не обязательно посылать запрос. Т.е. всё что связано с сокетом я могу просто удалить и оставить просто работу с таблицей?


 
Verg ©   (2004-11-09 11:47) [12]


> Т.е. всё что связано с сокетом я могу просто удалить и оставить
> просто работу с таблицей?


Все, что связано с UDP сокетом.

Непосредственно после подключения клиента проси арп кеш (GetIpNetTable) и ищи в нем Socket.RemoteAddress.
Арп кеш чистится: из него удаляются записи, которыми не пользовались в течение 30 сек, по-моему. Так что, "клювом щелкать" не рекомендуется.


 
Rouse_ ©   (2004-11-09 13:02) [13]

Собственно говоря пример получения MAC адреса из ARP таблицы по совету [12] Verg © , как раз тут и лежит: > [2] Piter ©   (08.11.04 20:13)



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.046 c
1-1105981595
Никита
2005-01-17 20:06
2005.01.30
Как программно эмулировать: а) Щелчок мышью....


1-1106072776
rolex
2005-01-18 21:26
2005.01.30
Как в ListView сделать, чтобы в третьей колонке цвет шрифта был к


3-1104317631
mva
2004-12-29 13:53
2005.01.30
Запрос


1-1106209235
HF-Trade
2005-01-20 11:20
2005.01.30
Открытие файла с любым из зарегистрированных расширений


1-1106226580
Tomkat
2005-01-20 16:09
2005.01.30
Список параметров из INI файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский