Windous注册表+c#操作

news2024/11/18 11:35:30

下面将会分享注册表的基础知识及C# 读写注册表的方法

了解注册表

注册表(英语:Registry,中国大陆译作注册表,台湾、港、澳译作登录档)是Microsoft Windows操作系统和其应用程序中的一个重要的层次型数据库,用于存储系统和应用程序的设置信息。

早在Windows 3.0推出OLE技术的时候,注册表就已经出现。但是,从Windows 95开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。

前身

最初,Windows系统及应用程序的信息被存储在后缀名为ini的文本文件中,这就是注册表的前身。但是这么做有着致命弱点:因为每一个程序都会新安装一个或多个ini文件,来存储程序信息,导致信息的分布极为零乱;而且在16位系统下,ini文件的大小必须在64KB之内。所以ini文件被认为不便于使用和管理。

发布与发展

在最早出现于Windows 3.0的OLE技术出现后,微软为了存放系统中大量的软件组件信息,组织了一个reg.dat的数据库来存放这些信息。当时的注册表编辑器为16位版本的regedit.exe,功能较弱。

后来开发的Windows NT则更进一步使用相同的文件格式来存放系统的配置信息,以取代原有的ini文件。该系统为每一个用户在用户目录下创建了一个自身的注册表空间,而系统的设置被存放在系统文件夹中。由于Windows NT是一个32位操作系统,regedit.exe被升级为regedt32.exe,并增加了对权限的设置功能。

在Windows 95中,注册表首次得到广泛应用,逐渐淘汰了原有的ini文件。程序在安装时,不再将数据写入ini文件,而直接写入注册表。为了最大限度兼容旧程序,部分原来用于读写ini文件的专门API函数仍然可用,但现在是访问注册表(写入或读取)。Windows 95为了保持和Windows 3.x系列的兼容性,注册表的架构与Windows NT不同,为此专门开发了另一个32位版本的regedit.exe,它没有设置权限的功能。

在Windows 2000中,由于Windows 95家族已经深入人心,regedit.exe也得到广泛应用,相反regedt32.exe的界面相对比较丑陋,因此微软将windows 95系列的regedit.exe拿过来用。但由于移植过来的regedit.exe仍没有权限设置的功能,regedt32.exe仍然保留在系统中用作权限设置。

到Windows XP和Windows Server 2003中,regedit.exe已经增加了权限的功能,regedit32.exe由于失去作用而被剔除。同时,这个版本的注册表是64位的,这导致了一些兼容性问题,少数可以运行在旧版本Windows的程序在Windows XP中无法运作。

64位Windows的注册表

64位Windows中的注册表结构大致与32位版本相同,但32位程序的信息被放在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node而不是HKEY_LOCAL_MACHINE\SOFTWARE(64位程序的信息放于此处)。

数据结构

注册表由键(key,或称“项”)、子键(subkey,子项)和值项(value)构成。一个键就是树状数据结构中的一个节点,而子键就是这个节点的子节点,子键也是键。一个值项则是一个键的一条属性,由名称(name)、数据类型(datatype)以及数据(data)组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

在注册表编辑器(Regedit.exe)中,数据结构显示如下,其中,notepad++.exe键是App Paths键的子键,(默认)表示该值是默认值,值名称为空,其数据类型为REG_SZ,数据值为C:\Program Files (x86)\Notepad++\notepad++.exe

在这里插入图片描述

数据类型

请添加图片描述
此外,注册表还有其他的数据类型,但是均不常用:

REG_DWORD_BIG_ENDIAN - DWORD 的大头版本,下面同理
REG_DWORD_LITTLE_ENDIAN
REG_FULL_RESOURCE_DESCRIPTOR
REG_QWORD - DWORD 的四字(64 位)版本
REG_FILE_NAME

注册表的分支结构

在这里插入图片描述

注册表的存储位置

在这里插入图片描述
C:\WINDOWS\SYSTEM32\CONFIG

读写注册表

命名空间:using Microsoft.Win32;
创建注册表项:CreateSubKey(name)方法
添加SubKey时候首先要打开一个表项,并设置参数为true,才能成功创建子项

//给要创建的注册表设置一个变量,使用更方便
private string RegistFileName = "test";
/// <summary>
/// 创建一个test注册表项,下面包含OpenLog,和SaveLog两个子项
/// </summary>
private void CreateRegistFile()
{  //SOFTWARE在LocalMachine分支下    RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE",true);
    RegistryKey software = key.CreateSubKey(RegistFileName);
    RegistryKey test = key.OpenSubKey(RegistFileName,true);
    RegistryKey Savekey = test.CreateSubKey("SaveLog");
}


///删除注册表项:DeleteSubKey(name,true)方法
RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.OpenSubKey("SOFTWARE", true);
RegistryKey test = software.OpenSubKey(RegistFileName, true);
test.DeleteSubKey("SaveLog",true);



///添加键值:SetValue(name,value)方法

