# # Extract a list of TCP/IP name servers from the registry 0.1 # 0.1 Strobl 2001-07-19 # Useage: # RegistryResolve() returns a list of ip numbers (dotted quads), by scouring the # registry for addresses of name servers # # Tested on Windows NT4 Server SP6a, Windows 2000 Pro SP2 and Whistler Pro (XP) Build 2462 # and Windows ME # ... all having a different registry layout wrt name servers :-/ # # Todo: # # Program doesn't check whether an interface is up or down # # (c) 2001 Copyright by Wolfgang Strobl ws@mystrobl.de, # License analog to the current Python license # import string import _winreg def binipdisplay(s): "convert a binary array of ip adresses to a python list" if len(s)%4!= 0: raise EnvironmentError # well ... ol=[] for i in range(len(s)/4): s1=s[:4] s=s[4:] ip=[] for j in s1: ip.append(str(ord(j))) ol.append(string.join(ip,'.')) return ol def stringdisplay(s): 'convert "d.d.d.d,d.d.d.d" to ["d.d.d.d","d.d.d.d"]' return string.split(s,",") def RegistryResolve(): nameservers=[] x=_winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE) try: y= _winreg.OpenKey(x, r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters") except EnvironmentError: # so it isn't NT/2000/XP # windows ME, perhaps? try: # for Windows ME y= _winreg.OpenKey(x, r"SYSTEM\CurrentControlSet\Services\VxD\MSTCP") nameserver,dummytype=_winreg.QueryValueEx(y,'NameServer') if nameserver and not (nameserver in nameservers): nameservers.extend(stringdisplay(nameserver)) except EnvironmentError: pass return nameservers # no idea nameserver = _winreg.QueryValueEx(y,"NameServer")[0] if nameserver: nameservers=[nameserver] _winreg.CloseKey(y) try: # for win2000 y= _winreg.OpenKey(x, r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DNSRegisteredAdapters") for i in range(1000): try: n=_winreg.EnumKey(y,i) z=_winreg.OpenKey(y,n) dnscount,dnscounttype=_winreg.QueryValueEx(z,'DNSServerAddressCount') dnsvalues,dnsvaluestype=_winreg.QueryValueEx(z,'DNSServerAddresses') nameservers.extend(binipdisplay(dnsvalues)) _winreg.CloseKey(z) except EnvironmentError: break _winreg.CloseKey(y) except EnvironmentError: pass # try: # for whistler y= _winreg.OpenKey(x, r"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces") for i in range(1000): try: n=_winreg.EnumKey(y,i) z=_winreg.OpenKey(y,n) try: nameserver,dummytype=_winreg.QueryValueEx(z,'NameServer') if nameserver and not (nameserver in nameservers): nameservers.extend(stringdisplay(nameserver)) except EnvironmentError: pass _winreg.CloseKey(z) except EnvironmentError: break _winreg.CloseKey(y) except EnvironmentError: #print "Key Interfaces not found, just do nothing" pass # _winreg.CloseKey(x) return nameservers if __name__=="__main__": print "Name servers:",RegistryResolve()