|
@@ -0,0 +1,166 @@
|
|
|
|
+unit uGetMacAddr;
|
|
|
|
+
|
|
|
|
+interface
|
|
|
|
+ uses
|
|
|
|
+ Windows,SysUtils, Classes;
|
|
|
|
+
|
|
|
|
+function GetMacAddress: TStringList;
|
|
|
|
+
|
|
|
|
+implementation
|
|
|
|
+
|
|
|
|
+Const
|
|
|
|
+ MAX_HOSTNAME_LEN = 128; { from IPTYPES.H }
|
|
|
|
+ MAX_DOMAIN_NAME_LEN = 128;
|
|
|
|
+ MAX_SCOPE_ID_LEN = 256;
|
|
|
|
+ MAX_ADAPTER_NAME_LENGTH = 256;
|
|
|
|
+ MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
|
|
|
|
+ MAX_ADAPTER_ADDRESS_LENGTH = 8;
|
|
|
|
+
|
|
|
|
+Type
|
|
|
|
+ TIPAddressString = Array[0..4*4-1] of AnsiChar;
|
|
|
|
+
|
|
|
|
+ PIPAddrString = ^TIPAddrString;
|
|
|
|
+ TIPAddrString = Record
|
|
|
|
+ Next : PIPAddrString;
|
|
|
|
+ IPAddress : TIPAddressString;
|
|
|
|
+ IPMask : TIPAddressString;
|
|
|
|
+ Context : Integer;
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+ PFixedInfo = ^TFixedInfo;
|
|
|
|
+ TFixedInfo = Record { FIXED_INFO }
|
|
|
|
+ HostName : Array[0..MAX_HOSTNAME_LEN+3] of AnsiChar;
|
|
|
|
+ DomainName : Array[0..MAX_DOMAIN_NAME_LEN+3] of AnsiChar;
|
|
|
|
+ CurrentDNSServer : PIPAddrString;
|
|
|
|
+ DNSServerList : TIPAddrString;
|
|
|
|
+ NodeType : Integer;
|
|
|
|
+ ScopeId : Array[0..MAX_SCOPE_ID_LEN+3] of AnsiChar;
|
|
|
|
+ EnableRouting : Integer;
|
|
|
|
+ EnableProxy : Integer;
|
|
|
|
+ EnableDNS : Integer;
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+ PIPAdapterInfo = ^TIPAdapterInfo;
|
|
|
|
+ TIPAdapterInfo = Record { IP_ADAPTER_INFO }
|
|
|
|
+ Next : PIPAdapterInfo;
|
|
|
|
+ ComboIndex : Integer;
|
|
|
|
+ AdapterName : Array[0..MAX_ADAPTER_NAME_LENGTH+3] of AnsiChar;
|
|
|
|
+ Description : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of AnsiChar;
|
|
|
|
+ AddressLength : Integer;
|
|
|
|
+ Address : Array[1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
|
|
|
|
+ Index : Integer;
|
|
|
|
+ _Type : Integer;
|
|
|
|
+ DHCPEnabled : Integer;
|
|
|
|
+ CurrentIPAddress : PIPAddrString;
|
|
|
|
+ IPAddressList : TIPAddrString;
|
|
|
|
+ GatewayList : TIPAddrString;
|
|
|
|
+ DHCPServer : TIPAddrString;
|
|
|
|
+ HaveWINS : Bool;
|
|
|
|
+ PrimaryWINSServer : TIPAddrString;
|
|
|
|
+ SecondaryWINSServer : TIPAddrString;
|
|
|
|
+ LeaseObtained : Integer;
|
|
|
|
+ LeaseExpires : Integer;
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+//Function GetNetworkParams(FI : PFixedInfo; Var BufLen : Integer) : Integer;
|
|
|
|
+// StdCall; External 'iphlpapi.dll' Name 'GetNetworkParams';
|
|
|
|
+
|
|
|
|
+Function GetAdaptersInfo(AI : PIPAdapterInfo; Var BufLen : Integer) : Integer;
|
|
|
|
+ StdCall; External 'iphlpapi.dll' Name 'GetAdaptersInfo';
|
|
|
|
+
|
|
|
|
+function GetMacAddress: TStringList;
|
|
|
|
+Var
|
|
|
|
+ AI,Work : PIPAdapterInfo;
|
|
|
|
+ Size : Integer;
|
|
|
|
+ Res : Integer;
|
|
|
|
+// I : Integer;
|
|
|
|
+
|
|
|
|
+ Function MACToStr(ByteArr : PByte; Len : Integer) : String;
|
|
|
|
+ Begin
|
|
|
|
+ Result := '';
|
|
|
|
+ While (Len > 0) do Begin
|
|
|
|
+ Result := Result+IntToHex(ByteArr^, 2);
|
|
|
|
+ ByteArr := Pointer(Integer(ByteArr) + SizeOf(Byte));
|
|
|
|
+ Dec(Len);
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+ SetLength(Result, Length(Result));
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+ Function GetAddrString(Addr : PIPAddrString) : String;
|
|
|
|
+ Begin
|
|
|
|
+ Result := '';
|
|
|
|
+ While (Addr <> nil) do Begin
|
|
|
|
+ Result := Result+'A: '+Addr^.IPAddress+' M: '+Addr^.IPMask+#13;
|
|
|
|
+ Addr := Addr^.Next;
|
|
|
|
+ End;
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+ Function TimeTToDateTimeStr(TimeT : Integer) : String;
|
|
|
|
+ Const UnixDateDelta = 25569; { days between 12/31/1899 and 1/1/1970 }
|
|
|
|
+ Var
|
|
|
|
+ DT : TDateTime;
|
|
|
|
+ TZ : TTimeZoneInformation;
|
|
|
|
+ Res : DWord;
|
|
|
|
+
|
|
|
|
+ Begin
|
|
|
|
+ If (TimeT = 0) Then Result := ''
|
|
|
|
+ Else Begin
|
|
|
|
+ { Unix TIME_T is secs since 1/1/1970 }
|
|
|
|
+ DT := UnixDateDelta+(TimeT / (24*60*60)); { in UTC }
|
|
|
|
+ { calculate bias }
|
|
|
|
+ Res := GetTimeZoneInformation(TZ);
|
|
|
|
+ If (Res = TIME_ZONE_ID_INVALID) Then RaiseLastWin32Error;
|
|
|
|
+ If (Res = TIME_ZONE_ID_STANDARD) Then Begin
|
|
|
|
+ DT := DT-((TZ.Bias+TZ.StandardBias) / (24*60));
|
|
|
|
+ Result := DateTimeToStr(DT)+' '+WideCharToString(TZ.StandardName);
|
|
|
|
+ End
|
|
|
|
+ Else Begin { daylight saving time }
|
|
|
|
+ DT := DT-((TZ.Bias+TZ.DaylightBias) / (24*60));
|
|
|
|
+ Result := DateTimeToStr(DT)+' '+WideCharToString(TZ.DaylightName);
|
|
|
|
+ End;
|
|
|
|
+ End;
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ Size := 5120;
|
|
|
|
+ GetMem(AI, Size);
|
|
|
|
+ Res := GetAdaptersInfo(AI, Size);
|
|
|
|
+ If (Res <> ERROR_SUCCESS) Then Begin
|
|
|
|
+ SetLastError(Res);
|
|
|
|
+ RaiseLastWin32Error;
|
|
|
|
+ End;
|
|
|
|
+
|
|
|
|
+ Work := AI;
|
|
|
|
+ //I := 1;
|
|
|
|
+ Result := TStringList.Create;
|
|
|
|
+ Repeat
|
|
|
|
+ //Add('');
|
|
|
|
+ //Add('Adapter '+IntToStr(I));
|
|
|
|
+ //Add(' ComboIndex: '+IntToStr(Work^.ComboIndex));
|
|
|
|
+ //Add(' Adapter name: '+Work^.AdapterName);
|
|
|
|
+ //Add(' Description: '+Work^.Description);
|
|
|
|
+ //Add(' Adapter address: '+MACToStr(@Work^.Address,Work^.AddressLength));
|
|
|
|
+ Result.Add(MACToStr(@Work^.Address, Work^.AddressLength));
|
|
|
|
+
|
|
|
|
+ //Add(' Index: '+IntToStr(Work^.Index));
|
|
|
|
+ //Add(' Type: '+IntToStr(Work^._Type));
|
|
|
|
+ //Add(' DHCP: '+IntToStr(Work^.DHCPEnabled));
|
|
|
|
+ //Add(' Current IP: '+GetAddrString(Work^.CurrentIPAddress));
|
|
|
|
+ //Add(' IP addresses: '+GetAddrString(@Work^.IPAddressList));
|
|
|
|
+ //Add(' Gateways: '+GetAddrString(@Work^.GatewayList));
|
|
|
|
+ //Add(' DHCP servers: '+GetAddrString(@Work^.DHCPServer));
|
|
|
|
+ //Add(' Has WINS: '+IntToStr(Integer(Work^.HaveWINS)));
|
|
|
|
+ //Add(' Primary WINS: '+GetAddrString(@Work^.PrimaryWINSServer));
|
|
|
|
+ //Add(' Secondary WINS: '+GetAddrString(@Work^.SecondaryWINSServer));
|
|
|
|
+ //Add(' Lease obtained: '+TimeTToDateTimeStr(Work^.LeaseObtained));
|
|
|
|
+ //Add(' Lease expires: '+TimeTToDateTimeStr(Work^.LeaseExpires));
|
|
|
|
+ //Inc(I);
|
|
|
|
+ Work := Work^.Next;
|
|
|
|
+ Until (Work = nil);
|
|
|
|
+
|
|
|
|
+ //Result:= Copy(Result, 1, 12);
|
|
|
|
+ FreeMem(AI);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+end.
|