'''
A simple python script to find out the .NET framework versions
installed on a local or remote machine. (remote machine does not work yet ;)
Usage:
donet.py [--machine|-m=<computer_name>] [--check|-c=all|1.0|1.1|2.0|3.0|3.5|4]
if invoked with a 32 bit python, 32 bit versions of .net framework will be returned;
if invoked with a 64 bit python, 64 bit versions of .net framework will be returned.
Sample Run:
C:\IronPythonPlay>'C:\Program Files (x86)\IronPython 2.7.1\ipy64.exe' dotnet.py
2.0.50727.5420 SP2 - None
3.0.30729.5420 SP2 - None
3.5.30729.5420 SP1 64bit C:\Windows\Microsoft.NET\Framework64\v3.5\
4.0.30319:Client GA 64bit C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
4.0.30319:Full GA 64bit c:\Windows\Microsoft.NET\Framework64\v4.0.30319\
C:\IronPythonPlay>"C:\Program Files (x86)\IronPython 2.7.1\ipy.exe" dotnet.py
2.0.50727.5420 SP2 - None
3.0.30729.5420 SP2 - None
3.5.30729.5420 SP1 32bit C:\Windows\Microsoft.NET\Framework\v3.5\
4.0.30319:Client GA 32bit C:\Windows\Microsoft.NET\Framework\v4.0.30319\
4.0.30319:Full GA 32bit c:\Windows\Microsoft.NET\Framework\v4.0.30319\
Author: Yong Zhao (zonplm At gmail dot com)
Date: 2012-05-22
Rev: 0.1
'''
import json
import os
import sys
try:
from _winreg import *
except:
print '''Unable to import _winreg module!
Please Check your python installation.
'''
exit(-1)
DOT_NET_VERSIONS = {
'1.0': (r'Software\Microsoft\Active Setup\Installed Components\{78705f0d-e8db-4b2d-8193-982bdda15ecd}',
#1.0 Windows XP Media Center 2002/2004/2005 and Tablet PC 2004/2005
r'Software\Microsoft\Active Setup\Installed Components\{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}'
),
'1.1': (r'SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322', ),
'2.0': (r'Software\Microsoft\NET Framework Setup\NDP\v2.0.50727', ),
'3.0': (r'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0',),
'3.5': (r'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5',),
'4': (r'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client',
r'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full') # v4 has Client or Full profiles
# add future .NET framework info below
}
class DotNetVersion(object):
def __init__(self, version, sp, is32or64, installpath):
self.version = version
self.servicepack = sp
self.is32or64 = is32or64
self.installpath = installpath
def __repr__(self):
return json.dumps( {'dotnetversion': self.version,
'servicepack': self.servicepack,
'is32or64': self.is32or64,
'installpath': self.installpath})
def __str__(self):
sp = 'GA'
if self.servicepack:
sp = 'SP'+ str(self.servicepack)
return "{0:18} {1:<4} {2:5} {3}".format(self.version, sp,
self.is32or64,self.installpath)
class DotNetManager(object):
def __init__(self, machine=None):
try:
if machine == None:
self.lm_hive = OpenKey(HKEY_LOCAL_MACHINE, '')
else:
self.lm_hive = ConnectRegistry(machine, HKEY_LOCAL_MACHINE)
except WindowsError, ex:
print ex
exit(-2)
def __del__(self):
if self.lm_hive:
CloseKey(self.lm_hive)
def _getdotnetinfo(self, subkeyname):
thever = None
try:
if subkeyname:
subkey = OpenKey(self.lm_hive, subkeyname)
install, itype = QueryValueEx(subkey, 'Install')
version, vtype = QueryValueEx(subkey, 'Version')
sp, sptype = QueryValueEx(subkey, 'SP')
installPath, iptype = QueryValueEx(subkey, 'InstallPath')
is32or64 = '-'
if installPath and installPath.find('Framework64') > -1:
is32or64 = '64bit'
elif installPath and installPath.find('Framework') > -1:
is32or64 = '32bit'
if install:
thever = DotNetVersion(version, sp, is32or64, installPath)
if subkey: CloseKey(subkey)
except Exception, ex:
#print ex
pass
return thever
def getdotnetversion(self, iver):
'''
Given a version string such as 3.0, return a list of DotNetVersion object
'''
thever = None
allProfile = []
for subkeyname in DOT_NET_VERSIONS.get(iver, []):
theVer = self._getdotnetinfo(subkeyname)
#1.0, return as soon as find a valid installation
if iver == "1.0":
if theVer:
allProfile.append(theVer)
break
#4, return both Client and Full profiles
elif iver == "4":
profile = subkeyname.split("\\")[-1]
theVer.version += ":"+ profile
if theVer: allProfile.append(theVer)
return allProfile
#return DotNetVersion('v'+ iver, '0', '32bit', r'C:\dummy\path\v' + iver)
def getalldotnetversions(self):
'''
Get all .net framework versions installed on the given MACHINE.
A list of DotNetVersion objects is returned
'''
allversions = []
for ver in DOT_NET_VERSIONS.keys():
allversions.extend(self.getdotnetversion(ver) )
return allversions
if __name__ == "__main__":
import argparse
import pprint
parser = argparse.ArgumentParser(description=
'''find .NET framework versions installed on MACHINE.
for now, the script only works on the local machine.
''')
parser.add_argument("-m", "--machine")
parser.add_argument("-c", "--check", default="all",
help=".net versions to check: all|1.0|1.1|2.0|3.0|3.5|4")
args = parser.parse_args()
#for now we just ignore remote machine option
#pprint.pprint(DOT_NET_VERSIONS)
if args.machine:
args.machine = r"\\" + args.machine
if args.machine == None:
print os.environ['COMPUTERNAME'], ':'
else:
print args.machine, ":"
dotnetmgr = DotNetManager(args.machine)
if (args.check == "all"):
allvers = dotnetmgr.getalldotnetversions()
#pprint.pprint(allvers)
else:
allvers = dotnetmgr.getdotnetversion(args.check)
for ver in sorted(allvers, lambda x,y: cmp(x.version, y.version)):
print str(ver)
exit(0)
#sys.stdin.readline()