接到个任务,要写一个脚本收集msi安装文件在windows下面的安装信息。
第一步:读取注册表识别出存在的msi。
由于msi在windows下面都是有一套统一的安装规则,我们可以识别HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserData{userid}下msi的安装信息,得到msi安装后的GUID号。
第二步:收集所有msi的安装信息
根据第一步得到的GUID号我们可以知道msi对应的卸载项、安装路径、installer等信息,可以把这些信息存成一个删除msi的列表。
第三步:删除
根据得到的msi删除列表,调用sys和_winreg两个库可以进行删除操作。
整个代码如下:
#coding:utf-8 import _winreg import sys import os import shutil def getmsiinfo(name): i=0 msi_info={} user=[] key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,r'SOFTWAREMicrosoftWindowsCurrentVersionInstallerUserData') try: while 1: #目前只循环一级 subkey=_winreg.EnumKey(key, i) user.append(subkey) i +=1 except: pass for msikey in user: j=0 filekey=msikey msikey=msikey+r"""Products""" deltmp=msikey msikey=_winreg.OpenKey(key,msikey) try: while 1: #得到name和product infokey=_winreg.EnumKey(msikey, j) msi_info['product']=infokey infokey=infokey+r"""InstallProperties""" infokey=_winreg.OpenKey(msikey,infokey) (msiname, type) = _winreg.QueryValueEx(infokey, "DisplayName") msi_info['name']=msiname #得到卸载项 (unin, type) = _winreg.QueryValueEx(infokey, "UninstallString") unin=unin[14:] msi_info['unin']=unin if msi_info['name']==name: deletelist.append('HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInstallerUserData\'+deltmp+'\'+msi_info['product']) deletelist.append('HKEY_CURRENT_USERSoftwareMicrosoftInstallerProducts\'+msi_info['product']) deletelist.append('HKEY_LOCAL_MACHINESOFTWAREClassesInstallerProducts\'+msi_info['product']) deletelist.append('HKEY_LOCAL_MACHINESOFTWAREClassesInstallerFeatures\'+msi_info['product']) deletelist.append('HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall\'+msi_info['unin']) (file, type) = _winreg.QueryValueEx(infokey, "LocalPackage") deletelist.append(file) filekey=filekey+'\'+'Components'+'\'+msi_info['product'] filekey=_winreg.OpenKey(key,filekey) (file, type) = _winreg.QueryValueEx(filekey, msi_info['product']) deletelist.append(file) deletelist.append('C:\Windows\Installer\'+msi_info['unin']) return msi_info else: j +=1 except: pass def delmsi(list): for item in list: print item try: if item.find('.')!= -1: os.remove(item) elif item.find(':')!= -1: shutil.rmtree(item,True) elif item.find('HKEY')!= -1: print item tmpl=item.split('\',2) key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,tmpl[1]) _winreg.DeleteKey(key,tmpl[2]) except: pass if __name__ == "__main__": name=sys.argv[1] deletelist=[] getmsiinfo(name) delmsi(deletelist)