NetBios - pobranie danych

0

Cześć :)

Chodzi mi o pobranie danych : nazwy kompa i nazwy użytkownika po
wpisaniu IP danego usera i wykryciu jego obecności w necie (ping)
(Tak jak to robią skanery IP)

Grzebałem w całym tutejszym forum - to pytanie często się powtarzało
ale jakoś bez odpowiedzi :/ Więc i ja mam prośbę i licze że nareszcie
ktoś mi podpowie.
Pościągałem sobie różne komponenty , kody i wskazówki dotyczące
NetBiosu ale akurat brak mi tego czego potrzeba :(
Na Torry coś znalazłem ale nie mogłem sprawdzić bo do tego potrzebne
były jakieś biblioteki - no i wyszło błędne koło.

Więc prosze chociaż o jakąś wskazówkę.

0

bylo duzo razy i bylo tez duzo odpowiedzi
moze to cos poomoze http://4programmers.net/Forum/viewtopic.php?id=50715

0

hej

Oj Nedian , stawian zgrzewkę piwa że oprócz Twojego postu co podałeś
nic więcej tu nie znajdzie :)
Wszystkie pytania odnośnie nazw usera i kompa dotyczyły nazwy
wyciąganej z własnego kompa a mnie chodzi o te z innych komputerów w sieci.
Jeśli zaś chodzi o Twój post to tylko podałeś kawałek listingu z protokółu (co zawiera) ;)
Ale jak to pobrać i odczytać w progsie ?
Po prostu wpisując jakieś IP chciałem te informacje pobrać :-/
Potrzebne mi to bo zrobiłem programik który skanuje sieć i pobiera
IP i nazwy dostępnych zasobów co zresztą też zrodziło mi pytanie na które nie dostałem odpowiedzi ;(
<url> http://4programmers.net/Forum/viewtopic.php?id=51977&p=0#129030</url>

Dziękuje i za to Nedian <browarek> :)

0

pobaw sie komponentem ServerSocket i ClientSocket, sa tam metody ktore ci to umozliwia (RemoteHost, RemoteAddress)

ps. jak sie myle to prosze o sprostowanie akurat nie mam srodowiska pod reka... (siedze w pracy)

0

Ta funkcja wyciąga na podstawie adresu IP nazwe komputera ( właśnie dodałem komponent napisany na podstawie tej funkcji)

uses
SysUtils,Classes,WinSock;

function IPAddrToName(IPAddr : String): String;
var
  SockAddrIn: TSockAddrIn;
  HostEnt: PHostEnt;
  WSAData: TWSAData;


begin
  WSAStartup($101, WSAData);
  SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr));
  HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
 if HostEnt<>nil then
  begin

    result:=StrPas(Hostent^.h_name);
 end;
end;

Te zaś adrez fizyczny MAC na podstawie adresu IP np:
(

function GetMacAddresses('192.168.0.1',memo1.Lines );

).

uses
  NB30;

function AdapterToString(Adapter: TAdapterStatus): string;    stdcall;
begin
  with Adapter do Result :=
      Format('%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x',
      [Integer(adapter_address[0]), Integer(adapter_address[1]), 
      Integer(adapter_address[2]), Integer(adapter_address[3]), 
      Integer(adapter_address[4]), Integer(adapter_address[5])]); 
end;


function GetMacAddresses(const Machine: string;
  const Addresses: TStrings): Integer;   stdcall;
const 
  NCBNAMSZ = 16;        // absolute length of a net name 
  MAX_LANA = 254;       // lana's in range 0 to MAX_LANA inclusive 
  NRC_GOODRET = $00;       // good return 
  NCBASTAT = $33;       // NCB ADAPTER STATUS 
  NCBRESET = $32;       // NCB RESET 
  NCBENUM = $37;       // NCB ENUMERATE LANA NUMBERS 
