ImageVerifierCode 换一换
格式:DOCX , 页数:85 ,大小:86.45KB ,
资源ID:5616588      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5616588.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(注册表编程技术.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

注册表编程技术.docx

1、注册表编程技术Some Tips for Registry Programming作者:osmose(ph4nt0m)来源:幻影旅团()& 补天网() EMAIL:osmose2003.7.18写在前面的话不敢给这篇文章起个太大的名字,毕竟这只是我这一段时间学习心得的一点总结,顶多仅仅是一些tips而已。其实我什么都不懂,所以我尽量写的详细,希望大家不要厌烦。注册表编程其实并不是一件困难的事情,如果看一点材料,查一查msdn,本可以很快掌握。我在网上搜索了一下,发现很多高手提供的只是MFC的一个关于注册表的类,都很泛泛,真正的代码还需要自己添加。对于像我一样急功近利,希望一口吃成胖子的菜鸟们,

2、如果很快上手是大家最关心的问题。说实话,我没有找到一个比较详细的说明,所以我开始写这篇文章,手边有的就是一个API函数表和MSDN。在此感谢CSDN上各位大牛(Skt32(Skt32), shilong(星矢诗龙) ,firela(firela) ,laolaoliu2002(老刘)等)对我的指点,那里也许是一个对程序爱好的人最应该去的地方之一。也感谢幻影旅团的各位弟兄的帮助,那是一个只关心技术的地方。或许这些知识都很浅显,但是我们在学习。这篇文章最初的目的是写出一些属于自己的程序,或许适合热衷于开启别人机器某个服务的人,学会编写一些程序操作注册表,也许就不用总等着拾人牙慧了。随着点滴的积累,

3、逐渐觉得有更多的东西可以深挖或者涵括,于是就有了这篇整理的总结。我从自己学习的角度,对遇到的困难尽可能的分析,给出结果。但是文中仍然遗留了一些问题无法解决。如果您有什么建议,欢迎指正。BTW: 文中的程序如无特殊说明,都是支持MFC的。新建项目时请注意。第一章 概述先让我们活动一下脑筋,想想看要修改或者保存注册表,有哪些途径?1在windows下面打开运行窗口(按住win键和r键),输入regedit,OK,在FILE菜单里有导入导出,保存什么,修改什么,不多说了。2 到古老的DOS方式,让我们重新幼稚一下。(下面的内容前人已经写过多次,抄过来用一下,像前辈们致敬!) 在DOS提示符下键入Re

4、gedit命令,将出现一个帮助屏幕。此屏幕给出了其命令行参数及其使用方法。 语法: Regedit /L:system /R:user filename1 Regedit /L:system /R:user /C filename2 Regedit /L:system /R:user /E filename3 regpath 其中: /L:system 指定system.dat文件的存放位置。 /R:user 指定user.dat文件的存放位置。 filename1 指定引入注册表数据库的文件名。 /C filename2 指定形成注册表数据库的文件名。 /E filename3 指定导出注册

5、表文件的文件名。 regpath 指定导出注册表文件的开始关键字(缺省为全部关键字) 现举几个例子说明regedit.exe在DOS下的使用方法。 【例1】 将系统注册表数据库registry导出到reg1.reg文件中。regedit /E reg1.reg 【例2】 reg1.reg形成系统注册表数据库registry(全部)中。 regedit /C reg1.reg 【例3】 将reg.dat引入系统注册表数据库中(部分)。 regedit reg.dat 【例4】 将CJH开始的关键字导出注册表数据库,并命名为cjh.reg。 regedit /E cjh.reg cjh【例5】 指

6、定system/dat存放在D:PWIN中和user.dat存放在E:PWIN中,将reg.dat数据文件形成一个新的注册表数据库registry。regedit /L:D:PWIN /R:E:PWIN /C reg.datDOS下的手段当然不止这些,如果想体验程序的感觉,还需要麻烦你看看批处理: echo off path=c:windows;c:windowscommand;c:dos cls echo 正在导出注册表regedit /E txt.reg HKEY_CLASSES_ROOTtxtfile echo. echo 注册表导出完毕!按任一键开始编辑注册表 echo. pause

7、edit txt.reg echo 正在将修改后的注册表导入 regedit txt.reg echo 恭喜您!在MS-DOS方式下成功修改了注册表! pause cls echo on把上面这段代码复制到一个.bat文件中,你可以用EDIT这个命令编辑。从某种意义上说,充分发挥EDIT编辑器的强大功能,我们可以在遵循导出的注册表文件的格式的前提下,对注册表进行随心所欲的修改、删除或者增加任一子键。如果觉得这还不够程序化,您可以发挥DOS环境下各种程序设计语言的优势,加上交互性的界面,将这一过程真正的程序化,应该丝毫不亚于Windows状态下的利用API函数做出来的效果。3在C程序中调用reg

8、edit命令,不要忘记C程序可以调用DOS命令的哟。记得加入#include DOS.h 这种方法和上面一种比起来换汤不换药,不多说了。3 MFC有专门操作注册表的库,据说很方便,我没有用过,因为我不会MFC,也许只是那几个类吧,也许有很多。没做过的东西,就不能说它简单。如果哪位高人研究过,请补充一下。4调用API函数。API函数是个好东西,VB, Delphi,BCB,什么都可以用它。有人建议最后学API,因为最难。是的,可是我急功近利,只学那几个注册表的函数,试试看能不能学到点什么。好了,上面是关于修改注册表的一些方法。下面让我们来看看注册表函数都有哪些。键管理类RegCloseKey()

9、RegCreateKey()RegCreateKeyEx()RegDeleteKey()RegDeleteKeyEx()RegOpenKey()RegOpenKeyEx()值管理类RegDeleteValue()RegQueryValue()RegQueryValueEx()RegSetValue()RegSetValueEx()查询计数类RegQueryInfoKey()RegEnumKey()RegEnumKeyEx()RegEnumValue()备份/恢复类RegLoadKey()RegReplaceKey()RegRestoreKey()RegSaveKey()实用类RegConnec

10、tRegistry()RegNotifyChangeKeyValue()RegUnloadKey()安全类(仅适用于NT)RegGetKeySecurity()RegSetKeySecurity()我会选其中的一部分作具体介绍,这个文章能写到什么地步,能不能全部写完,我也不知道,看大家的反映了。大家都知道,2001年微软停止开发win98系统内核,专攻NT,上面的一些函数还有专门服务于win3.1的,够古老的吧。比如,RegSetValueEx()和RegSetValue()有什么不同呢?前者可用于基于win32系统的应用开发。RegSetValue()则是服务于win3.1系统的。使用的时候

11、要注意:Windows NT: HKEY_PERFORMANCE_DATA Windows 95 and Windows 98: HKEY_DYN_DATA这两个子键是不一样的,虽然其他的都一样(HKEY_CLASSES_ROOT,EY_CURRENT_CONFIG,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS)不要误会,这两个函数都可以用在95,98系统上,具体什么差别呢,看看MSDN的话:Win32-based applications should use the RegSetValueEx function, which allows

12、you to set any number of named values of any data type.(基于win32的应用程序推荐使用RegSetValueEx函数,可以对设置任意类型任意键名任意值。)所以,以后有带Ex的函数,我们尽量都用它啦。OK,第一部分先写到这里。第二部分,我会给出一个完整的例子,如何保存注册表里任意一个键和他的所有子键,里面涉及到一些权限的问题,调用了一些API函数获得操作注册表的权限。第三部分,引用并且分析MSDN中的一个例子,通过注册表列举函数保存HKEY_LOCAL_MACHINE这样一个大键。第四部分是关于修改注册表键值,也有一个具体的例子,同时可能

13、会谈到一点创建子键的问题,希望让大家都能看得轻松一点。我会结合MSDN中的解释尽量把每一个函数讲清楚,至少是我遇到的问题都说清楚。第二章 保存注册表的特定键这一部分,我们来看看如何保存注册表里任意一个键以及它的所有子键。所需要用到的函数是RegOpenKeyEx,RegSaveKey和RegCloseKey。看他们的名字,你也可以看出来他们是做什么用的。RegOpenKeyEx负责打开指定的键。在后文,也许我们会用到另一个函数打开某个特定的键:RegCreateKeyEx。这里先把他们做一个比较:这两个函数都适用于基于win32的应用程序,都可以打开指定子键。所不同的是,当指定子键不存在时,R

14、egCreateKeyEx会自动生成这个键,而RegOpenKeyEx仅仅是负责打开。如果指定键不存在,RegOpenKeyEx返回失败信号。下面,让我们看看具体的操作:LONG RegOpenKeyEx( HKEY hKey, / 用于打开键的句柄 LPCTSTR lpSubKey, / 储存打开子键名称的变量的地址 DWORD ulOptions, / 保留值 REGSAM samDesired, / 访问形式 PHKEY phkResult / 句柄的地址);这个函数是一个long型函数,如果执行成功,会返回ERROR_SUCCESS。为了大家看得明白,我把每个变量都解释一下,磨刀不误砍

15、柴工。HKEY hKey: 这个句柄其实就是下面几个东西里的一个,打开注册表,大家对他们都不陌生吧。HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSWindows NT: HKEY_PERFORMANCE_DATA Windows 95 and Windows 98: HKEY_DYN_DATALPCTSTR lpSubKey:LPCTSTR是一个指向字符串常量的一个32位指针类型,字符可以是Unicode和DBCS。lpSubKey里可以放指针,也可以用变量,就像本文所用的。DW

16、ORD ulOptions:这个没什么好说的,保留值,永远都是0,如果你想要继续干活的话。REGSAM samDesired:访问形式,可以有下面几个值:ValueMeaningKEY_ALL_ACCESS包括 KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK和KEY_SET_VALUE.KEY_CREATE_LINKPermission to create a symbolic link.(我不太明白)KEY_CREATE_SUB_KEY可以生成子键KEY_ENUM

17、ERATE_SUB_KEYS可以枚举子键KEY_EXECUTE可读KEY_NOTIFYPermission for change notification.(也不太明白,没用过)KEY_QUERY_VALUE可查询键值KEY_READ包括KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS和KEY_NOTIFY.KEY_SET_VALUE可改变键值KEY_WRITE包括KEY_SET_VALUE 和KEY_CREATE_SUB_KEY.PHKEY phkResult:函数生成的指向打开键的一个句柄,后面的RegSaveKey函数就要用到它。使用完毕后,我们需要用Reg

18、CloseKey回收。解释完了RegOpenKeyEx函数,让我们看看如何回收句柄RegCloseKey:LONG RegCloseKey( HKEY hKey / 需要回收的句柄,就是上文的“PHKEY phkResult”);如果函数执行成功,返回值也是ERROR_SUCCESS。另外一个回收句柄的函数是RegFlushKey。退出前,RegFlushKey会往注册表里写一些信息,这个步骤可能会需要好几秒,机器需要完成一个从内存写入硬盘的过程,同时,这个函数会占用大量的系统资源,非必要时不要使用。RegCloseKey则是一个退出迅速的家伙,不会拖泥带水,“我们一直都用它”:D现在你可能对

19、打开一个键和关闭一个键都有点了解了,下面是操作的重点,打起精神来吧:)LONG RegSaveKey( HKEY hKey, / 所要备份键的句柄 LPCTSTR lpFile, / 储存文件的指针 LPSECURITY_ATTRIBUTES /生成文件的安全权限);HKEY hKey:就是我们用RegOpenKeyEx得到的那个新句柄。LPCTSTR lpFile:这个函数把一个键和他的所有子键存储到一个文件中,这里的lpFile代表文件名的变量的地址,不过你也可以直接把文件名放在这里,我会show给你看的。LPSECURITY_ATTRIBUTES:这个东西说来话长,MSDN专门开了一页解

