import os import subprocess import shutil import _winreg import time import glob # --------------------------------------------------------- # Safe folder deletion # --------------------------------------------------------- def safe_rmtree(path): try: if os.path.exists(path): shutil.rmtree(path, ignore_errors=True) except: pass # --------------------------------------------------------- # Safe file delete # --------------------------------------------------------- def safe_delete(pattern): try: for f in glob.glob(pattern): try: os.remove(f) except: pass except: pass # --------------------------------------------------------- # Delete registry tree # --------------------------------------------------------- def delete_reg_tree(root, path): try: key = _winreg.OpenKey( root, path, 0, _winreg.KEY_ALL_ACCESS ) except: return while True: try: sub = _winreg.EnumKey(key, 0) delete_reg_tree(root, path + "\\" + sub) except: break try: _winreg.CloseKey(key) except: pass try: _winreg.DeleteKey(root, path) except: pass # --------------------------------------------------------- # Remove Wise uninstall registry entries # --------------------------------------------------------- def remove_wise_reg_entries(): locations = [ r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" ] for root in ( _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER ): for base in locations: try: key = _winreg.OpenKey(root, base) except: continue i = 0 while True: try: sub = _winreg.EnumKey(key, i) i += 1 except: break sub_path = base + "\\" + sub try: sk = _winreg.OpenKey(root, sub_path) try: name, _ = _winreg.QueryValueEx( sk, "DisplayName" ) except: _winreg.CloseKey(sk) continue _winreg.CloseKey(sk) if "Wise Registry Cleaner" in name: delete_reg_tree(root, sub_path) except: pass try: _winreg.CloseKey(key) except: pass # --------------------------------------------------------- # Check if Wise still exists # --------------------------------------------------------- def wise_exists(): folders = [ r"C:\Program Files\Wise\Wise Registry Cleaner", r"C:\Program Files (x86)\Wise\Wise Registry Cleaner" ] for f in folders: if os.path.exists(f): return True return False # --------------------------------------------------------- # Kill processes # --------------------------------------------------------- def kill_processes(): processes = [ "WiseRegistryCleaner.exe", "WiseRegCleaner.exe", "unins000.exe" ] for p in processes: try: subprocess.call( 'taskkill /F /IM "%s"' % p, shell=True ) except: pass # --------------------------------------------------------- # Run silent uninstall # --------------------------------------------------------- def run_uninstaller(unins): try: cmd = ( '"%s" ' '/VERYSILENT ' '/SUPPRESSMSGBOXES ' '/NORESTART ' '/SP-' ) % unins proc = subprocess.Popen( cmd, shell=True ) timeout = 120 start = time.time() while proc.poll() is None: if time.time() - start > timeout: try: proc.kill() except: pass break time.sleep(2) except: pass # --------------------------------------------------------- # FORCE UNINSTALL # --------------------------------------------------------- def spm_uninstall(dir, args): kill_processes() uninstallers = [ r"C:\Program Files\Wise\Wise Registry Cleaner\unins000.exe", r"C:\Program Files (x86)\Wise\Wise Registry Cleaner\unins000.exe" ] for unins in uninstallers: if os.path.exists(unins): run_uninstaller(unins) time.sleep(5) kill_processes() # Remove leftover folders safe_rmtree( r"C:\Program Files\Wise\Wise Registry Cleaner" ) safe_rmtree( r"C:\Program Files (x86)\Wise\Wise Registry Cleaner" ) # Remove shortcuts safe_delete( r"C:\Users\Public\Desktop\*Wise*.lnk" ) safe_delete( r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\*Wise*.lnk" ) # Remove registry entries remove_wise_reg_entries() time.sleep(3) # FINAL RESULT if wise_exists(): print "retcode1retcode" else: print "retcode0retcode" # --------------------------------------------------------- # INSTALL # --------------------------------------------------------- def spm_install(dir, args): try: os.chdir(dir) subprocess.check_call( args, shell=True ) print "retcode0retcode" except subprocess.CalledProcessError as e: print "retcode" + str(e.returncode) + "retcode" # --------------------------------------------------------- # UPDATE # --------------------------------------------------------- def spm_update(dir, args): try: os.chdir(dir) subprocess.check_call( args, shell=True ) print "retcode0retcode" except subprocess.CalledProcessError as e: print "retcode" + str(e.returncode) + "retcode"