PDA

View Full Version : پيدا كردن نام كامپيوتر در شبكه با MAC Address



mohsen_r
سه شنبه 27 اردیبهشت 1390, 07:55 صبح
با سلام
آيا كدي براي پيدا كردن نام كامپيوتر در شبكه با MAC Address وجود داره
براي اين نياز دارم كه بعضي كاربران ip خود را تغيير مي دهند و اين تغيير باعث تداخل در شبكه مي شه و من با
MAC Address مي خام اون كامپيوتر را پيدا كنم البته MAC Address قبلا ذخيره شده است

Mask
چهارشنبه 28 اردیبهشت 1390, 11:20 صبح
در همین بخش کد مربوط به اسکن شبکه و بدست آوردن اسم سیستمهای موجود در شبکه موجود هست.
وقتی اسم سیستمها رو بدست آوردید با تابه 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
دوشنبه 09 خرداد 1390, 12:55 عصر
من وقتي آپي را مدم خطا ميگيره
access violation at address

Mask
دوشنبه 09 خرداد 1390, 18:48 عصر
لا اقل واسه اينكه كاره خودتون راه بيوفته .... يا بيشتر توضيح بديد يا نمونه برنامه اي كه نوشتيد رو اينجا قرار بديد.

mohsen_r
سه شنبه 10 خرداد 1390, 07:27 صبح
لا اقل واسه اينكه كاره خودتون راه بيوفته .... يا بيشتر توضيح بديد يا نمونه برنامه اي كه نوشتيد رو اينجا قرار بديد.

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

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