Hello,

Can someone help please, How to find the configured nameservers (primary DNS server, Secondary DNS server) on a computer, I caould not find any VB code for this, I just found some Perl module I think needs someone knows perl good called Net::DNS

VB Code:
  1. package Net::DNS::Resolver::Win32;
  2. #
  3. # $Id: Win32.pm,v 2.100 2003/12/13 01:37:06 ctriv Exp $
  4. #
  5.  
  6. use strict;
  7. use vars qw(@ISA $VERSION);
  8.  
  9. use Net::DNS::Resolver::Base ();
  10.  
  11. @ISA     = qw(Net::DNS::Resolver::Base);
  12. $VERSION = (qw$Revision: 2.100 $)[1];
  13.  
  14. use Win32::Registry;
  15.  
  16. sub init {
  17.     my ($class) = @_;
  18.    
  19.     my $defaults = $class->defaults;
  20.    
  21.     my ($resobj, %keys);
  22.  
  23.     my $root = 'SYSTEM\CurrentControlSet\Services\Tcpip\Parameters';
  24.     unless ($main::HKEY_LOCAL_MACHINE->Open($root, $resobj)) {
  25.         # Didn't work, maybe we are on 95/98/Me?
  26.         $root = 'SYSTEM\CurrentControlSet\Services\VxD\MSTCP';
  27.         $main::HKEY_LOCAL_MACHINE->Open($root, $resobj)
  28.             or Carp::croak "can't read registry: $!";
  29.     }
  30.  
  31.     $resobj->GetValues(\%keys)
  32.         or Carp::croak "can't read registry values: $!";
  33.  
  34.     # Best effort to find a useful domain name for the current host
  35.     # if domain ends up blank, we're probably (?) not connected anywhere
  36.     # a DNS server is interesting either...
  37.     my $domain = $keys{'Domain'}->[2] || $keys{'DhcpDomain'}->[2] || '';
  38.    
  39.     # If nothing else, the searchlist should probably contain our own domain
  40.     # also see below for domain name devolution if so configured
  41.     # (also remove any duplicates later)
  42.     my $searchlist = "$domain ";
  43.     $searchlist  .= $keys{'SearchList'}->[2];
  44.    
  45.     # This is (probably) adequate on NT4
  46.     my $nameservers = $keys{'NameServer'}->[2] || $keys{'DhcpNameServer'}->[2];
  47.     #
  48.     # but on W2K/XP the registry layout is more advanced due to dynamically
  49.     # appearing connections. So we attempt to handle them, too...
  50.     # opt to silently fail if something isn't ok (maybe we're on NT4)
  51.     # drop any duplicates later
  52.     my $dnsadapters;
  53.     $resobj->Open("DNSRegisteredAdapters", $dnsadapters);
  54.     if ($dnsadapters) {
  55.         my @adapters;
  56.         $dnsadapters->GetKeys(\@adapters);
  57.         foreach my $adapter (@adapters) {
  58.             my $regadapter;
  59.             $dnsadapters->Open($adapter, $regadapter);
  60.             if ($regadapter) {
  61.                 my($type,$ns);
  62.                 $regadapter->QueryValueEx("DNSServerAddresses", $type, $ns);
  63.                 while (length($ns) >= 4) {
  64.                     my $addr = join('.', unpack("C4", substr($ns,0,4,"")));
  65.                     $nameservers .= " $addr";
  66.                 }
  67.             }
  68.         }
  69.     }
  70.  
  71.     my $interfaces;
  72.     $resobj->Open("Interfaces", $interfaces);
  73.     if ($interfaces) {
  74.         my @ifacelist;
  75.         $interfaces->GetKeys(\@ifacelist);
  76.         foreach my $iface (@ifacelist) {
  77.             my $regiface;
  78.             $interfaces->Open($iface, $regiface);
  79.             if ($regiface) {
  80.                 my $ns;
  81.                 my $type;
  82.                 $regiface->QueryValueEx("NameServer", $type, $ns);
  83.                 $nameservers .= " $ns" if $ns;
  84.                 $regiface->QueryValueEx("DhcpNameServer", $type, $ns);
  85.                 $nameservers .= " $ns" if $ns;
  86.             }
  87.         }
  88.     }
  89.  
  90.     if ($domain) {
  91.         $defaults->{'domain'} = $domain;
  92.     }
  93.  
  94.     my $usedevolution = $keys{'UseDomainNameDevolution'}->[2];
  95.     if ($searchlist) {
  96.         # fix devolution if configured, and simultaneously make sure no dups (but keep the order)
  97.         my $i = 0;
  98.         my %h;
  99.         foreach my $entry (split(m/[\s,]+/, $searchlist)) {
  100.             $h{$entry} = $i++;
  101.             if ($usedevolution) {
  102.                 # as long there's more than two pieces, cut
  103.                 while ($entry =~ m#\..+\.#) {
  104.                     $entry =~ s#^[^\.]+\.(.+)$#$1#;
  105.                     $h{$entry} = $i++;
  106.                     }
  107.                 }
  108.             }
  109.         my @a;
  110.         $a[$h{$_}] = $_ foreach (keys %h);
  111.         $defaults->{'searchlist'} = \@a;
  112.     }
  113.  
  114.     if ($nameservers) {
  115.         # just in case dups were introduced...
  116.         my @a;
  117.         my %h;
  118.         foreach my $ns (split(m/[\s,]+/, $nameservers)) {
  119.             push @a, $ns unless $h{$ns};
  120.             $h{$ns} = 1;
  121.         }
  122.         $defaults->{'nameservers'} = \@a;
  123.     }
  124.  
  125.     $class->read_env;
  126.  
  127.     if (!$defaults->{'domain'} && @{$defaults->{'searchlist'}}) {
  128.         $defaults->{'domain'} = $defaults->{'searchlist'}[0];
  129.     } elsif (!@{$defaults->{'searchlist'}} && $defaults->{'domain'}) {
  130.         $defaults->{'searchlist'} = [ $defaults->{'domain'} ];
  131.     }
  132.  
  133.     $defaults->{'usevc'} = 1;
  134.     $defaults->{'tcp_timeout'} = undef;
  135. }
  136.  
  137. 1;
  138. __END__
  139.  
  140.  
  141. =head1 NAME
  142.  
  143. Net::DNS::Resolver::Win32 - Windows Resolver Class
  144.  
  145. =head1 SYNOPSIS
  146.  
  147.  use Net::DNS::Resolver;
  148.  
  149. =head1 DESCRIPTION
  150.  
  151. This class implements the windows specific portions of C<Net::DNS::Resolver>.
  152.  
  153. No user serviceable parts inside, see L<Net::DNS::Resolver|Net::DNS::Resolver>
  154. for all your resolving needs.
  155.  
  156. =head1 COPYRIGHT
  157.  
  158. Copyright (c) 1997-2002 Michael Fuhr.
  159.  
  160. Portions Copyright (c) 2002-2003 Chris Reinhardt.
  161.  
  162. All rights reserved.  This program is free software; you may redistribute
  163. it and/or modify it under the same terms as Perl itself.
  164.  
  165. =head1 SEE ALSO
  166.  
  167. L<perl(1)>, L<Net::DNS>, L<Net::DNS::Resolver>
  168.  
  169. =cut