mirror of
https://github.com/Hopiu/linkchecker.git
synced 2026-04-28 18:14:42 +00:00
git-svn-id: https://linkchecker.svn.sourceforge.net/svnroot/linkchecker/trunk/linkchecker@631 e7d03fd6-7b0d-0410-9947-9c21f3af8025
141 lines
4.4 KiB
Python
141 lines
4.4 KiB
Python
"""
|
|
$Id$
|
|
|
|
Extract a list of TCP/IP name servers from the registry 0.1
|
|
0.1 Strobl 2001-07-19
|
|
Usage:
|
|
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, re
|
|
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"].
|
|
also handle u'd.d.d.d d.d.d.d', as reporting on SF
|
|
'''
|
|
import re
|
|
return map(str, re.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()
|
|
|
|
#
|
|
# $Log$
|
|
# Revision 1.1 2002/11/26 23:27:43 calvin
|
|
# update to Python >= 2.2.1
|
|
#
|
|
# Revision 1.3 2002/05/06 06:15:31 anthonybaxter
|
|
# apparently some versions of windows return servers as unicode
|
|
# string with space sep, rather than strings with comma sep.
|
|
# *sigh*
|
|
#
|
|
# Revision 1.2 2002/03/19 12:41:33 anthonybaxter
|
|
# tabnannied and reindented everything. 4 space indent, no tabs.
|
|
# yay.
|
|
#
|
|
# Revision 1.1 2001/08/09 09:22:28 anthonybaxter
|
|
# added what I hope is win32 resolver lookup support. I'll need to try
|
|
# and figure out how to get the CVS checkout onto my windows machine to
|
|
# make sure it works (wow, doing something other than games on the
|
|
# windows machine :)
|
|
#
|
|
# Code from Wolfgang.Strobl@gmd.de
|
|
# win32dns.py from
|
|
# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66260
|
|
#
|
|
# Really, ParseResolvConf() should be renamed "FindNameServers" or
|
|
# some such.
|
|
#
|
|
#
|