donet added
--HG-- branch : aspn
This commit is contained in:
193
src/dotnet.py
Normal file
193
src/dotnet.py
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
'''
|
||||||
|
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
|
||||||
|
|
||||||
|
http://code.activestate.com/recipes/578143-a-small-python-script-to-detect-net-framwork-versi/
|
||||||
|
'''
|
||||||
|
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()
|
||||||
Reference in New Issue
Block a user