Welcome, guest | Sign In | My Account | Store | Cart

A utility function somewhat similar to what parsing resolv.conf for nameserver entries would do on Unix.

Python, 104 lines
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
#
# 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()
    

RegistryResolve() returns a list of ip numbers (dotted quads), by scanning the registry for interfaces having name server entries. This is usefull when porting untilities that just scan resolv.conf on Unix to Microsoft Windows. As shown, the code handles differences between NT, 2000, Whistler and ME (haven't tried it on Win95/98, but it should work).