Mac Adresi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mac Adresi

Mesaj gönderen Lost Soul »

Bi yerden mac adresi öğrenmek için aşağıdaki kodu buldum.
Bu mac adresi denen şey sabit değil midir.
Neden bilgisayarı kapatıp açtıktan sonra programı her çalştırdığımda kod değişiyor.
aşağıdaki kodda mı bi sorun var. Yoksa mac adresi ile ilgili bilmediğim bişey mi var.

Kod: Tümünü seç


function taboutbox.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 taboutbox.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;  
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Mac Adresi

Mesaj gönderen G.Arkas »

Mac adresi sabit değildir değiştirilebilir.Sandığım kadarıyla pc açıp kapatmada değişiyor olabilir hiç dikkat etmedim ama manuel olarakta değişebiliyor.
Resim
kodcuminik
Üye
Mesajlar: 140
Kayıt: 11 Oca 2009 10:25

Re: Mac Adresi

Mesaj gönderen kodcuminik »

anakartından olabilirmi gigabyte mı kullanıyorsun ? yada harici bir ethernetmi var ?

aşagıdaki prosedür düzgün çalışıyor ama galiba seninki ile aynı yine de al belki küçük bir fark vardır :)

Kod: Tümünü seç


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;
bilmezler bilmediklerinide bilmezler ama kendilerini bilir sanırlar
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Mac Adresi

Mesaj gönderen Lost Soul »

meseleyi çözdüm.
benim bilgisayar günde iki kez açılır biri işte diğeri evde.

işte Ethernet evde Wireless kullanıyorum :)

MAC İstediğim çözüm değil yani.
bana sabit bişeyler lazım.
Mesela parçaların bir veya bir kaçının fabrika seri no su. Tavsiyesi olan?

Not : formatla değişen ve internette sakız gibi dolaşan HDD Seri Nosunu öğrenen kod ya da mitech system information u tavsiye etmeyin ltf :)

forumda aradım ama açıkçası işe yarar bişey bulamadım.
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Mac Adresi

Mesaj gönderen G.Arkas »

Vermeyin demişsin ama bu seri numarası fabrika seri numarasıdır yani her format sonrası değişmez

Kod: Tümünü seç

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)

Button1: TButton;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


function GetIdeSerialNumber ():string;
const IDENTIFY_BUFFER_SIZE = 512;
type
TIDERegs = packed record
bFeaturesReg : BYTE; // Used for specifying SMART "commands".
bSectorCountReg : BYTE; // IDE sector count register
bSectorNumberReg : BYTE; // IDE sector number register
bCylLowReg : BYTE; // IDE low order cylinder value
bCylHighReg : BYTE; // IDE high order cylinder value
bDriveHeadReg : BYTE; // IDE drive/head register
bCommandReg : BYTE; // Actual IDE command.
bReserved : BYTE; // reserved for future use. Must be zero.
end;
TSendCmdInParams = packed record
// Buffer size in bytes
cBufferSize : DWORD;
// Structure with drive register values.
irDriveRegs : TIDERegs;
// Physical drive number to send command to (0,1,2,3).
bDriveNumber : BYTE;
bReserved : Array[0..2] of Byte;
dwReserved : Array[0..3] of DWORD;
bBuffer : Array[0..0] of Byte; // Input buffer.
end;
TIdSector = packed record
wGenConfig : Word;
wNumCyls : Word;
wReserved : Word;
wNumHeads : Word;
wBytesPerTrack : Word;
wBytesPerSector : Word;
wSectorsPerTrack : Word;
wVendorUnique : Array[0..2] of Word;
sSerialNumber : Array[0..19] of CHAR;
wBufferType : Word;
wBufferSize : Word;
wECCSize : Word;
sFirmwareRev : Array[0..7] of Char;
sModelNumber : Array[0..39] of Char;
wMoreVendorUnique : Word;
wDoubleWordIO : Word;
wCapabilities : Word;
wReserved1 : Word;
wPIOTiming : Word;
wDMATiming : Word;
wBS : Word;
wNumCurrentCyls : Word;
wNumCurrentHeads : Word;
wNumCurrentSectorsPerTrack : Word;
ulCurrentSectorCapacity : DWORD;
wMultSectorStuff : Word;
ulTotalAddressableSectors : DWORD;
wSingleWordDMA : Word;
wMultiWordDMA : Word;
bReserved : Array[0..127] of BYTE;
end;
PIdSector = ^TIdSector;
TDriverStatus = packed record
// Error code from driver, or 0 if no error.
bDriverError : Byte;
// Contents of IDE Error register. Only valid when bDriverError is SMART_IDE_ERROR.
bIDEStatus : Byte;
bReserved : Array[0..1] of Byte;
dwReserved : Array[0..1] of DWORD;
end;
TSendCmdOutParams = packed record
// Size of bBuffer in bytes
cBufferSize : DWORD;
// Driver status structure.
DriverStatus : TDriverStatus;
// Buffer of arbitrary length in which to store the data read from the drive.
bBuffer : Array[0..0] of BYTE;
end;

