AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi NameServer IP ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

NameServer IP ermitteln

Ein Thema von Ati · begonnen am 25. Jan 2006 · letzter Beitrag vom 25. Jan 2006
Antwort Antwort
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#1

NameServer IP ermitteln

  Alt 25. Jan 2006, 09:23
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:
aaiAdapters : array of PIP_ADAPTER_INFO; Ati
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#2

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 14:48
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.
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 15:08
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
Klaus
  Mit Zitat antworten Zitat
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#4

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 15:22
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.
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#5

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 16:06
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.dllName '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?
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 16:11
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
Klaus
  Mit Zitat antworten Zitat
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#7

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 16:21
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.
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: NameServer IP ermitteln

  Alt 25. Jan 2006, 16:26
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.
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz