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

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再