var
hDevice : THandle;
cbBytesReturned : DWORD;
ptr : PChar;
SCIP : TSendCmdInParams;
aIdOutCmd : Array
[0..(SizeOf(TSendCmdOutParams)+IDENTIFY_BUFFER_SIZE-1)-1] of Byte;
IdOutCmd : TSendCmdOutParams absolute aIdOutCmd;

procedure ChangeByteOrder( var Data; Size : Integer );
var ptr : PChar;
i : Integer;
c : Char;


begin
ptr := @Data;
for i := 0 to (Size shr 1)-1 do
begin
c := ptr^;
ptr^ := (ptr+1)^;
(ptr+1)^ := c;
Inc(ptr,2);
end;
end;

begin
Result := ''; // return empty string on error
if SysUtils.Win32Platform=VER_PLATFORM_WIN32_NT then // Windows NT,Windows 2000
begin
// warning! change name for other drives: ex.: second drive '\\.\PhysicalDrive1\'
hDevice := CreateFile( '\\.\PhysicalDrive0', GENERIC_READ or
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0 );
end
else // Version Windows 95 OSR2, Windows 98
hDevice := CreateFile( '\\.\SMARTVSD', 0, 0, nil, CREATE_NEW, 0, 0 );
if hDevice=INVALID_HANDLE_VALUE then Exit;
try
FillChar(SCIP,SizeOf(TSendCmdInParams)-1,#0);
FillChar(aIdOutCmd,SizeOf(aIdOutCmd),#0);
cbBytesReturned := 0;
// Set up data structures for IDENTIFY command.
with SCIP do
begin
cBufferSize := IDENTIFY_BUFFER_SIZE;
// bDriveNumber := 0;
with irDriveRegs do
begin
bSectorCountReg := 1;
bSectorNumberReg := 1;
// if Win32Platform=VER_PLATFORM_WIN32_NT then bDriveHeadReg := $A0
// else bDriveHeadReg := $A0 or ((bDriveNum and 1) shl 4);
bDriveHeadReg := $A0;
bCommandReg := $EC;
end;
end;
if not DeviceIoControl( hDevice, $0007c088, @SCIP,
SizeOf(TSendCmdInParams)-1,
@aIdOutCmd, SizeOf(aIdOutCmd), cbBytesReturned, nil ) then Exit;
finally
CloseHandle(hDevice);
end;
with PIdSector(@IdOutCmd.bBuffer)^ do
begin
ChangeByteOrder( sSerialNumber, SizeOf(sSerialNumber) );
(PChar(@sSerialNumber)+SizeOf(sSerialNumber))^ := #0;
Result := PChar(@sSerialNumber);
end;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var s : String;
rc : DWORD;
begin
s := GetIdeSerialNumber;
if s='' then
begin
rc := GetLastError;
if rc=0 then label4.caption:='IDE drive is not support SMART feature'
else label4.caption:=SysErrorMessage(rc);
end
else label4.caption:= s;


end;

end.
Bunu kullanabilirsiniz.
Resim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Mac Adresi

Mesaj gönderen Lost Soul »

G.Arkas yazdı:Vermeyin demişsin ama bu seri numarası fabrika seri numarasıdır yani her format sonrası değişmez

Kod: Tümünü seç

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)

Button1: TButton;
Labe...

....
vermeyin dediğim hdd nin volume seri numarası idi. inanır mısınız ben de bu kdun aynısnı buldum v paylaşmak için siteye girdim. hatta paylaştım da :)
viewtopic.php?f=19&t=26371

cevap için teşekkürler.
kodcuminik
Üye
Mesajlar: 140
Kayıt: 11 Oca 2009 10:25

Re: Mac Adresi

Mesaj gönderen kodcuminik »

bence oda çözüm degil ghost veya benzeri programlarla oda kopyalanabliyor
whiles ethernetleri bilmem ama normalde
kullanıcı elle özel olarak mudahale etmedigi sürece mac adresi fabrika çıkışı sabittir
bilmezler bilmediklerinide bilmezler ama kendilerini bilir sanırlar
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Mac Adresi

Mesaj gönderen G.Arkas »

@lostsoul

İşinize yaradıysa ne mutlu bana iyi çalışmalar

@kodcuminik

%100 güvenli bir sistem asla yoktur.Amaç kırılmasını zorlaştırmak :)

Kolay gelsin :bravo:
Resim
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: Mac Adresi

Mesaj gönderen csunguray »

MAC İstediğim çözüm değil yani.
bana sabit bişeyler lazım.
Mesela parçaların bir veya bir kaçının fabrika seri no su. Tavsiyesi olan?
Mac adresi sabit değildir değiştirilebilir.Sandığım kadarıyla pc açıp kapatmada değişiyor olabilir hiç dikkat etmedim ama manuel olarakta değişebiliyor.
MAC adresi ethernet kartlarına fabrikada basılan bir seri numarasıdır. Değişik göstermek için bir takım programlar vardır ama prensip olarak bir ethernet kartının MAC adresi bilgisayarı kapatıp açınca veya format atınca değişmez.

MAC adresi
http://tr.wikipedia.org/wiki/MAC_adresi

Ayrıca MAC adresini kullanacaksanız bilgisayarınızda birden fazla ethernet kartı bulunabileceğini göz önüne almanız gerekir.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Cevapla