【原创】用python脚本在windows系统下收集msi的安装信息

接到个任务,要写一个脚本收集msi安装文件在windows下面的安装信息。

第一步:读取注册表识别出存在的msi。

由于msi在windows下面都是有一套统一的安装规则,我们可以识别HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\{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'SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData')
    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_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\\'+deltmp+'\\'+msi_info['product'])
                    deletelist.append('HKEY_CURRENT_USER\Software\Microsoft\Installer\Products\\'+msi_info['product'])
                    deletelist.append('HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\\'+msi_info['product'])
                    deletelist.append('HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Features\\'+msi_info['product'])
                    deletelist.append('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\\'+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)

 

转载于:https://www.cnblogs.com/liyangqiu/p/6493325.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值