一. 查找windows 上软件安装的路径
def find_custom_launcher_path(launcher_name="shardx-launcher.exe"): """ 高效、精准地查找第三方自定义客户端/浏览器(如 shardx-launcher.exe)的安装路径 """ import os import winreg found_paths = set() # 策略 2:检查 Windows 兼容性助手缓存注册表 (AppCompatFlags Store) print('策略 2') # (如果该程序在当前电脑上被运行过,这里一定有记录) # ========================================== try: sub_key = r'Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store' # 换用更直接的 RegEnumValue 遍历 with winreg.OpenKey(winreg.HKEY_CURRENT_USER, sub_key, 0, winreg.KEY_READ) as key: info = winreg.QueryInfoKey(key) for i in range(info[1]): val_name, _, _ = winreg.EnumValue(key, i) if val_name and val_name.lower().endswith(launcher_name.lower()): if os.path.isfile(val_name): return os.path.normpath(val_name) except OSError: pass # ========================================== # 策略 1:检查 AppData 目录 (绝大多数自定义软件默认安装在 Local/Roaming 或其子目录) print('策略 1') # ========================================== appdata_roots = [ os.path.expandvars(r"%LocalAppData%"), os.path.expandvars(r"%AppData%"), os.path.expandvars(r"%ProgramFiles%"), os.path.expandvars(r"%ProgramFiles(x86)%"), ] for base_dir in appdata_roots: if not base_dir or not os.path.exists(base_dir): continue # 使用 os.walk 深度限制搜索,避免全盘扫描过慢 # 通常这类软件在 AppData 下不会埋太深,限制深度可以大幅提升速度 for root, dirs, files in os.walk(base_dir): # 控制目录遍历深度(例如:从根目录往下最多查 4 层,防止无限递归) depth = root[len(base_dir):].count(os.sep) if depth > 4: del dirs[:] # 超过深度不再往下找 continue if launcher_name.lower() in [f.lower() for f in files]: full_path = os.path.join(root, launcher_name) if os.path.isfile(full_path): found_paths.add(os.path.normpath(full_path)) # 如果找到一个即可提前返回,或者收集所有符合的路径 return full_path # ========================================== # 策略 3:通过系统 PATH 或 cmd where 命令快速检索 print('策略 3') # ========================================== try: import subprocess result = subprocess.run( ["where", launcher_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=2 ) if result.returncode == 0: lines = result.stdout.strip().splitlines() if lines and os.path.isfile(lines[0]): return os.path.normpath(lines[0]) except Exception: pass return None二. 查找chrome.exe 的安装路径
def get_browser_path(): import win32con, win32api upper_keyword = '\chrome.exe' path = None sub_key = r'Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store' key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER, sub_key, 0, win32con.KEY_READ) info = win32api.RegQueryInfoKey(key) for i in range(0, info[1]): value = win32api.RegEnumValue(key, i) print(value[0]) if value[0].lower().endswith(upper_keyword.lower()): path = value[0] break win32api.RegCloseKey(key) return path
def get_browser_path1(browser): # 获取windows 路径方式1 import winreg result = [] # 需要遍历的两个注册表 sub_key = [r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', r'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall', ] for i in sub_key: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, i) for j in range(winreg.QueryInfoKey(key)[0]): try: each_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, f'{i}\\{winreg.EnumKey(key, j)}') display_path, reg_sz = winreg.QueryValueEx(each_key, "DisplayIcon") if browser in display_path: result.append(display_path.split(',')[0]) except WindowsError: pass return result def get_browser_path2(browser): # 获取windows 路径方式2 # 连接注册表根键 以HKEY_LOCAL_MACHINE为例 regRoot = ConnectRegistry(None, HKEY_LOCAL_MACHINE) subDir = r'SOFTWARE' # 获取指定目录下所有键的控制 keyHandle = OpenKey(regRoot, subDir) # 获取该目录下所有键的个数(0-下属键个数 1-当前键值个数) count = QueryInfoKey(keyHandle)[0] lists = [] for i in range(count): # 穷举键获取键名 subKeyName = EnumKey(keyHandle, i) subDir_2 = r'%s\%s' % (subDir, subKeyName) # 根据获取的键名拼接之前的路径作为参数 获取当前键下所属键的控制 keyHandle_2 = OpenKey(regRoot, subDir_2) num = QueryInfoKey(keyHandle_2)[1] for j in range(num): name, value, type_ = EnumValue(keyHandle_2, j) if browser in name.lower(): _browser_regs = '\\'.join(value.split('\\')[:-1]) + '\\DefaultIcon' key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, _browser_regs) value1, _type1 = winreg.QueryValueEx(key, "") lists.append(value1.split(',')[0]) # 读写操作结束后关闭键 CloseKey(keyHandle_2) return lists def get_browser_path3(): # 获取windows 路径方式3 result = None if winreg: for subkey in ['ChromeHTML\\\\shell\\\\open\\\\command', 'Applications\\\\chrome.exe\\\\shell\\\\open\\\\command']: try: result = winreg.QueryValue(winreg.HKEY_CLASSES_ROOT, subkey) except WindowsError: pass if result is not None: result_split = shlex.split(result, False, True) result = result_split[0] if result_split else None if os.path.isfile(result): break result = None else: expected = "google-chrome" + (".exe" if os.name == 'nt' else "") for parent in os.environ.get('PATH', '').split(os.pathsep): path = os.path.join(parent, expected) if os.path.isfile(path): result = path break return [result] def get_browser_path4(path, file_list=[]): # 获取windows 路径方式4 try: os.listdir(path) except: return for i in os.listdir(path): path1 = os.path.join(path, i) if os.path.isdir(path1) and 'program' in path1.lower(): get_browser_path4(path1, file_list) elif os.path.isfile(path1): if 'google' in path1.lower() and path1.lower().endswith('chrome.exe') and 'temp' not in path1.lower(): file_list.append(path1.replace('\\\\', '\\')) return file_list return file_list def get_soft_path(path, file_list=[]): # mac 获取谷歌浏览器的路径 for i in os.listdir(path): path1 = os.path.join(path, i) if os.path.isdir(path1): get_soft_path(path1, file_list) elif os.path.isfile(path1): if 'MacOS' in path1 and path1.endswith('Chrome'): file_list.append(path1) return file_list return file_listbrowser = 'chrome' if sys.platform.lower().startswith('freebsd') or sys.platform.lower().startswith('darwin'): path = get_soft_path('/Applications/') else: path = get_browser_path2(browser) or get_browser_path1(browser) or get_browser_path3() or get_browser_path4(r'C:\\') print(path)#获取mac地址
def get_network_info(): #https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-networkadapter import wmi mac = '' s = wmi.WMI() for nw in s.Win32_NetworkAdapter(): # print(nw.properties) if '以太网' in str(nw.NetConnectionID): mac = nw.MACAddress.replace(':', '-') return mac def get_netcard(): import uuid from psutil import net_if_addrs mac = '' info = net_if_addrs() for k, v in info.items(): if k == '以太网': k = '以太网en0' print(k) if k not in ['以太网', 'en0'] and '以太网' not in str(k): continue for i in v: if '-' in i[1] or ':' in i[1]: if len(i[1]) == 17: mac = str(i[1]).lower() break if not mac: node = uuid.getnode() mac = uuid.UUID(int=node).hex[-12:] mac = '-'.join([mac[i:i + 2] for i in range(0, len(mac) + 2 // 2, 2)])[:-1] return mac mac = get_network_info() print(mac) print(get_netcard())