type 
  PNCB = ^TNCB; 
  TNCBPostProc = procedure(P: PNCB); 
  stdcall; 
  TNCB = record 
    ncb_command: Byte; 
    ncb_retcode: Byte; 
    ncb_lsn: Byte; 
    ncb_num: Byte; 
    ncb_buffer: PChar; 
    ncb_length: Word; 
    ncb_callname: array [0..NCBNAMSZ - 1] of char; 
    ncb_name: array [0..NCBNAMSZ - 1] of char; 
    ncb_rto: Byte; 
    ncb_sto: Byte; 
    ncb_post: TNCBPostProc; 
    ncb_lana_num: Byte; 
    ncb_cmd_cplt: Byte; 
    ncb_reserve: array [0..9] of char;
    ncb_event: THandle; 
  end; 
  PLanaEnum = ^TLanaEnum; 
  TLanaEnum = record 
    Length: Byte; 
    lana: array [0..MAX_LANA] of Byte; 
  end; 
  ASTAT = record 
    adapt: TAdapterStatus;
    namebuf: array [0..29] of TNameBuffer;
  end; 
var 
  NCB: TNCB; 
  Enum: TLanaEnum; 
  I: integer; 
  Adapter: ASTAT; 
  MachineName: string; 
begin 
  Result := -1; 
  Addresses.Clear; 
  MachineName := UpperCase(Machine); 
  if MachineName = '' then    MachineName := '*'; 
  FillChar(NCB, SizeOf(NCB), #0); 
  NCB.ncb_command := NCBENUM; 
  NCB.ncb_buffer  := Pointer(@Enum); 
  NCB.ncb_length  := SizeOf(Enum); 
  if Word(NetBios(@NCB)) = NRC_GOODRET then 
  begin 
    Result := Enum.Length; 
    for I := 0 to Ord(Enum.Length) - 1 do
    begin 
      FillChar(NCB, SizeOf(TNCB), #0); 
      NCB.ncb_command  := NCBRESET; 
      NCB.ncb_lana_num := Enum.lana[I]; 
      if Word(NetBios(@NCB)) = NRC_GOODRET then 
      begin 
        FillChar(NCB, SizeOf(TNCB), #0); 
        NCB.ncb_command  := NCBASTAT; 
        NCB.ncb_lana_num := Enum.lana[i]; 
        StrLCopy(NCB.ncb_callname, PChar(MachineName), NCBNAMSZ); 
        StrPCopy(@NCB.ncb_callname[Length(MachineName)],
          StringOfChar(' ', NCBNAMSZ - Length(MachineName))); 
        NCB.ncb_buffer := PChar(@Adapter); 
        NCB.ncb_length := SizeOf(Adapter); 
        if Word(NetBios(@NCB)) = NRC_GOODRET then 
          Addresses.Add(AdapterToString(Adapter.adapt));
      end;
    end;
0

Dziękuje Wam ślicznie

Ale chyba nie jasno napisałem :-/

  1. do odpowiedzi Anubisa : na socketach nic nie zrobię są tylko dosłownie do użycia czyli połączeń a żeby uzyskać te dane co potrzebuję
    musze mieć jakąś inną do tego procedurę lub funkcję która "wyciągnie"
    informacje - i tu nie wiem z czego :/ Czy wysyłając zapytanie jakieś na serwer ? Mnie chodzi po głowie NetBios i jego użycie ale jak to sie robi to nie wiem.

  2. do odpowiedzi Mimi :
    Pierwsza funkcja którą podałeś wyciąga nazwe z serwera DNS , i nie o
    to chodzi , bo podając przykładowe IP (sieć LAN)
    10.2.0.28 uzyskam DNS 1-28.koszalin.pl
    a chodzi o takie coś podając 10.2.0.28 uzyskuje nazwe kompa "PC Marka" i użytkownika "Marek Kowalski"
    A druga funkcja owszem podaje adres MAC ale tej mojej na kompie ;)

Chcę pobierać te dane z mojej sieci LAN , a wiem że to możliwe
bo pierwszy lepszy skaner własnie podaje przy wyszukanych numerach IP.

1 użytkowników online, w tym zalogowanych: 0, gości: 1