Window注册表的学习记录
注册表的结构:
概述:注册表是一种树状结构,在很早之前是系统的其他配置信息存放的文件,通常以.ini结尾的文件,因为数量太多不方便管理,后来就整合在一起形成了注册表。你可以按住键盘win+r,然后输入regedit,回车之后打开自己电脑中自带的注册表。如果没有打开,请跳到文章最后,有解决方法。
可以看到如下内容:
根键:以“HEKY_"开头,通常情况下有5大主键,分别如下:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_CURRENT_CONFIG
子键:任一键的子目录都叫做子键,子键是相对来说的
键值:包含键值名,键值类型,数据。是真正存放了计算机及应用程序的配置信息的地方,位于树状结构的叶子节点。键值类型有如下几种:
REG_DWORD DWORD值
REG_BINARY 二进制值
REG_SZ 字符串
REG_MULTI_SZ 多字符串
REG_EXOEND_SZ 可扩展字符串
注册表文件存储位置:
注册表以文件的形式分别存储在:WINDOWS/system32/config文件夹下的”DEFAULT“,”SAM”,“SECURITY",”SOFTWARE",“SYSTEM"五个文件中
五大根建详解:
1.HKEY_CLASSES_ROOT
存放windows中所有数据文件的信息,主要存储不同文件后缀和应用程序间的映射关系,使用户在双击打开文件时,可以找到正确的应用程序。简单来说,就是为了确保我们认知中后缀名内涵的正确性,例如,我们有一个.mp4后缀的文件,我们知道是视频文件,所以电脑就应该以”视频“的形式打开,而不是文本的形式。此外,该根建中的内容与HKEY_LOCAL_MACHINE\Software\Classes中的内容相同
2.HKEY_CURRENT_USER
存储了有关当前登录用户的配置信息。例如,当前用户的键盘,鼠标,声音,显示等的配置信息。比较重要的子键如下:
Software:包含所有已安装软件的信息
Control Panel:用于保存某些Control Panel小应用程序的配置信息,例如附件,外观,鼠标,键盘等设置
3.HKEY_LOCAL_MACHINE
存放控制系统和软件的设置(针对所有登录到该系统的用户),比较重要的子键如下:
HARDWARE:包含系统当前使用的各种硬件信息
SAM:包含所有用户的自定义信息
SECURITY:包含安全设置信息,包括存入缓存的登录,策略,特殊支持账户等
SOFTWARE:包含所有组件和软件的信息,如各个软件被执行时的初始状态以及上次退出时的状态
SYSTEM:包括系统的定义,移动设备以及系统设置等配置信息
4.HKEY_USERS
包含了所有用户的配置文件,每个用户在这里都有独立的配置文件
5.HKEY_CURRENT_CONFIG
包含了系统在启动时需要的硬件的配置信息
使用代码调用windows的api去操作注册表
from winreg import * def printNets(): net = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkList\\Signatures\\Unmanaged" key = OpenKey(HKEY_LOCAL_MACHINE, net) #打开该目录,返回所有句柄 print('test:') count = 0 while True: try: guid = EnumKey(key, count) #枚举每个句柄,返回该句柄的键 netKey = OpenKey(key, str(guid)) # 枚举打开注册表项的值,并返回一个元组,第一个参数为键,第二个参数为索引 (n, addr, t) = EnumValue(netKey, 5) #获取DefaultGatewayMac的数据,即获取该wifi的mac地址,返回为十六进制 (n, name, t) = EnumValue(netKey, 4) #获取FirstNetwork的数据,即获取wifi的名称 #判断是否有mac地址 if addr: macAddr = val2addr(addr) else: macAddr = 'None' netName = str(name) print('[+]' + netName + ' ' + macAddr) CloseKey(netKey) #获取一个句柄内容后,关闭句柄 count += 1 except OSError: #如果没有可迭代的内容就结束循环 break #对句柄下的mac地址数据,以常见的形式返回 def val2addr(val): addr = "" #print(val.hex()) n = 0 for i in val.hex(): addr += '{}'.format(i) n += 1 if n%2 == 0: addr += ':' return addr.rstrip(':') def main(): printNets() if __name__ == "__main__": main()
上述代码作用:获取使用该电脑连接过的所有wifi的mac地址
解决调用系统api库权限不够报错问题:
报错问题:PermissionError: [WinError 5] 拒绝访问。
解决方法:如果使用pycharm执行脚本的话,在打开pycharm时使用管理员方式打开,如何操作?选中pycharm,单击右键就可以看到有”以管理的方式打开pycharm“
此外,你也可以通过dos命令窗口执行脚本,同样使用管理的方式打开dos命令窗口。
解决使用regedit命令找不到注册表问题:
被禁用了,按照如下方式来查看是否是被禁用了,以及如何修改。
1.按快捷键win+r,打开运行对话框。
2.输入gpedit.msc,然后点击确定,打开组策略管理。
3.在面板中找到用户配置下的管理模板,双击打开。在界面的右侧找到系统,双击打开。
4.在系统中找到阻止访问注册表编辑工具,双击打开。
5.弹出的编辑器中,我们选择未配置,这样就关闭了禁用,然后重试一下即可打开注册表。
6.点击确定即可完成设置。按快捷键win+r,看看是否已经解决了问题。如果打开了注册表,说明问题解决。
解决使用gpedit.msc命令打不开组策略管理问题
1.新建一个txt文件,把以下内容写到里面,然后关闭文件,修改文件名后缀为.cmd
@echo off
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause
2.右键单击文件,以管理员身份运行,等待几秒就成功了。
3.验证成功,使用win+r,输入gpedit.msc确认后打开了组策略管理就说明成功
windows下显示文件名后缀:
打开任意一个文件夹,单击上方查看,勾选文件扩展名即可。
相关外链:
学习winreg库地址:winreg -Windows注册表访问权限 - Python 3.10 简体中文 - 多语言手册 - OULUB