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根键自启动项目的添加和查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/164273

相关文章

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析