HKEY_LOCAL_MACHINE根键自启动项目的添加和查询

2023-10-08 09:20

本文主要是介绍HKEY_LOCAL_MACHINE根键自启动项目的添加和查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注册表操作实验

目录

注册表操作实验

目标系统:Windows

软件工具:VS2022/VC6

实验思路步骤:

     1、先查资料详细了解注册表。

     2、API函数。

具体实现过程

实现HKEY_LOCAL_MACHINE根键自启动项目的添加

HKEY_LOCAL_MACHINE根键自启动项目的查询

查看运行结果

源代码


实验设备:   

目标系统:Windows

软件工具:VS2022/VC6

实验要求:

  1. 程序中完成本机HKEY_LOCAL_MACHINE根键自启动项目的添加和查询。
  2. 要求有regedit编辑器查询结果截图,程序注释

实验内容:

实验思路步骤:

Win32API参考手册http://www.yfvb.com/help/win32sdk/

     1、先查资料详细了解注册表

注册表是Windows操作系统中的一个重要数据库。其中包含了许多与系统相关的配置信息。Windows提供了一个编辑器方便我们编辑。可以按Win+R输入regedit来打开。或者直接去系统目录下寻找。

设置自启动的键值项有很多,这里仅仅介绍两种通用的,其他的我也没了解。

HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run

HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run

可以看到上面两项唯一的区别就是根键(简称键)不同,子键是一样的。HKEY_CURRENT_USER与HKEY_LOCAL_MACHINE的区别是影响范围。前者影响只当前用户而后者是系统配置影响所有用户。只要里面添加入新的键值对就可以实现自启动。

进行如上图的写入操作后就可以实现开机自启动。可以看到我是在HKEY_CURRENT_USER根键下也就是说这个设置只会影响我目前的登陆账户。

2、API函数。

编写程序操作注册表就必须使用系统API函数,目前需要用到的函数有:RegOpenKeyEx、RegCreateKeyEx、RegSetKeyValue、RegDeleteKeyValue、RegCloseKey

创建指定的注册表项RegCreateKeyEx()

HKEY hKey--需要打开的主键的名称,LPCTSTR lpSubKey--需要打开的子键的名称,DWORD ulOptions--保留,设为0,REGSAM samDesired---安全访问标记,也就是权限,PHKEY phkResult---得到的将要打开键的句柄。

向注册表写入信息RegSetVauleEx()函数。


此函数中,需要传入的参数依次是,HKEY(RegOpenKeyEx函数中的最后一个参数)、键名、NULL、REG_SZ、启动程序的完整地址、值数据的大小。

检索信息--RegQueryVaule()函数。

相关函数在Win32API参考手册中查询:Win32API参考手册

3注意操作HKEY_LOCAL_MACHINE根键内容时需要管理员权限否则会失败,而HKEY_CURRENT_USER只需要默认权限就足够了。

具体实现过程

实现HKEY_LOCAL_MACHINE根键自启动项目的添加

Win+r打开命令提示符,输入regedit,进入注册表编辑器,在\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run下目前有如下项目。

实现添加自启动项目。 打开注册表使用到了函数GetModuleFileName()目的是得到本程序的路径。

添加到注册表的路径

使用system("pause")语句,因为需要管理员身份运行编译后的可执行文件,函数RegSetValueEx才能执行成功。也就是,编译完后,用管理员身份执行程序,没有这条语句的话便不能观察到运行结果,这样做的目的是方便观察。

写入项目

关闭注册表

注意这里用管理员身份运行程序,发现执行成功。并且在注册表中发现了新添加的项目。

HKEY_LOCAL_MACHINE根键自启动项目的查询

前面几步和启动过程差不多,但是这里的RegQueryValueEx()函数传递的参数为:   hkey,"test",NULL,NULL,(LPBYTE)file,&lpdword。

找到则输出文件所在路径,

查看运行结果:

1、进入注册表,如下图,可以看到‘test”的数据为:

C:\Users\曾盈\Desktop\1.exe,程序执行结果和注册表查询结果一致。

源代码

添加

#include <stdio.h>

#include <windows.h>

int main()

{

       char file[100];//存放本程序的路径

       GetModuleFileName(NULL,file,100);//得到本程序的路径

       LPCTSTR regname = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";

       // LPCTSTR:指向常量字符的长指针,这里指向自启动添加到注册表的路径

       HKEY hkey;

       LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regname,0,KEY_ALL_ACCESS|KEY_WOW64_64KEY,&hkey);

       //使用参数"KEY_ALL_ACCESS|KEY_WOW64_64KEY",因为操作位数不同。

       if(ret == ERROR_SUCCESS)

              printf("成功打开注册表编辑器!\n");

       else

              printf("未打开注册表编辑器,错误代码:%d\n",ret);

       system("pause");

     /*使用该语句,因为需要管理员身份运行编译后的可执行文件,函数RegSetValueEx才能执行成功。

       也就是,编译完后,用管理员身份执行程序,没有这条语句的话

       便不能观察到运行结果,这样做的目的是方便观察。

       */

       ret = RegSetValueEx(hkey, "test", 0, REG_SZ,(BYTE *)file, strlen(file)+1);

       //将项目文件放到本程序路径中

       if(ret == ERROR_SUCCESS)

              printf("成功创建项目 'test' \n");

       else

              printf("创建项目失败!错误代码:%d\n",ret);

       RegCloseKey(hkey);//关闭注册表

       system("pause");

      

       return 0;

}

查询

#include <stdio.h>

#include <windows.h>

#define buff 200

int main()

{

       char file[buff];//file,用于接收该数据的缓冲区的指针

       DWORD lpdword = buff;

       LPCTSTR regname = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";

       HKEY hkey;

       LONG ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,regname,0,KEY_READ|KEY_WOW64_64KEY,&hkey);

       if(ret == ERROR_SUCCESS)

              printf("成功打开注册表编辑器!\n");

       else

              printf("未打开注册表编辑器,错误代码:%d\n",ret);

       ret = RegQueryValueEx(hkey,"test",NULL,NULL,(LPBYTE)file,&lpdword);

       /*

       查找与hkey关联名称为"test"的数据

       最后一个参数指向的缓冲区的大小(以字节为单位)

       */

      if(ret == ERROR_SUCCESS)

             printf("%s\n",file);

       else

             printf("RegQueryValueEx()函数失败!错误代码:%d\n",ret);

       RegCloseKey(hkey);//关闭注册表

       return 0;

}

这篇关于HKEY_LOCAL_MACHINE根键自启动项目的添加和查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_51782199/article/details/129526863
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/164273

相关文章

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu