如何使用Python获取并管理Windows系统的所有自启动程序
Windows自启动程序管理Python实现方案
本方案可实现任务管理器「启动」选项卡的全量功能,覆盖读取所有用户登录自启动程序、启用/禁用指定自启动项的需求,无需依赖第三方库。
核心原理
Windows用户登录自启动项主要存储在两类位置,启用/禁用状态单独存储在注册表标记位:
- 注册表
Run项:存储程序的启动路径配置 - 系统启动文件夹:存储程序的快捷方式
- 状态标记:
StartupApproved注册表路径下的二进制值首字节为0x02代表启用,0x03代表禁用
前置要求
- 仅适配Windows系统
- 修改所有用户范围的自启动项时,需要以管理员权限运行Python脚本
- 依赖Python标准库
winreg、os,无需额外安装依赖
功能代码实现
1. 读取所有自启动项
import winreg import os def get_all_startup_programs(): startup_items = [] # 待遍历的注册表路径 reg_paths = [ (winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Run", "当前用户"), (winreg.HKEY_LOCAL_MACHINE, r"Software\Microsoft\Windows\CurrentVersion\Run", "所有用户"), (winreg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run", "当前用户状态"), (winreg.HKEY_LOCAL_MACHINE, r"Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run", "所有用户状态") ] # 读取注册表类自启动项 for root, path, scope in reg_paths[:2]: try: key = winreg.OpenKey(root, path, 0, winreg.KEY_READ) for i in range(winreg.QueryInfoKey(key)[1]): name, value, _ = winreg.EnumValue(key, i) # 查询对应启用状态 enabled = True state_root = reg_paths[2][0] if scope == "当前用户" else reg_paths[3][0] state_path = reg_paths[2][1] if scope == "当前用户" else reg_paths[3][1] try: state_key = winreg.OpenKey(state_root, state_path, 0, winreg.KEY_READ) state_val, _ = winreg.QueryValueEx(state_key, name) if state_val[0] == 3: enabled = False winreg.CloseKey(state_key) except: pass startup_items.append({ "名称": name, "启动路径": value, "生效范围": scope, "启用状态": enabled }) winreg.CloseKey(key) except: continue # 读取启动文件夹类自启动项 user_startup = os.path.expandvars(r"%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup") all_startup = os.path.expandvars(r"%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup") for folder, scope in [(user_startup, "当前用户"), (all_startup, "所有用户")]: if not os.path.exists(folder): continue for file in os.listdir(folder): if file.endswith(".lnk"): startup_items.append({ "名称": os.path.splitext(file)[0], "启动路径": os.path.join(folder, file), "生效范围": scope, "启用状态": True }) return startup_items # 调用示例 if __name__ == "__main__": for item in get_all_startup_programs(): print(item)
2. 禁用指定自启动项
def disable_startup_item(item_name, scope): # 先处理注册表类自启动项 if scope == "当前用户": root = winreg.HKEY_CURRENT_USER state_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" startup_folder = os.path.expandvars(r"%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup") else: root = winreg.HKEY_LOCAL_MACHINE state_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" startup_folder = os.path.expandvars(r"%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup") try: key = winreg.OpenKey(root, state_path, 0, winreg.KEY_WRITE) winreg.SetValueEx(key, item_name, 0, winreg.REG_BINARY, b'\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') winreg.CloseKey(key) return True except: # 处理启动文件夹类自启动项,移动到disabled目录 disabled_folder = os.path.join(startup_folder, "disabled") os.makedirs(disabled_folder, exist_ok=True) try: os.rename( os.path.join(startup_folder, f"{item_name}.lnk"), os.path.join(disabled_folder, f"{item_name}.lnk") ) return True except: return False
3. 启用指定自启动项
def enable_startup_item(item_name, scope): if scope == "当前用户": root = winreg.HKEY_CURRENT_USER state_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" startup_folder = os.path.expandvars(r"%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup") else: root = winreg.HKEY_LOCAL_MACHINE state_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run" startup_folder = os.path.expandvars(r"%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Startup") try: key = winreg.OpenKey(root, state_path, 0, winreg.KEY_WRITE) winreg.SetValueEx(key, item_name, 0, winreg.REG_BINARY, b'\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') winreg.CloseKey(key) return True except: # 处理启动文件夹类自启动项,移回原目录 disabled_folder = os.path.join(startup_folder, "disabled") try: os.rename( os.path.join(disabled_folder, f"{item_name}.lnk"), os.path.join(startup_folder, f"{item_name}.lnk") ) return True except: return False
注意事项
- 代码覆盖了90%以上常见的用户态自启动项,服务类、计划任务类自启动项需要额外遍历系统服务接口和任务计划程序接口实现。
- 部分安全软件会拦截自启动项修改操作,遇到权限报错可先检查安全软件的拦截日志。
内容的提问来源于stack exchange,提问作者Toaster
相关产品推荐
相关产品推荐

