dotnet 利用 Windows 注册表实现开机自动启动

news/2025/10/21 7:05:21/文章来源:https://www.cnblogs.com/lindexi/p/19154026

本文将演示写入 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 注册表路线,实现应用程序开机自动启动

核心代码如下

static class BoostHelper
{/// <summary>/// 添加到启动项,添加到注册表,仅限 Windows 系统,写入到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 里,实现开机启动/// </summary>/// <param name="name"></param>/// <param name="exePath"></param>/// <param name="arguments"></param>[SupportedOSPlatform("Windows")]public static void AddStartup(string name, string exePath, params string[] arguments){// 添加开机启动// 写入到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 里var runKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);if (runKey is not null){var valueStringBuilder = new StringBuilder();valueStringBuilder.Append($"\"{exePath}\"");foreach (var argument in arguments){valueStringBuilder.Append($" \"{argument}\"");}string value = valueStringBuilder.ToString();var existingValue = runKey.GetValue(name) as string;if (existingValue != value){runKey.SetValue(name, value);//LogMessage($"已设置开机启动,路径:{exePath}");}else{//LogMessage($"已设置过开机启动,路径:{exePath}");}}}[SupportedOSPlatform("Windows")]public static void RemoveStartup(string name){var runKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);if (runKey is not null){runKey.DeleteValue(name, false);//LogMessage($"已删除开机启动,路径:{exePath}");}}
}

调用 BoostHelper 方法的示例代码如下

    BoostHelper.AddStartup("Test", Environment.ProcessPath!);

传入的 AddStartup 的 name 参数表示一个注册表项名,合理的命名即可,没有特殊含义。同名的 name 将会相互覆盖,利用此覆盖机制即可实现更新启动路径的功能。删除时,就是直接删除对应的 name 项即可

写入之后,将在开机之后,用户登录之后,进入桌面之后启动程序。启动时使用当前用户的账户权限,且启动时机是延迟启动,相对来说比较友好,不会卡开机。这是比较常用的开机自启的注册表

在 Windows 上,还有很多其他注册表项可以用来添加开机自启,其差别的核心维度就是由什么、在什么时机启动

常见的添加开机自启的注册表项如下

  • 当前用户专有的启动文件夹: %AppData%\Microsoft\Windows\Start Menu\Programs
  • 所有用户有效的启动文件夹: %ProgramData%\Microsoft\Windows\Start Menu\Programs
  • Userinit注册键
    • 注册表地址: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    • 通常该注册表下面有一个C:\Windows\system32\userinit.exe,值,但这个键值是允许用逗号来分隔多个程序的,比如 C:\Windows\system32\userinit.exe,C:\lindexi.exe(举例)
  • Explorer\Run注册键
    • 当前用户的注册表地址:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
    • 机器级的注册表地址:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
  • RunServicesOnce注册键
    • 当前用户的注册表地址:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
    • 机器级的注册表地址:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
    • RunServicesOnce注册键是用来启动服务的,启动时间是在用户登录之前,而且是先于其它通过注册键启动的程序
  • RunServices注册键
    • 当前用户的注册表地址:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
    • 机器级的注册表地址:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
    • RunServices注册键指定的程序紧接RunServicesOnce指定的程序之后运行,启动时间也是在用户登录之前
  • RunOnce注册键
    • 注册表地址:
      • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
      • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce
      • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
    • HKEY_LOCAL_MACHINE下面的RunOnce注册键会在用户登录之后立即运行程序,运行的时机是在其它Run键指定的程序之前
    • HKEY_CURRENT_USER则会启动比较慢,它会在操作系统处理其他Run键以及“启动”文件夹的内容之后运行
  • Run注册键
    • 注册表地址:
      • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
      • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
      • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
    • Run是自动运行程序最常用的注册表。会先执行HKEY_LOCAL_MACHINE下的Run注册键内容,再执行HKEY_CURRENT_USER下的Run注册键内容,但两者都是在处理“启动文件夹”之前

除了本文记录的写注册表方法之外,还可以在启动文件夹存放快捷方式实现开机自启,详细请参阅 WPF 开发自动开机启动程序

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin e2a02a9aaa2148cc580cdbc91b92a5970d4b470f

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin e2a02a9aaa2148cc580cdbc91b92a5970d4b470f

获取代码之后,进入 Workbench/QeyeqawkayqaiWhonirikaywi 文件夹,即可获取到源代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/941889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

帮我回答这些问题

◦ 以太坊交易的数据结构及EIP1559/712协议的理解。 ◦ 以太坊的账⼾是如何⽣产的,公私钥的关系。 ◦ 以太坊区块链浏览器⼀般会展⽰哪些信息,⼤概能知道。 ◦ 以太坊交易nonce的作⽤,nonce异常交易如何处理。 ◦ 以…

使用uWSGI和Nginx部署深度学习模型指南

本文详细介绍了如何通过uWSGI应用服务器和Nginx反向代理将深度学习模型部署为可扩展的Web服务,涵盖WSGI协议原理、服务器配置步骤及性能优化要点,帮助构建高并发生产级AI应用。如何使用uWSGI和Nginx部署深度学习模型…

