# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  پيدا كردن نام كامپيوتر در شبكه با MAC Address

## mohsen_r

با سلام
آيا كدي براي پيدا كردن نام كامپيوتر در شبكه با MAC Address وجود داره 
براي اين نياز دارم كه بعضي كاربران  ip خود را تغيير مي دهند و اين تغيير باعث تداخل در شبكه مي شه و من با 
  MAC Address مي خام اون كامپيوتر را پيدا كنم البته MAC Address  قبلا ذخيره شده است

----------


## Mask

در همین بخش کد مربوط به اسکن شبکه و بدست آوردن اسم سیستمهای موجود در شبکه موجود هست.
وقتی اسم سیستمها رو بدست آوردید با تابه name to ip تبدیلشون کنید به آی پی و با تابع زیر مکشون رو بدست بیارید.
از کد زیر استفاده کنید:
function GetMacAddress(const AServerName : string) : string;
type
      TNetTransportEnum = function(pszServer : PWideChar;
      Level : DWORD;
      var pbBuffer : pointer;
          PrefMaxLen : LongInt;
      var EntriesRead : DWORD;
      var TotalEntries : DWORD;
      var ResumeHandle : DWORD) : DWORD;
stdcall;
      TNetApiBufferFree = function(Buffer : pointer) : DWORD; stdcall;
      PTransportInfo = ^TTransportInfo;
      TTransportInfo = record
      quality_of_service : DWORD;
      number_of_vcs : DWORD;
      transport_name : PWChar;
      transport_address : PWChar;
      wan_ish : boolean;
end;
var E,ResumeHandle,
    EntriesRead,
    TotalEntries : DWORD;
    FLibHandle : THandle;
    sMachineName,
    sMacAddr,
    Retvar : string;
    pBuffer : pointer;
    pInfo : PTransportInfo;
    FNetTransportEnum : TNetTransportEnum;
    FNetApiBufferFree : TNetApiBufferFree;
    pszServer : array[0..128] of WideChar;
    i,ii,iIdx : integer;
begin
  sMachineName := trim(AServerName);
  Retvar := '00-00-00-00-00-00';
  // Add leading \\ if missing
  if (sMachineName <> '') and (length(sMachineName) >= 2) then
begin
    if copy(sMachineName,1,2) <> '\\' then
      sMachineName := '\\' + sMachineName
end;
  // Setup and load from DLL
  pBuffer := nil;
  ResumeHandle := 0;
  FLibHandle := LoadLibrary('NETAPI32.DLL');
  // Execute the external function
  if FLibHandle <> 0 then begin
    @FNetTransportEnum :=GetProcAddress(FLibHandle,'NetWkstaTransportEnum  ');
    @FNetApiBufferFree := GetProcAddress(FLibHandle,'NetApiBufferFree');
    E :=FNetTransportEnum(StringToWideChar(sMachineName,  pszServer,129),0,
      pBuffer,-1,EntriesRead,TotalEntries,Resumehandle);
    if E = 0 then begin
      pInfo := pBuffer;
      // Enumerate all protocols - look for TCPIP
      for i := 1 to EntriesRead do begin
        if pos('TCPIP',UpperCase(pInfo^.transport_name)) <> 0 then
        begin
          // Got It - now format result 'xx-xx-xx-xx-xx-xx'
          iIdx := 1;
          sMacAddr := pInfo^.transport_address;
          for ii := 1 to 12 do begin
            Retvar[iIdx] := sMacAddr[ii];
            inc(iIdx);
            if iIdx in [3,6,9,12,15] then inc(iIdx);
          end;
        end;
        inc(pInfo);
      end;
      if pBuffer <> nil then FNetApiBufferFree(pBuffer);
    end;
    try
      FreeLibrary(FLibHandle);
    except
      // Silent Error
    end;
  end;
  Result := Retvar;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=GetMacAddress(Edit1.Text)
end;
موفق باشید.

----------


## mohsen_r

من وقتي آپي را مدم خطا ميگيره
access violation at address

----------


## Mask

لا اقل واسه اينكه كاره خودتون راه بيوفته .... يا بيشتر توضيح بديد يا نمونه برنامه اي كه نوشتيد رو اينجا قرار بديد.

----------


## mohsen_r

> لا اقل واسه اينكه كاره خودتون راه بيوفته .... يا بيشتر توضيح بديد يا نمونه برنامه اي كه نوشتيد رو اينجا قرار بديد.


شرمنده من هنوز برنامه ننوشتم مي خواستم ببينم آيا اين امكان وجود داره يانه من تابع شما را اجرا كردم و آپي را كه داشتم در edit1.txt نوشتم مثلا 192.168.210.11 كه خطاي بالا را داد البته سوال من برعكس جواب شما بود من مي خوام با macaddress نام كامپيوتر را پيدا كنم

----------


## Mask

با سلام.
جواب من دقیقا برای سوالتون بود.
ببینید وقتی میخواهید کاری انجام بدید ... دقیقا مثل روندی که تو ذهنتونه که در نمیاد :لبخند گشاده!: 
یکم باید عقبو جلوش کنی.
ببینید : مراحل کارتون به این صورته : تمام توابعی رو که به کار میبرم در قسمت شبکه دلفی همین سایت موجوده...
1- شبکه رو اسکن میکنید و اسم تمام کامپیوتر های شبکه رو پیدا میکنید.
2- با تابع nametoip اسم سیستم هارو تبدیل به آی پی  میکنید.
3- با تابع بالا آی پی رو تبدیل به مک آدرس میکنید.
4- گرفتن یه کوئری و تطبیق آی پی با مک آدرس مربوطه با مک آدرس و آی پی قبلی.
و...
موفق باشید.

----------

