如何获取当前系统的DNS配置信息?(50分)

  • 主题发起人 主题发起人 Adnil
  • 开始时间 开始时间
A

Adnil

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获取当前系统的DNS配置信息?
例如得到默认的DNS地址是:XXX.XXX.XX.XXX
 
去查tcp/ip的属性
 
ipconfig/all
 
注册表里有

HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/MSTCP/nameserver
 
有点长!不过可以用来获得拨号网络动态获得的DNS以及你机器上几乎所有的tcp/ip网络信息

unit GetDnsList;

interface

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

type
; TIPMainForm = class(TForm)
; ; Info: TMemo;
; ; Button1: TButton;
; ; procedure Button1Click(Sender: TObject);
; ; procedure FormCreate(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; ; Procedure GetNetworkParameters;
; ; Procedure GetAdapterInformation;
; end;

var
; IPMainForm: TIPMainForm;
; aDnsList:TStrings;
implementation

{$R *.DFM}

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 Char;

; 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 Char;
; ; DomainName ; ; ; : Array[0..MAX_DOMAIN_NAME_LEN+3] of Char;
; ; CurrentDNSServer : PIPAddrString;
; ; DNSServerList ; ;: TIPAddrString;
; ; NodeType ; ; ; ; : Integer;
; ; ScopeId ; ; ; ; ;: Array[0..MAX_SCOPE_ID_LEN+3] of Char;
; ; 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 Char;
; ; Description ; ; ; ; : Array[0..MAX_ADAPTER_DESCRIPTION_LENGTH+3] of Char;
; ; 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';

procedure TIPMainForm.GetAdapterInformation;
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)-1); { remove last dash }
; 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;
; With Info,Lines do Begin
; ; Work := AI;
; ; I := 1;
; ; 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));
; ; ; 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);
; End;
; FreeMem(AI);
end;

procedure TIPMainForm.GetNetworkParameters;
Var
; FI ; : PFixedInfo;
; Size : Integer;
; Res ;: Integer;
; I ; ;: Integer;
; DNS ;: PIPAddrString;

begin
; Size := 1024;
; GetMem(FI,Size);
; Res := GetNetworkParams(FI,Size);
; If (Res <> ERROR_SUCCESS) Then Begin
; ; SetLastError(Res);
; ; RaiseLastWin32Error;
; End;
; With Info do Begin
; ; Clear;
; ; Lines.Add('Host name: '+FI^.HostName);
; ; Lines.Add('Domain name: '+FI^.DomainName);
; ; aDnsList.Clear;
; ; If (FI^.CurrentDNSServer <> nil) Then
; ; begin
; ; ; Lines.Add('Current DNS Server: '+FI^.CurrentDNSServer^.IPAddress);
; ; end
; ; Else Lines.Add('Current DNS Server: (none)');
; ; I := 1;
; ; DNS := @FI^.DNSServerList;
; ; Repeat
; ; ; Lines.Add('DNS '+IntToStr(I)+': '+DNS^.IPAddress);
; ; ; aDnsList.Add(DNS^.IPAddress);
; ; ; Inc(I);
; ; ; DNS := DNS^.Next;
; ; Until (DNS = nil);
; ; Lines.Add('Scope ID: '+FI^.ScopeId);
; ; Lines.Add('Routing: '+IntToStr(FI^.EnableRouting));
; ; Lines.Add('Proxy: '+IntToStr(FI^.EnableProxy));
; ; Lines.Add('DNS: '+IntToStr(FI^.EnableDNS));
; End;
; FreeMem(FI);
end;

procedure TIPMainForm.Button1Click(Sender: TObject);
begin
; GetNetworkParameters;
; GetAdapterInformation;

end;

procedure TIPMainForm.FormCreate(Sender: TObject);
begin
; ; aDnsList:=TStringList.Create;
end;

end.
 
查注册表不可行,不同的Windows版本存储的位置不一样。
 
嗯。。用API就好了。。。

看看INDY的例子。。[:)]
 
To CJF:
是Indy的哪一个例子?
 
;Platform SDK
GetNetworkParams
The GetNetworkParams function retrieves network parameters for the local computer.

DWORD GetNetworkParams(
; PFIXED_INFO pFixedInfo, ;// pointer to buffer to receive data
; PULONG pOutBufLen ; ; ; ;// size of buffer
);
Parameters
pFixedInfo
[out] Pointer to a FIXED_INFO structure that receives the network parameters for the local computer.
pOutBufLen
[in] Pointer to a ULONG variable that specifies the size of the FIXED_INFO structure. If this size is insufficient to hold the information, GetNetworkParams fills in this variable with the required size, and returns an error code of ERROR_BUFFER_OVERFLOW.
Return Values
If the function succeeds, the return value is ERROR_SUCCESS.

If the function fails, the return value is one of the following error codes.

Value Meaning
ERROR_BUFFER_OVERFLOW The buffer size indicated by the pOutBufLen parameter is too small to hold the adapter information. The pOutBufLen parameter points to the required size.
ERROR_INVALID_PARAMETER The pOutBufLen parameter is NULL, or the calling process does not have read/write access to the memory pointed to by pOutBufLen, or the calling process does not have write access to the memory pointed to by the pAdapterInfo parameter.
ERROR_NO_DATA No adapter information exists for the local computer.
ERROR_NOT_SUPPORTED GetNetworkParams is not supported by the operating system running on the local computer.
Other If the function fails, use FormatMessage to obtain the message string for the returned error.


Requirements
; Windows NT/2000 or later: Requires Windows 2000 or later.
; Windows 95/98/Me: Requires Windows 98 or later.
; Header: Declared in Iphlpapi.h.
; Library: Use Iphlpapi.lib.

See Also
FIXED_INFO

Requirements
; Windows NT/2000 or later: Requires Windows 2000 or later.
; Windows 95/98/Me: Requires Windows 98 or later.
; Header: Declared in Iphlpapi.h.
; Library: Use Iphlpapi.lib.
See Also
FIXED_INFO
 
接受答案了
 
后退
顶部