/// <summary>
/// 将path写入OPenLog子项
/// </summary>
private void writeToRegistFile(string path)
{  RegistryKey key = Registry.LocalMachine;  RegistryKey software = key.OpenSubKey("SOFTWARE", true);  RegistryKey test = software.OpenSubKey(RegistFileName, true);  RegistryKey OpenPath = test.OpenSubKey("OpenLog",true);  //"name"是该键值的name,相当于一个别名,可自行设置  OpenPath.SetValue("name", path);
}

///删除键值:DeleteValue(name)方法
RegistryKey key = Registry.LocalMachine;
RegistryKey software = key.OpenSubKey("SOFTWARE", true);
RegistryKey test = software.OpenSubKey(RegistFileName, true);
RegistryKey OpenPath = test.OpenSubKey("SaveLog",true);
//删除SaveLog子项下的名为SaveLog的子键
OpenPath.DeleteValue("name");

///判断注册表项是否存在:
// <summary>
/// 判断注册表项是否存在
/// </summary>
/// <returns>bool</returns>
private bool IsRegeditItemExist()
{
  string[] subkeyNames;
  RegistryKey key = Registry.LocalMachine;
  RegistryKey software = key.OpenSubKey("SOFTWARE");
  subkeyNames = software.GetSubKeyNames();
  //在这里我是判断test表项是否存在
  foreach (string keyName in subkeyNames)
  {
    if (keyName == RegistFileName)
    {
      key.Close();
      return true;
    }
  }
  key.Close();
  return false;
}

/// <summary>
/// 判断该路径是否已经存在
/// </summary>
/// <param name="path">路径</param>
/// <returns></returns>
private bool IsRegeditKeyExit(string name)
{string[] saveSubkeyNames;

    RegistryKey key = Registry.LocalMachine;
    RegistryKey software = key.OpenSubKey("SOFTWARE", true);
    RegistryKey test = software.OpenSubKey(RegistFileName, true);
    RegistryKey Savekey = test.OpenSubKey("SaveLog", true);

  //获取该子项下的所有键值的名称saveSubkeyNames 
    saveSubkeyNames = Savekey.GetSubKeyNames();
foreach(string keyName in openSubkeyNames)
    {
        if(keyName == name)
        {
            key.Close();
            return false;
        }
    }
    key.Close();
    return true;
}

///

如果有用请点赞关注收藏

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

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

相关文章

关于计算机网络,你需要知道的一些常识

最近闲着没啥事翻开之前大学时候谢希仁老师第7版的《计算机网络》这本书,结果发现了一些之前没有发现的常识。 首先是互联网与互连网的区别,一般我们常说的互联网是Internet,是指因特网,其起源于阿帕网ARPANT。或许很多读者看到这里就觉得有什么秘密可言,不都是常识了吗?看你大…

如何在Vue3+js项目(脚手架)中使用(下载安装及运行)element-plus以及解决使用过程中遇到的问题

文章目录 &#x1f4cb;前言 &#x1f3af;关于 ElementUI 框架描述 &#x1f9e9;设计原则 1️⃣一致 Consistency 2️⃣反馈 Feedback 3️⃣效率 Efficiency 4️⃣可控 Controllability &#x1f9e9;环境支持 &#x1f3af;安装element-plus &#x1f9e9;遇到的问…

【随笔】博客质量分计算,如何让自己的博客脱颖而出,也许文章能够给你答案

作者&#xff1a;小5聊 简介&#xff1a;一只喜欢全栈方向的程序员&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff0c;尽绵薄之力答疑解惑&#xff01; 公众号&#xff1a;有趣小馆&#xff0c;一个有趣好玩的关键词回复互动式公众号&#xff0c;欢迎前来体验 1、…

TSF微服务治理实战系列(四)——服务安全

一、导语 **道路千万条&#xff0c;安全第一条。治理不规范&#xff0c;老板两行泪”。**当企业从单体架构逐渐转向微服务架构时&#xff0c; 服务安全 的需求也随之分散到了整个微服务体系的各个部分中。这就需要构建一套配置活、成本低的安全防控体系&#xff0c;覆盖请求链…

基于javaweb(springboot)城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文…

日志门面和日志框架(SpringBoot日志实现)

一、Springboot日志实现简介 SpringBoot是现今市场上最火爆用来简化spring开发的框架&#xff0c;springboot日志也是开发常用的日志系统。SpringBoot默认就是使用SLF4J作为日志门面&#xff0c;Logback作为日志实现来记录日志。 二、application.yml修改日志相关的配置 appl…

Spring入门-IOC/DI相关配置与使用(1)

文章目录Spring入门1&#xff0c;Spring介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.…

修改RT-Thread 的启动流程,实现显式调用rtthread_startup

一、STM32 单片机的启动流程 单片机上电后&#xff0c;会首先执行定义在startup 文件 中的Reset_Handler 函数&#xff0c;Reset_Handler 函数会首先执行SystemInit 函数&#xff0c;执行完之后&#xff0c;再执行我们常见的main 函数。 二、RT-Thread 启动函数是怎么被调用的…

