2 $Id: win32dns.py,v 1.3.2.1 2007/05/22 20:26:49 customdesigned Exp $
4 Extract a list of TCP/IP name servers from the registry 0.1
7 RegistryResolve() returns a list of ip numbers (dotted quads), by
8 scouring the registry for addresses of name servers
10 Tested on Windows NT4 Server SP6a, Windows 2000 Pro SP2 and
11 Whistler Pro (XP) Build 2462 and Windows ME
12 ... all having a different registry layout wrt name servers :-/
16 Program doesn't check whether an interface is up or down
18 (c) 2001 Copyright by Wolfgang Strobl ws@mystrobl.de,
19 License analog to the current Python license
26 "convert a binary array of ip adresses to a python list"
28 raise EnvironmentError # well ...
30 for i in range(len(s)/4):
35 ip.append(str(ord(j)))
36 ol.append(string.join(ip,'.'))
40 '''convert "d.d.d.d,d.d.d.d" to ["d.d.d.d","d.d.d.d"].
41 also handle u'd.d.d.d d.d.d.d', as reporting on SF
44 return map(str, re.split("[ ,]",s))
46 def RegistryResolve():
48 x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE)
51 r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters")
52 except EnvironmentError: # so it isn't NT/2000/XP
53 # windows ME, perhaps?
56 r"SYSTEM\CurrentControlSet\Services\VxD\MSTCP")
57 nameserver,dummytype=_winreg.QueryValueEx(y,'NameServer')
58 if nameserver and not (nameserver in nameservers):
59 nameservers.extend(stringdisplay(nameserver))
60 except EnvironmentError:
62 return nameservers # no idea
64 nameserver = _winreg.QueryValueEx(y, "DhcpNameServer")[0].split()
66 nameserver = _winreg.QueryValueEx(y, "NameServer")[0].split()
68 nameservers=nameserver
69 nameserver = _winreg.QueryValueEx(y,"NameServer")[0]
73 r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSRegisteredAdapters")
76 n=_winreg.EnumKey(y,i)
77 z=_winreg.OpenKey(y,n)
78 dnscount,dnscounttype=_winreg.QueryValueEx(z,
79 'DNSServerAddressCount')
80 dnsvalues,dnsvaluestype=_winreg.QueryValueEx(z,
82 nameservers.extend(binipdisplay(dnsvalues))
84 except EnvironmentError:
87 except EnvironmentError:
92 r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces")
95 n=_winreg.EnumKey(y,i)
96 z=_winreg.OpenKey(y,n)
98 nameserver,dummytype=_winreg.QueryValueEx(z,'NameServer')
99 if nameserver and not (nameserver in nameservers):
100 nameservers.extend(stringdisplay(nameserver))
101 except EnvironmentError:
104 except EnvironmentError:
107 except EnvironmentError:
108 #print "Key Interfaces not found, just do nothing"
114 if __name__=="__main__":
115 print "Name servers:",RegistryResolve()
118 # $Log: win32dns.py,v $
119 # Revision 1.3.2.1 2007/05/22 20:26:49 customdesigned
120 # Fix win32 nameserver discovery.
122 # Revision 1.3 2002/05/06 06:15:31 anthonybaxter
123 # apparently some versions of windows return servers as unicode
124 # string with space sep, rather than strings with comma sep.
127 # Revision 1.2 2002/03/19 12:41:33 anthonybaxter
128 # tabnannied and reindented everything. 4 space indent, no tabs.
131 # Revision 1.1 2001/08/09 09:22:28 anthonybaxter
132 # added what I hope is win32 resolver lookup support. I'll need to try
133 # and figure out how to get the CVS checkout onto my windows machine to
134 # make sure it works (wow, doing something other than games on the
137 # Code from Wolfgang.Strobl@gmd.de
139 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66260
141 # Really, ParseResolvConf() should be renamed "FindNameServers" or