20、释SECURITY_ATTRIBUTES这个东西,感兴趣的朋友可以自己看看,我们这里用得很简单,NULL就可以了。使用NULL意味着生成文件遵从默认的安全准则。好了,呼出一口气,枯燥的教条终于完了。也许你已经跃跃欲试了。好,就让我们写一个简单的程序。测试条件:VC6.0,WindowXP Prefessional,登陆账号:管理员(这个条件后面会提到)#include stdafx.h#include windows.h#include stdio.h#include stdlib.hvoid main() CString strKey=SoftwareMicrosoftInternet Ex

21、plorerMain; LPTSTR szSaveFileName; HKEY hResult; szSaveFileName=LPTSTR(1.dat); /要保存的文件名 RegOpenKeyEx(HKEY_CURRENT_USER,(LPCTSTR)strKey,0,KEY_ALL_ACCESS,&hResult); /获得句柄 RegSaveKey(hResult, szSaveFileName, NULL); /保存键值 RegCloseKey(hResult); /释放句柄没错就是这么简单,如果你仔细阅读了上面的讲解,看懂这一段一定没有问题。编译通过,没有问题。以后就可以这样照葫芦

22、画瓢了。你要做的只是把CString strKey=SoftwareMicrosoftInternet ExplorerMain和RegOpenKeyEx里的“HKEY_CURRENT_USER”换成你要保存的键就可以了。运行吧,你会看到当前目录下生成了一个1.dat文件。成功了?仔细看看文件大小。0 K?!怎么回事?一定是哪里出了错误。我们一共就调用了三个函数,是哪一个出错了呢?加入一些语句调试一下。#define ERROR1 11#define ERROR2 22#define ERROR3 33#define SUCCESS 44 if (RegCreateKeyEx(HKEY_LOC