什么是最少知识原则?-外观模式

外观模式将一个或数个类的复杂的一切都隐藏在背后&#xff0c;只显露出一个干净美好的外观。 构建自己的家庭影院 //打开爆米花机&#xff0c;开始爆米花 popper.on(); popper.pop();//调整灯光亮度 lights.dim(10);//把屏幕放下 screen.down();//打开投影仪 projector.on();…

【阶段三】Python机器学习32篇:机器学习项目实战:关联分析的基本概念和Apriori算法的数学演示

本篇的思维导图: 关联分析模型:Apriori算法 关联分析的基本概念和Apriori算法 关联分析是数据挖掘中一种简单而实用的技术,它通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象同时出现的模式和规律。例如,对超市购物的数据进行关联…

缓存Cache-Control

可缓存性指定哪些地方可以缓存publichttp请求返回的过程中&#xff0c;http请求返回的内容所经过的任何路径包括&#xff1a;中间的代理服务器&#xff0c;发出请求的客户端浏览器&#xff0c;都可以对返回的内容进行缓存。private发起请求的浏览器可以缓存。no-cache任何节点都…

【程序员高效率工具】PlantUML —— 使用代码快速绘制时序图、思维导图

本篇思维导图 前言 不管是在工作还是学习&#xff0c;特别是在项目计划初期&#xff0c;我们需要画大量的图将工作内容、项目方案等进行可视化描述&#xff0c;包括但不限于时序图、类图、思维导图等等。 但是对于不经常画图&#xff0c;或者经常使用键盘的孩子&#xff0c;手…

VMware三种网络模式的摸索

VMware三种网络模式的摸索 文章目录VMware三种网络模式的摸索前言一、桥接模式简要描述拓扑图展示配置测试优缺点二、NAT模式简要描述拓扑图展示配置测试优缺点三、仅主机模式简要描述拓扑图展示配置测试优缺点3.总结前言 注意&#xff1a;所有的测试请关闭虚拟机和主机的防火…

微信小程序 - 实现手机号登录--授权并获取手机号保存至本地

详细代码请见文档最下方&#xff0c;仅供参考&#xff0c;更多需要请查看官方文档 一、 微信官方文档 | 获取手机号 这是服务端的 这是我们前端获取手机号需要给接口传递的两个参数 注意&#xff1a; 参数一&#xff1a;获取access_token需要用到小程序密钥&#xff0c;这个…

你可能不知道的20个Git命令,但真的很实用

如果您曾经浏览过git 手册&#xff08;或 run man git&#xff09;&#xff0c;那么您会注意到 git 的功能比我们大多数人每天使用的要多得多。很多这些命令都非常强大&#xff0c;可以让你的生活更轻松&#xff08;其他命令有点小众&#xff0c;但仍然很高兴知道&#xff09;。…

QT-QStackedWidget多窗口应用

前言&#xff1a; 多窗口应用&#xff0c;例如某微信&#xff0c;页面由1&#xff0c;2&#xff0c;3个布局组成。 1-基本流程 页面1控制页面2&#xff0c;通过选择页面1上的按钮或控件 页面2控制页面3&#xff0c;通过选择页面2上的按钮或控件 2-其中页面2中的页面很…

100、【树与二叉树】leetcode ——105. 从前序与中序遍历序列构造二叉树+106. 从中序与后序遍历序列构造二叉树(C++版本)

106. 从中序与后序遍历序列构造二叉树 题目描述 原题链接&#xff1a;106. 从中序与后序遍历序列构造二叉树 解题思路 中序的特点&#xff1a;左中右&#xff0c;后序的特点&#xff1a;左右中。因此可通过后序序列找到中间结点&#xff0c;然后再根据中间结点&#xff0c;分…

3、关键词与标识符

目录 一、关键词 二、标识符 一、关键词 C语言中有32个关键字&#xff1a; 注意&#xff1a;在C语言中&#xff0c;关键字是不允许作为标识符出现在程序中的。 二、标识符 C语言标识符的命名规则&#xff1a; &#xff08;1&#xff09;所有标识符必须由字母或下画线开头…

KMP算法 看这一篇就够了 图解刨析+代码

目录 问题背景 逐步剖析 KMP如何优化暴力做法 思考 公共前后缀 next数组 如何构建next数组: 代码实现 问题背景 给定一个字符串 S&#xff0c;以及一个模式串P&#xff0c; P 在字符串 S 中多次作为子串出现。 求出模式串 P 在字符串 S 中所有出现的位置的起始下标。 …

说话人识别中的Temporal pooling(时序池化)

概述 Temporal pooling&#xff08;时序池化&#xff09;是说话人识别神经网络中&#xff0c;声学特征经过frame-level变换之后&#xff0c;紧接着会进入的一个layer。目的是将维度为(bs,F,T)(bs,F,T)(bs,F,T)的特征图&#xff0c;变换成维度为(bs,F)(bs,F)(bs,F)的特征向量 …