''' 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=] [--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()