如何获得本机的DNS?欢迎有经验的朋友指点一二,非常感谢~

解决方案 »

  1.   

    {获取本机的DNS}
    unit GetDnsList;interfaceuses
      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.
      

  2.   

    楼上的代码有错误,我修改了下
    unit Unit1;interfaceuses
      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.
      

  3.   

    好像以前见过一个读取注册表的实例,我的DNS是在
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{46059442-887F-454D-9B78-8076BDB77DF4}
    下的NameServer键值
    这个{46059442-887F-454D-9B78-8076BDB77DF4}不确定是唯一的还是和机器有关
      

  4.   


    unit Unit1;interfaceuses
      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.
      

  5.   

    呵呵,用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;
      

  6.   

    呵呵,用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;