Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi NameServer IP ermitteln (https://www.delphipraxis.net/61700-nameserver-ip-ermitteln.html)

Ati 25. Jan 2006 09:23


NameServer IP ermitteln
 
Moin zusammen,

wie kann ich die Ip des aktuellen NameServer´s ermitteln. Unter W98 geht das mit dem Registry-Wert aus "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Servi ces\VxD\MSTCP\NameServer" aber wie unter XP?? Habe in der Suche ein Codebeispiel für "GetPerAdapterInfo" gefunden was aber bei mir aber nicht ganz funktioniert (Delphi-Version). Dann habe ich bei den Schweizern was gefunden, was mir aber alle DNS-IP´s ausliest. Ich möchte/brauch aber ja nur die akuelle. Ach so warum "GetPerAdapterInfo" bei mir nicht funktioniert liegt an:
Delphi-Quellcode:
aaiAdapters     : array of PIP_ADAPTER_INFO;
Ati

Ati 25. Jan 2006 14:48

Re: NameServer IP ermitteln
 
Um das nochmal heimlich zu pushen, möchte ich den gefunden Code hier mal reinschreiben. Vielleicht weiß ja jemand warum das bei mir nicht geht oder wie ich was anders schrieben muß.
Delphi-Quellcode:
const
  MAX_ADAPTER_DESCRIPTION_LENGTH = 128; // arb.
  MAX_ADAPTER_NAME_LENGTH        = 256; // arb.
  MAX_ADAPTER_ADDRESS_LENGTH     = 8;  // arb.

type
  PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
  IP_ADDRESS_STRING = packed record
    acString : array [1..16] of Char;
  end;

  PIP_MASK_STRING = ^PIP_MASK_STRING;
  IP_MASK_STRING = IP_ADDRESS_STRING;

  PIP_ADDR_STRING = ^IP_ADDR_STRING;
  IP_ADDR_STRING = packed record
    Next     : PIP_ADDR_STRING;
    IpAddress : IP_ADDRESS_STRING;
    IpMask   : IP_MASK_STRING;
    Context  : DWORD;
  end;

  time_t = comp;


  PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
  IP_ADAPTER_INFO = packed record
    Next               : PIP_ADAPTER_INFO;
    ComboIndex         : DWORD;
    AdapterName        : array [1..MAX_ADAPTER_NAME_LENGTH+4] of Char ;
    Description        : array [1..MAX_ADAPTER_DESCRIPTION_LENGTH+4] of Char;
    AddressLength      : UINT;
    Address            : array [1..MAX_ADAPTER_ADDRESS_LENGTH] of Byte;
    Index              : DWORD;
    dwType             : UINT;
    DhcpEnabled        : UINT;
    CurrentIpAddress   : PIP_ADDR_STRING;
    IpAddressList      : IP_ADDR_STRING;
    GatewayList        : IP_ADDR_STRING;
    DhcpServer         : IP_ADDR_STRING;
    HaveWins           : Boolean;
    PrimaryWinsServer  : IP_ADDR_STRING;
    SecondaryWinsServer : IP_ADDR_STRING;
    LeaseObtained      : time_t;
    LeaseExpires       : time_t;
  end;

  PIP_PER_ADAPTER_INFO = ^IP_PER_ADAPTER_INFO;
  IP_PER_ADAPTER_INFO = packed record
    AutoConfigEnabled : UINT;
    AutoConfigActive : UINT;
    CurrentDnsServer : PIP_ADDR_STRING;
    DnsServerList    : IP_ADDR_STRING;
  end;


function GetAdaptersInfo(const pAdapterInfo : PIP_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall;
function GetPerAdapterInfo(const pIfIndex : ULONG;const pAdapterInfo : PIP_PER_ADAPTER_INFO;const pOutBufLen : PULONG) : DWORD; stdcall;




implementation


function GetAdaptersInfo; external 'iphlpapi.dll';
function GetPerAdapterInfo; external 'iphlpapi.dll';



{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  pAdapterList    : PIP_ADAPTER_INFO;
  dwLenAdapter    : DWORD;
  aaiAdapters     : array of PIP_ADAPTER_INFO; //Hier die beschriebene Fehlermeldung
  dwResult        : DWORD;
  iIndexAdapter   : integer;
  iasWork         : IP_ADDR_STRING;
  paiWork         : PIP_PER_ADAPTER_INFO;
  dwLenAdapterInfo : DWORD;


begin
  pAdapterList := nil; // Alles auf 0 ==> Benötigte Buffergrösse ermitteln
  dwLenAdapter := 0;
  if GetAdaptersInfo(pAdapterList,@dwLenAdapter) <> ERROR_BUFFER_OVERFLOW then exit;
  pAdapterList := AllocMem(dwLenAdapter);
  try
    if GetAdaptersInfo(pAdapterList,@dwLenAdapter) <> ERROR_SUCCESS then exit;
    SetLength(aaiAdapters,1);
    aaiAdapters[0] := pAdapterList;
    while aaiAdapters[High(aaiAdapters)].Next <> nil do begin
      SetLength(aaiAdapters,Length(aaiAdapters)+1);
      aaiAdapters[High(aaiAdapters)] := aaiAdapters[High(aaiAdapters)-1].Next;
    end;
    for iIndexAdapter := 0 to high(aaiAdapters) do begin
      ListBox1.Items.Add(trim(aaiAdapters[iIndexAdapter].Description)+'/'+trim(aaiAdapters[iIndexAdapter].AdapterName));
      paiWork := nil;
      dwLenAdapterInfo  := 0;
      dwResult := GetPerAdapterInfo(aaiAdapters[iIndexAdapter].Index,paiWork,@dwLenAdapterInfo);
      if dwResult <> ERROR_BUFFER_OVERFLOW then begin
        ListBox1.Items.Add('***** (1) Fehler beim Auslesen der Adapterdaten: '+IntToStr(dwResult));
      end else begin
        paiWork := AllocMem(dwLenAdapterInfo);
        try
          dwResult := GetPerAdapterInfo(aaiAdapters[iIndexAdapter].Index,paiWork,@dwLenAdapterInfo);
          if dwResult <> ERROR_SUCCESS then begin
            ListBox1.Items.Add('***** (2) Fehler beim Auslesen der Adapterdaten: '+IntToStr(dwResult));
          end else begin
            iasWork := paiWork.DnsServerList;
            while iasWork.Next <> nil do begin
              ListBox1.Items.Add('DNS: '+trim(iasWork.IpAddress.acString));
              iasWork := iasWork.Next^;
            end;
            ListBox1.Items.Add('DNS:'+trim(iasWork.IpAddress.acString));
          end;
        finally
          FreeMem(paiWork,dwLenAdapterInfo);
        end;
      end;
    end;
  finally
    FreeMem(pAdapterList,dwLenAdapter);
  end;
end;

end.

Klaus01 25. Jan 2006 15:08

Re: NameServer IP ermitteln
 
Nun es ist aber möglich pro Netzwerkinterface DNS Einträge zu machen.
Wenn Du nun alle Adapter/Interface ausliest, werden halt auch die zugehörigen DNS
Einträge mit ausgegeben. Da sehe ich jetzt keinen Fehler drin.

Was meinst denn Du mit aktuellem DNS, den bekommst Du doch
pro Interface mit CurrentDNSServer:

Zitat:

Delphi-Quellcode:
PIP_PER_ADAPTER_INFO = ^IP_PER_ADAPTER_INFO;
  IP_PER_ADAPTER_INFO = packed record
    AutoConfigEnabled : UINT;
    AutoConfigActive : UINT;
    CurrentDnsServer : PIP_ADDR_STRING
    DnsServerList    : IP_ADDR_STRING;
  end;

Grüße
Klaus

Ati 25. Jan 2006 15:22

Re: NameServer IP ermitteln
 
Ich habe ja nicht gesagt das es ein Fehler ist. Nur wollte ich es so nicht haben. So benutze ich mein Firmen NB auch privat zu Hause und da braucht sowas hier nicht gespeichert werden.

Ati 25. Jan 2006 16:06

Re: NameServer IP ermitteln
 
Okay hier mal der Code der Schweizer. Auch hier taucht "CurrentDnsServer" auf.
Delphi-Quellcode:
const
  MAX_HOSTNAME_LEN   = 128;
  MAX_DOMAIN_NAME_LEN = 128;
  MAX_SCOPE_ID_LEN   = 256;

type
  //
  // TIPAddressString - store an IP address or mask as dotted decimal string
  //
  PIPAddressString = ^TIPAddressString;
  PIPMaskString   = ^TIPAddressString;
  TIPAddressString = record
    _String: array[0..(4 * 4) - 1] of Char;
  end;
  TIPMaskString = TIPAddressString;

  //
  // TIPAddrString - store an IP address with its corresponding subnet mask,
  // both as dotted decimal strings
  //
  PIPAddrString = ^TIPAddrString;
  TIPAddrString = packed record
    Next: PIPAddrString;
    IpAddress: TIPAddressString;
    IpMask: TIPMaskString;
    Context: DWORD;
  end;

  //
  // FIXED_INFO - the set of IP-related information which does not depend on DHCP
  //
  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;

  // Get machine DNS Servers and return them in the provided StringList. This list should have been
  // already created by the calling program before performing this call
procedure GetDNSServers(AList: TStrings);




implementation

{$R *.DFM}
 function GetNetworkParams; external 'iphlpapi.dll' Name 'GetNetworkParams';


procedure GetDNSServers(AList: TStrings);
var
  pFI: PFixedInfo;
  pIPAddr: PIPAddrString;
  OutLen: Cardinal;
begin
  AList.Clear;
  pFI:=nil;
  OutLen :=0;
  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 there is no network available there may be no DNS servers defined
    if pFI^.DnsServerList.IpAddress._String[0] = #0 then Exit;
    // Add first server
  // alist.Add(pFI^.DnsServerList.IpAddress._String);
   AList.Add(pFI^.DnsServerList.IpAddress._String);
    // Add rest of servers
    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);
begin
GetDnsServers(listbox1.items);
end;
Wie muß ich es machen das nur vom "aktuellen" DNS-Server die IP ausgegeben wird?

Klaus01 25. Jan 2006 16:11

Re: NameServer IP ermitteln
 
Kannst Du mir mal bitte erklären, was Du unter aktuellen DNS Server verstehst?
Was für DNS Server siehst Du denn wenn Du von der Console (DOS-Box) ipconfig/all aufrust.
Da siehst Du doch auch sicherlich alle DNS Server - oder nicht?

Grüße
Klaus

Ati 25. Jan 2006 16:21

Re: NameServer IP ermitteln
 
Nun gut. Erstens hast Du natürlich recht. Wenn ich in der DOSBox ipconfig/all eingebe tauchen alle auf. So jetzt ist es aber so das ich hier in der Firma die IP 10.46.2.12 habe und dazu gehört nunmal der DNS-Server 10.46.2.5 und nur das möchte ich angezeigt bekommen.

Klaus01 25. Jan 2006 16:26

Re: NameServer IP ermitteln
 
Dann vergleich doch die Netzadresse Deiner IP mit den IP Adressen der ermittelten DNS Server.
Der DNS Server der die gleiche Netzadress hat wie Dein Rechner ist der DNS Server den Du suchst.
10.46.2.12 mit Netzmaske 255.255.255.0 gibt eine Netzadresse von 10.46.2
Dein DNS hat 10.46.2.5 mit der Netzadresse 10.46.2.0 sind nun die beiden Netzadressen
gleich hast Du Deinen DNS.

Eine andere Möglichkeit sehe ich da nicht.

Grüße
Klaus

P.S. Nur ist es nicht immer so, daß der DNS Server im gleichen Netz steht wie der Rechner der ihn abfragt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz