如何获得本机的DNS

net_morning 2008-06-19 12:01:24
如何获得本机的DNS?欢迎有经验的朋友指点一二,非常感谢~
...全文
1115 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanxmxj 2008-06-20
  • 打赏
  • 举报
回复
学习..学习
学习..学习
学习..学习
GDTOPONE 2008-06-19
  • 打赏
  • 举报
回复

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;



const
MAX_HOSTNAME_LEN = 128;
MAX_DOMAIN_NAME_LEN = 128;
MAX_SCOPE_ID_LEN = 256;

type

PIPAddressString = ^TIPAddressString;
PIPMaskString = ^TIPAddressString;
TIPAddressString = record
_String: array[0..(4 * 4) - 1] of Char;
end;
TIPMaskString = TIPAddressString;
PIPAddrString = ^TIPAddrString;
TIPAddrString = packed record
Next: PIPAddrString;
IpAddress: TIPAddressString;
IpMask: TIPMaskString;
Context: DWORD;
end;
PFixedInfo = ^TFixedInfo;
TFixedInfo = packed record
HostName: array[0..MAX_HOSTNAME_LEN + 4 - 1] of Char;
DomainName: array[0..MAX_DOMAIN_NAME_LEN + 4 - 1] of Char;
CurrentDnsServer: PIPAddrString;
DnsServerList: TIPAddrString;
NodeType: UINT;
ScopeId: array[0..MAX_SCOPE_ID_LEN + 4 - 1] of Char;
EnableRouting,
EnableProxy,
EnableDns: UINT;
end;


function GetNetworkParams(pFixedInfo: PFixedInfo; pOutBufLen: PULONG): DWORD; stdcall;
procedure GetDNSServers(AList: TStringList);


implementation

{$R *.dfm}

const
{$IFDEF MSWINDOWS}
iphlpapidll = 'iphlpapi.dll';
{$ENDIF}

function GetNetworkParams; external iphlpapidll Name 'GetNetworkParams';


procedure GetDNSServers(AList: TStringList);
var
pFI: PFixedInfo;
pIPAddr: PIPAddrString;
OutLen: Cardinal;
begin
AList.Clear;
OutLen := SizeOf(TFixedInfo);
GetMem(pFI, SizeOf(TFixedInfo));
try
if GetNetworkParams(pFI, @OutLen) = ERROR_BUFFER_OVERFLOW then
begin
ReallocMem(pFI, OutLen);
if GetNetworkParams(pFI, @OutLen) <> NO_ERROR then Exit;
end;
if pFI^.DnsServerList.IpAddress._String[0] = #0 then Exit;
AList.Add(pFI^.DnsServerList.IpAddress._String);
pIPAddr := pFI^.DnsServerList.Next;
while Assigned(pIPAddr) do
begin
AList.Add(pIPAddr^.IpAddress._String);
pIPAddr := pIPAddr^.Next;
end;
finally
FreeMem(pFI);
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
A : TStringList;
i : Integer;
begin
{----------取得DNS--------------------}
A := TStringList.Create;
try
Memo1.Clear;
GetDNSServers(A);
for i:=0 to A.Count-1 do
begin
Memo1.Lines.Add(A[i]);
end;
finally
a.Free;
end;

end;

end.
老之 2008-06-19
  • 打赏
  • 举报
回复
呵呵,用WMI也可以啊

uses ComObj, ActiveX;

var
WMi, Objs, Obj: OleVariant;
Enum: IEnumVariant;
C: Cardinal;
s: array of string;
i: Integer;
Name, DNS: string;
begin
Dns := '';
Wmi:= CreateOleObject('WbemScripting.SWbemLocator');
Objs := Wmi.ConnectServer('.','root\cimv2')
.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where IPEnabled!=0');
Enum := IEnumVariant(IUnknown(Objs._NewEnum));
Enum.Reset;
C := 0;
while Succeeded(Enum.Next(1, Obj, C)) and (C > 0) do
begin
begin
Name := Obj.Properties_.Item('Description', 0).Value;
s := Obj.Properties_.Item('DNSServerSearchOrder', 0).Value;
begin
DNS := DNS + Name + #13#10;
for i := 0 to High(s) do Dns := DNS + (s[i]) + #13#10;
end;
DNS := DNS + #13#10;
end;
end;
ShowMessage(DNS);
end;
老之 2008-06-19
  • 打赏
  • 举报
回复
呵呵,用WMI也可以啊

uses ComObj, ActiveX;

var
WMi, Objs, Obj: OleVariant;
Enum: IEnumVariant;
C: Cardinal;
s: array of string;
i: Integer;
Name, DNS: string;
begin
Dns := '';
Wmi:= CreateOleObject('WbemScripting.SWbemLocator');
Objs := Wmi.ConnectServer('.','root\cimv2')
.ExecQuery('Select * from Win32_NetworkAdapterConfiguration where IPEnabled!=0');
Enum := IEnumVariant(IUnknown(Objs._NewEnum));
Enum.Reset;
C := 0;
while Succeeded(Enum.Next(1, Obj, C)) and (C > 0) do
begin
begin
Name := Obj.Properties_.Item('Description', 0).Value;
s := Obj.Properties_.Item('DNSServerSearchOrder', 0).Value;
begin
DNS := DNS + Name + #13#10;
for i := 0 to High(s) do Dns := DNS + (s[i]) + #13#10;
end;
DNS := DNS + #13#10;
end;
end;
ShowMessage(DNS);
end;
byteh 2008-06-19
  • 打赏
  • 举报
回复
好像以前见过一个读取注册表的实例,我的DNS是在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{46059442-887F-454D-9B78-8076BDB77DF4}
下的NameServer键值
这个{46059442-887F-454D-9B78-8076BDB77DF4}不确定是唯一的还是和机器有关
okmnji79513 2008-06-19
  • 打赏
  • 举报
回复
学到了

学到了

学到了
喝口水 2008-06-19
  • 打赏
  • 举报
回复
楼上的代码有错误,我修改了下
unit Unit1;

interface

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

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;

TTIPMainForm = 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;
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';
var
TIPMainForm: TTIPMainForm;
aDnsList:TStrings;
implementation

{$R *.dfm}

procedure TTIPMainForm.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 TTIPMainForm.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 TTIPMainForm.Button1Click(Sender: TObject);
begin
GetNetworkParameters;
GetAdapterInformation;

end;

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

end.
here 2008-06-19
  • 打赏
  • 举报
回复
{获取本机的DNS}
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.

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