You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:36:04