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


    接到个任务,要写一个脚本收集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)
  • 相关阅读:
    P1486 [NOI2004]郁闷的出纳员
    poj2155 Matrix
    [USACO10MAR]伟大的奶牛聚集Great Cow Gat…
    分布式相关学习整理
    分布式学习之JTA
    linux相关命令整理
    每日笔记-redis的理解及相关应用
    利用redis实现分布式锁知识点总结及相关改进
    每日笔记-类加载机制及相关拓展
    多线程学习系列-概述
  • 原文地址:https://www.cnblogs.com/liyangqiu/p/6493325.html
Copyright © 2020-2023  润新知