23、AL_MACHINE, (LPCTSTR)strKey,0,NULL,REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY|KEY_WRITE|KEY_READ,NULL,&Result,NULL)!=ERROR_SUCCESS) coutError Opening Register.n; return ERROR1; if(RegSaveKey(Result,szSaveFileName, NULL)!=ERROR_SUCCESS) coutError saving Register.n; return ERROR2; RegCloseKey(Result)

24、;return SUCCESS;注意,这里我换用了RegCreateKeyEx这个函数,只是想show一下这个函数的用法。大家可以跳过去,或者依然是用RegOpenKeyEx。最后发现,在调用RegSvaeKey的时候出错了。所有的这一些都是按照MSDN上的指示一步步来的,语法也没有问题,那会是哪里的原因呢?我在RegSaveKey后面使用了一段测试代码,发现运行的时候,系统提示没有权限备份注册表。请注意,我可是用管理员的身份登陆XP的真正的原因我们还是要去权限里找(在MSDN里搜索Windows NT Privileges,可以看到相关的东西)。这里简单说一下,在NT/2K/XP下失败的原因

25、是没有SE_BACKUP_NAME权限。我们需要加入下面一段代码(基本功能是开一个线程申请权限,具体的恕不多介绍了,以后大家只要直接加入就可以了)。 HANDLE hToken; TOKEN_PRIVILEGES tkp;if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken) return; LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&tkp.Privileges0.Luid); tkp.PrivilegeCount=1; tkp.Priv