Python 类属性的应用场景

Python 类属性的应用场景 在面向对象编程中,类属性作为一种特殊的属性形式,始终扮演着“共享者”与“管理者”的角色。与实例属性为每个对象单独存储数据不同,类属性属于类本身,被所有实例共同拥有和访问。这种特性…

快速提升Entra ID安全性的实用指南

本文详细介绍了如何通过配置用户默认设置、保护特权角色、管理条件访问策略等关键步骤,快速提升Microsoft Entra ID的安全性,帮助企业构建更强大的云身份防护体系。快速提升Entra ID安全性 在2025年10月的BSides北弗…

为什么很多人分不清关联和聚合?

为什么很多人分不清关联和聚合 这个问题确实很常见,很多人(包括有经验的开发者)都会混淆关联和聚合。让我从多个角度分析这个现象的原因。 主要混淆原因 1. 代码实现的高度相似性 # 关联关系的代码 class Universit…

机器学习商业应用实战指南

本文详细介绍了在企业中应用机器学习的完整流程,从问题识别到团队建设、基础设施搭建、数据策略制定,再到MVP开发和持续迭代,为企业实施AI转型提供了系统性的技术指导。将机器学习应用于您的业务 在这篇文章中,我将…

在线签名工具,手写签名保存为png图片,用于生成电子签名用于word文档等

原文链接:https://blog.nanzhi.vip/?article_id=30&type=software 应用案例: 每天进步一点点

什么情况下,有必要将属性设为类属性而非实例属性?

类属性(Class Attribute)是定义在类中、不属于任何实例的属性,它被该类的所有实例共享。将属性设为类属性而非实例属性的必要性,主要体现在数据共享、全局状态维护、节省内存等场景中。以下从核心作用和具体示例两…

在线签名工具,保存为png图片,用于生成电子签名用于word文档等

原文链接:https://blog.nanzhi.vip/?article_id=30&type=software 应用案例: 每天进步一点点

玄机——第五章 Windows 实战-evtx 文件分析

第五章 Windows 实战-evtx 文件分析 切勿在本地运行 1.将黑客成功登录系统所使用的IP地址作为Flag值提交; 拿到文件后传入虚拟机打开 第一个是安全日志,在日志中过滤编号为4625(登录失败),4624(登录成功)的事件 从下…

251021

251021一觉醒来,我又活在了那份恐慌里,脚下飘飘,身体却很沉,这是清醒的代价,天堂和地狱都在人间

CityRefer:城市规模点云数据上的地理感知 3D 视觉接地数据集 - MKT

CityRefer:城市规模点云数据上的地理感知 3D 视觉接地数据集 城市规模的 3D 点云是表达精细复杂户外结构的一种有效方式。它涵盖了城市各个组成部分(包括汽车、街道和建筑物)的外观和几何特征,可用于实现自动驾驶汽…

SensatUrban语义分割数据集SensatUrban - MKT

SensatUrban语义分割数据集SensatUrban https://github.com/QingyongHu/SensatUrban 地面:包括不透水表面、草地、地形 植被:包括乔木、灌木、树篱、灌木丛 建筑:包括商业/住宅建筑 墙体:包括栅栏、高速公路护栏…

推荐算法参考资料

协同过滤 https://cloud.tencent.com/developer/article/1085760 Wide & Deep https://blog.csdn.net/qq_42363032/article/details/115935964 DIN https://blog.csdn.net/u012328159/article/details/123043033 指…

LLM学习笔记DAY8

📘今日学习总结 大语言模型提示技术学习笔记 1 提示工程 1.1 提示设计关键要素 五大核心要素:任务描述:清晰明确的任务指令,包含目标、限制条件、数据格式等 上下文信息:提供背景知识,帮助模型突破知识局限 输入…

软件工程第二次团队作业——构建一个智能体

这个作业属于哪个课程 软件工程这个作业要求在哪里 作业要求这个作业的目标 构建一个AI智能体,不仅能通过自然语言交流(会说),更能理解指令意图,并自动调用工具、访问数据或执行代码来完成任务(会做),最终在一…

VoxelNeXt 用于 3D 对象检测和跟踪的完全稀疏 VoxelNet(CVPR 2023) - MKT

VoxelNeXt 用于 3D 对象检测和跟踪的完全稀疏 VoxelNet(CVPR 2023) https://github.com/dvlab-research/VoxelNeXt

CityNav:包含地理信息的语言目标空中导航数据集 - MKT

CityNav:包含地理信息的语言目标空中导航数据集https://water-cookie.github.io/city-nav-proj/

Grounded-SAM 使用文本提示检测和分割所有内容 - MKT

Grounded-SAM 使用文本提示检测和分割所有内容https://github.com/IDEA-Research/Grounded-Segment-Anything?tab=readme-ov-file#install-without-docker

Linux权限维持-后门

Linux权限维持-后门 参考文章 Linux权限维持-后门 - 0xMouise - 博客园 1.找到ssh warpper后门需要修改的文件,flag在被修改的文件注释中。 SSH wrapper(包装器):通常指一个替代或拦截 sshd / ssh 的可执行文件或脚…