C#通过注册表添加开机启动项默认禁用,如何编程启用该启动项?
为什么添加的启动项默认是禁用状态
这是Windows 8及以上版本的系统安全机制导致的:系统新增了StartupApproved注册表分支专门管控所有启动项的启用/禁用状态,避免恶意程序静默添加自启动项执行恶意代码。你仅向Run节点写入启动项时,系统会自动在StartupApproved分支下生成同名的禁用标记,所以任务管理器里默认显示为已禁用状态。
编程设置启动项为启用状态的方法
你需要同时修改StartupApproved\Run节点下对应启动项名称的二进制值,即可将状态改为启用,完整代码示例如下:
using System.IO; using Microsoft.Win32; // 省略上层命名空间、类、方法定义 string strExeFilePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string strWorkPath = Path.GetDirectoryName(strExeFilePath); string startupKeyName = "my_service_name"; string targetExePath = Path.Combine(strWorkPath, "MyProgram.exe"); // 写入Run注册表添加启动项 using (RegistryKey runKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true)) { runKey.SetValue(startupKeyName, targetExePath); } // 修改启动项审批状态为启用 using (RegistryKey approvedKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run", true)) { // 启用状态对应的固定12字节二进制值 byte[] enabledFlag = { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; approvedKey.SetValue(startupKeyName, enabledFlag, RegistryValueKind.Binary); }
注意事项
- 上述代码针对当前用户添加启动项,无需管理员权限运行;如果需要为所有用户添加全局启动项,将
Registry.CurrentUser替换为Registry.LocalMachine即可,此时程序必须以管理员权限运行 - 部分安全软件会拦截启动项状态修改操作,遇到写入失败的情况可排查安全软件的拦截规则
内容的提问来源于stack exchange,提问作者Jisson
相关产品推荐
相关产品推荐