26、ileges0.Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);好了,大家辛苦了。完整的程序如下:#include stdafx.h /请千万不要忘记#include windows.h /这两个头文件#include stdio.h#include stdlib.hvoid main() CString strKey=SoftwareMicrosoftInternet ExplorerMain; LPTSTR szSaveFileName

27、; HKEY hResult; / 申请备份权限 HANDLE hToken; TOKEN_PRIVILEGES tkp; if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken) return; LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&tkp.Privileges0.Luid); tkp.PrivilegeCount=1; tkp.Privileges0.Attributes=SE_PRIVILEGE_ENABLED; AdjustTo

28、kenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);/开始备份工作 szSaveFileName=LPTSTR(1.dat); RegOpenKeyEx(HKEY_CURRENT_USER,(LPCTSTR)strKey,0,KEY_ALL_ACCESS,&hResult); RegSaveKey(hResult,szSaveFileName, NULL); RegCloseKey(hResult);好了,到目前为止,我们已经学会了如何备份一个子键。可是如何备份整个HKEY_CURRENT_USER乃至于整个注册表呢?这是我

29、们第三部分的内容。下一讲我们将会学到如何枚举所有的子键,并且结合MSDN上的一个例子,给大家做一个分析,同时也对这一讲的内容作一个复习。Thank you so much for reading this article.=附录:测试出错的代码: long t=RegSaveKey(Result,szSaveFileName, NULL); LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NUL

30、L, t, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), / Default language (LPTSTR) &lpMsgBuf, 0, NULL );AfxMessageBox( (LPCTSTR)lpMsgBuf);LocalFree( lpMsgBuf );第三章 保存整个注册表PART I 一个MSDN上的例子上次我们学习了如何保存一个子键以及其所有从属子键。不过,你有没有想过要备份整个HKEY_LOCAL_MACHINE这个根键或者整个注册表五个根键呢?上一次的方法如果你试试看,就会发现不适用了,呵呵。今天我打算结合MSDN上的一个例子谈一谈远程备份注册表的问题。学会远程备份,结合下一次的内容(修改注册表),大家可能自己就能够写程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1