利用VB.NET访问注册表
创新互联于2013年开始,先为天祝藏族自治等服务建站,天祝藏族自治等地企业,进行企业商务咨询服务。为天祝藏族自治企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
译者注:访问注册表的例子比较多,然而通过VB.NET访问注册表的例子并不多,本文翻译了一篇MSDN上的利用VB.NET存取注册表的例子,挺详细也挺全面的。
(
)
Cat
Francis
Visual
Studio
Team
Microsoft
Corporation
April
2002
摘要:这篇文章描述了利用VB.NET内置函数DeleteSetting,
GetAllSettings,
GetSetting
和
SaveSetting,以及通用语言运行时的两个类Registry
和
RegistryKey来存取注册表的实例,详述了所需的权限,解释了何时利用注册表编辑器,并向你展示了如何利用程序从注册表中动态的读取数据及如何写入数据。
引言
当用VB.NET进行编程时,你可能会选择用VB.NET或.NET框架中的Registry类中的函数来访问注册表。虽然大多数情况下VB.NET的内置函数足够用了,然而某些情况下你仍然需要.NET框架类来解决问题。
注册表不仅存储了本地机上一些程序的信息,还保存了操作系统的信息。操作注册表可能会有危险。因此编程时必须谨慎的查看代码,确保程序对所运行的机器上的安全不会构成威胁。
注册表入口点包括两部分:键名和键值。入口点是存储在系统中的键和子键,类似于文件系统中的目录和子目录。
必备知识
要想读懂本文需要有如下的必备知识:
1、熟悉上一个版本的Visual
Basic。
2、注册表设计和利用的知识。
3、理解访问注册表的安全含义。
用VB.NET内置函数访问注册表
VB.NET提供了四个访问注册表的函数,为了使用它们,首先必须有读写权限。任何运行在全信任模式下的代码都必须有访问注册表的必要的权限。可以查看RegistryPermission类从而
Sub Button1Click(sender As Object, e As EventArgs)
'HKEY_CLASSES_ROOT\.doc
Dim Root1 As RegistryKey = Registry.ClassesRoot
'打开"SYSTEM"子健
Dim key1 As RegistryKey = Root1.OpenSubKey ( ".doc" ,true )
'打开".doc"子健
textBox1.Text =key1.GetValue(String.Empty)
End Sub
的完整路径写在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
就可以自启动了。
以下是我前一段时间写的防u盘自动运行的程序,里面可以找到如何操作注册表。
Option Explicit
Global Const REG_SZ As Long = 1
Global Const REG_DWORD As Long = 4
Global Const HKEY_CLASSES_ROOT = H80000000
Global Const HKEY_CURRENT_USER = H80000001
Global Const HKEY_LOCAL_MACHINE = H80000002
Global Const HKEY_USERS = H80000003
Global Const ERROR_NONE = 0
Global Const ERROR_BADDB = 1
Global Const ERROR_BADKEY = 2
Global Const ERROR_CANTOPEN = 3
Global Const ERROR_CANTREAD = 4
Global Const ERROR_CANTWRITE = 5
Global Const ERROR_OUTOFMEMORY = 6
Global Const ERROR_INVALID_PARAMETER = 7
Global Const ERROR_ACCESS_DENIED = 8
Global Const ERROR_INVALID_PARAMETERS = 87
Global Const ERROR_NO_MORE_ITEMS = 259
Global Const KEY_ALL_ACCESS = H3F
Global Const REG_OPTION_NON_VOLATILE = 0
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hkey As Long) As Long
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hkey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hkey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Long, lpcbData As Long) As Long
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hkey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, ByVal cbData As Long) As Long
Private Sub cmdAbout_Click()
MsgBox "作者wolfccb不对本软件可能造成的任何错误或损失负责,请自行承担使用风险。", vbInformation, "About"
End Sub
Private Sub cmdDefault_Click()
Check0.Value = 1
Check1.Value = 0
Check2.Value = 1
Check3.Value = 0
Check4.Value = 1
Check5.Value = 0
Check6.Value = 0
End Sub
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdRecommend_Click()
Check0.Value = 1
Check1.Value = 1
Check2.Value = 1
Check3.Value = 1
Check4.Value = 1
Check5.Value = 0
Check6.Value = 1
End Sub
Private Sub cmdSet_Click()
Dim hkey As Long
Dim lvalue As Long
Dim cddata As Long
Dim retval As Long
lvalue = GetValue
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", 0, KEY_ALL_ACCESS, hkey)
retval = RegSetValueEx(hkey, "NoDriveTypeAutoRun", 0, REG_DWORD, lvalue, 4)
RegCloseKey hkey
If retval = 0 Then
MsgBox "设置已保存。", vbInformation, "提示"
Else
MsgBox "保存失败,错误代码:" + CStr(retval), vbExclamation, "错误"
End If
End Sub
Private Sub Form_Load()
Dim hkey As Long
Dim lvalue As Long
Dim cddata As Long
Dim retval As Long
retval = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\Explorer", 0, KEY_ALL_ACCESS, hkey)
If retval 0 Then
MsgBox "打开注册表失败,错误代码:" + CStr(retval), vbExclamation, "错误"
End If
retval = RegQueryValueEx(hkey, "NoDriveTypeAutoRun", 0, REG_DWORD, lvalue, 4)
RegCloseKey hkey
If retval 0 Then
MsgBox "读取注册表失败,错误代码:" + CStr(retval), vbExclamation, "错误"
End If
ShowCheck (lvalue)
End Sub
Private Sub ShowCheck(lvalue As Long)
Check0.Value = lvalue Mod 2
lvalue = (lvalue - Check0.Value) / 2
Check1.Value = lvalue Mod 2
lvalue = (lvalue - Check1.Value) / 2
Check2.Value = lvalue Mod 2
lvalue = (lvalue - Check2.Value) / 2
Check3.Value = lvalue Mod 2
lvalue = (lvalue - Check3.Value) / 2
Check4.Value = lvalue Mod 2
lvalue = (lvalue - Check4.Value) / 2
Check5.Value = lvalue Mod 2
lvalue = (lvalue - Check5.Value) / 2
Check6.Value = lvalue Mod 2
End Sub
Private Function GetValue() As Long
GetValue = Check0.Value + Check1.Value * 2 + Check2.Value * 4 + Check3.Value * 8 + Check4.Value * 16 + Check5.Value * 32 + Check6.Value * 64 + 128
End Function
以上。
饿的老狼
我来告诉大家什么是纯绿软件--(希望无知者不要再胡说八道了)
有人说:
还有哪些所谓写绿色软件的人是不懂windows编程,根本就写不出注册的过程。所以自我安慰的叫绿色软件。不知大家注意没有绿色软件是不可以在天加删除中删掉的。只要它运行就会产生很多拉圾,而且是到处乱放,这就是为什么容易出问题的原因所在。
我只能说,这样说话的人是个电脑肓。
或是根本不懂得绿色软件的含义。
绿色软件有如下严格特征:
1、不对注册表进行任何操作(或只进行非常少的,一般朋友能理解的操作,典型的是开机起动。少数也进行一些临时操作,一般在程序结束前会自动清除写入的信息)。
2、不对系统敏感区进行操作,一般包括系统起动区根目录、安装目录(windows目录)、程序目录(Program Files)、帐户专用目录。
3、不向非自身所在目录外的目录进行任何写操作。
4、因为程序运行本身不对除本身所在目录外的任何文件产生任何影响,所以,根本不存在安装和卸载问题。
5、程序的删除,只要把程序所在目录和对应的快捷方式删了就可以了(如果你手工在桌面或其它位置设了快捷方式),只要这样做了,程序就完全干净地从你的电脑里删去了,不留任何垃圾。
以上就是绿色软件的特征。
对于编程人员来说,做一个绿色软件不难,做一个非绿色软件也不难,但是为什么那么多软件不做成绿色的呢?下面作一些讲解:
一、大型软件公司的大型软件为什么不做成绿色的:
1、大型软件公司并非没有能力做出绿色软件,但它们的软件涉及的方面过多,需要对系统原有的一些设置进行改动,以使电脑按照软件设计要求进行操作。以PhotoShop为例,它就需要在注册表里添加很多种格式文件的默认打开方法为PhtoShop.exe,以便大家双击此类文件后就自动打开PhotoShop以便编辑。
2、为了更好的为一些对电脑知识不是很了解的朋友进行一些自动设定。还是以PhotoShop为例,这儿已经有朋友发布了解压即可用的,但是,还是不少的朋友,连解压也不会,解压后都不知道点哪个文件开始正常运行,也不知道怎么在桌面上建快捷方式。就算别人为他做完了上面的事,要是有一天,他不想要PhotoShop了,也不知道原来安装的程序在哪个目录,怎么删去,甚至不知道如何删除快捷方式,更别说如何完全干净的删除了。做成安装版就可以自动为使用者完成上面的事了。
(特别说明:上面对PhotoShop的举例,只是用它来举例罢了,其实网上流行的解压即可用的PhotoShop也不是严格的绿色软件,其运行还是会写注册表的,如果不正常的使用它,注册表里还是会留下垃圾的,不过,这种垃圾对你的电脑影响不是很大,会的朋友可以手动删除这些垃圾)
二、做成安装软件很难吗?那些所谓写绿色软件的人是不懂windows编程,根本就写不出注册的过程吗。
1、我只能说,某些人的这种说法是一种非常不负责任的说法。其人根本不懂得编程,可笑而幼稚,只能以电脑肓来称呼。
2、现在流行的各种编程软件分三大类:
A、第一类是微软出的编程软件。
有Visual Studio系列(流行版本为6.0)以及新出不是很久的VS.NET系列,它们都自带了安装发布功能。特别是Visual Studio中的VB做出的东西,如果不发布,或不进行相关的处理,在别的没有安装VB的机器上是根本运行不起来的,因为VB编译出来的程序在根本上是伪编译,其指令通过VB运行库转译后运行,没有VB运行库的机器是根本无法正常运行此类程序的。当然了,有经验的朋友可以手工把运行库复制入相应的目录中,或是和VB做出的程序放在一起。其它的Visual Studio做出的程序有的有类似的上述情况。
在微软出品的VS.NET中,VS.NET兼容了多种编程语言,但按其说法,最终的代码其根本实质会变成一致。但是它做出的也同样是伪代码,也就是说,其代码不是根本上的机器二进制代码,不对机器进行直接指令指示,而是向.NET运行环境(NET Framework接口)发出指令,而由NET Framework转译指令为机器代码,再进行持行。这就要求你的机器上安装了NET Framework。NET Framework在win95/win98/windows2000上默认是没有安装的,如要安装,需要从网上下载或其它方式得到后安装。(微软官方有下载,大家也可以使用windows updata得到)。XP、windows 2003已集成。最后要说的是,微软宣言,要将原来的API接口(windows一直使用的标准编程接口)作废,改用.NET接口,故.NET编程方式可能是将来的标准方式。VS.NET系列的软件也集成了通用安装发布软件,只要正确掌握它,就能很好的做出楼主所谓的安装程序。
B、第二类软件是大名鼎鼎的Borland公司出品的编程软件,它也包括两大系列。即API系列和.NET系列。其.Net系列的情况和VS.NET是类似的。而其API的情况就有些不同了。
Borland的Borland C++Builder和Borland Delphi是两种非常流行的针对win进行API编程的编程环境。他们也带有install shield,可以说是编程人员必学的。不过,很多的稍简单的程序,编制者并不用它,因为,使用Borland C++Builder/Delphi开发出来的程序,只要正确设定几个参数,编译后得出的程序就可以在几乎所有版本的win中很好的直接运行了,当前,前提是,没有使用有特殊要求的第三方控件,或某些必要特别设定的数据源(BDE等)。而且,稍熟练的编制者可以直接在程序中通过程序自行进行一些简单的环境设定,如写注册表(关联文件、开机起动)、利用资源文件的方式向重要的目录写入文件,注册组件等等,可以说一点儿也不难。
C、第三类是一些比较偏的编程语言了,如易语言等,使用的人很少,本人很老实的说,具体情况我也不是很了解。
三、为什么一些个人的简单的软件会做成非绿色的:
1、编写者水平太低。低到只会使用微软的VB等,虽然做出的东西也值得一用,但是不知道怎么把它变成绿色的,只能依*VB等本身的功能以保证程序的正常运行。
2、编写者懒,写出程序后想,只要程序能正常让别人用就可以了,不值得太费脑子,依*VB等本身的功能发布吧,反正这样保险。
3、编写者水平不低,也不懒,但是它的程序用到了一些第三方控件,这些控件需要发布安装才能正常运行(需要注册特定的.DLL,需要把一些文件放到特定的位置,如典型的,要放入windows下的system32目录中。)
4、编写者为一些水平实在太低的人考虑,为了那些人的方便,如典型的《笨笨钟》就是此类,《FoxMail》、《winamp》也是此类,当然,FoxMail、《winamp》是写注册表的,通过其主程序进行一些环境的设定,严格上来说,也不是纯绿的。
5、编写者有一些特定的,不想为人知的东西要放入你的机器。比如典型的《阿达连连看》就是这样,它要把一些特定的与注册相关的东西放入你的windows目录,而且不想被人发现。又如网际快车的某些版本,它要把广告程序代码放入你的windows安装目录。
6、编写者有恶意,它的程序其实捆绑了木马、病毒等(对这一类的就要非常小心了),在安装的过程中这些恶意的程序就会释放出在,不知不觉中潜入你的计算机。
四、是否可以做出功能复杂,但又是严格意义上的纯绿软件:
答案是非常肯定的,因为,其实我们正在使用的很多程序都是纯绿的,特别是很多的游戏,虽然它们也要安装后才能运行,其实,你把它们安装后的目录放在别的机器上也一样的可以使用,并不必再次安装,其安装的意义就是***编写者为一些水平实在太低的人考虑***,如《三角洲》、《魔兽争霸III》。特别如网络游戏《传奇》(这个程序写的是真的很经典了,决对纯绿)等等著名的游戏都是如此。其需要设定的环境记录可以不写在注册表内,而利用*.INI文件来记录。我不知道有几个人有胆子说编写这些程序的人水平低下。
五、综上所述:
1、要做出一个纯绿色的软件,并不是很难,当然,可能要求编制者更多的依*自已去写代码(在必要情况下),在程序涉及方面比较多的情况下,可能给编制者加重很多的工作量。而要做一个非纯绿的软件,那就更容易了,往往可以利用编写器的一些自带功能自动完成。
2、纯绿的不带安装功能的软件非常适合于对电脑比较熟悉的朋友使用,而绿色带安装的软件适合于所有人使用。而自以为对电脑很熟的朋友往往更喜欢不带安装功能就可以用的。原因有如下:带安装的软件往往会有反安装程序,如果安装目录被人为删去,反安装程序或一些相关注册表信息往会留在机器中,成为垃圾。
3、为了自已的机器的安全、快速,也为了知情权(一个程序到底在安装和使用过程中在自已的机器里写了什么),本人极力推荐纯绿的软件。即便在必要的情况下非纯绿,也希望有详细的说明。说明软件可能会写注册表的那些部分,会改动机器里的哪些文件,会向哪些目录写入什么文件,内容。而且,希望这成为软件界的一个标准。这样,我们的电脑才会有安全可言!
4、为什么现在流行的软件中真正纯绿的软件不是很多呢?这个问题很不好回答。在这儿可以非常遗憾的告诉大家,有些朋友在网上下载的winrar绿色版、winamp绿色版等等,都不是真正意义上的纯绿软件。
比如winrar,它就因为为了在鼠标右键上出winrar的功能菜单而写动了注册表,因为要关联比如扩展名为.rar等等的文件(这些都可以在winrar程序里设定和更改)而写动了注册表。如果使用winrar后,强行把winrar程序目录删去,注册表里的这一部分注册表信息必然成为垃圾(其它的也许有本人没有发现的动作,如没有说出来是本人水平不足的问题了,呵呵)。
winamp绿色版似乎要好一些(本人的感觉),如果你设定了一些文件的关联,如双击*.mp3等文件winamp就会自动打开播放的话,你强行删去winamp所在目录,这部分文件的关联信息也会成为垃圾留在注册表中。
(上面两个只是举例,解决办法很多对电脑熟悉的朋友是会的,在这儿,我们并不讨解决办法,另外,应该说,上面两程序是很规范的东西,它们的这些动作是无可厚非的)
现在再回过头来说说“流行的软件中真正纯绿的软件不是很多”。
A、有些功能是非通过写注册表来实现不可,最最常见的就是文件关联、鼠标右键菜单。(呵呵,这种操作可以说,稍熟编程的人都会)。但是很少有个人编写者考虑到别人不用他的程序时,要怎么让使用者方便地复位这些文件关联,方便地清理右键菜单。
B、部分程序编写者喜欢把注册信息放在注册表中。(为什么喜欢?就因为注册表是庞大的参数库,他们以为,要从这样一个大参数库找出他们写入的一个信息是大海捞针。事实上,的确很多朋友是难以找出来的,话又说回来,会者不难,难者不会,在这儿我也不细说了)
C、一些大公司的程序实在对系统有太多的改动,他们做好了安装和卸载工具,这些软件涉及了系统的方方面面,想简单的删除是很难的。典型的就如微软的Office等等。这些软件说实在的,别说你不老实的删除了,就是老实的卸载,有时也是很难成功的。最好的办法就是装上后就别卸把,把它看成是系统的一部分(不管你乐不乐意,呵呵)。(又及,这类程序也不是很少,这儿只举一例)。
D、只有那些其功能可以不涉及更改系统默认行为的软件才可能在真正意义上做到纯绿。((也许我罗嗦了)系统默认行为包括“文件关联”,“右键菜单”,“控制面版”里的项目,真实或虚拟的硬件驱动以及其它我想不起来或是我也不知道的东西……)。当然了,还要编写者有真正的为使用者着想的精神,有较好的技术。
六、有部分并非纯绿的软件,伪装成纯绿的,在运行过程中向注册表写东西,向关键目录区写东西,甚至更改重要文件。这不是纯绿软件,只能说是伪纯绿。又及,很多网上流行的软件,号称纯绿版,实际上只是一些原版本经过稍许改进等,原软件并不设计为纯绿,在运行过程中还是会写注册表(甚至写关键win目录),也不是严格意义上的纯绿。反过来,也有部分其实是纯绿的软件,为了大家的方便,做成了安装发布式的。比如最典型的就是《传奇》《三角洲》、《魔兽争霸III》等一些游戏,一些工作软件如《FOXMAIL》(FoxMail至少在针对IE选项里的“程序”页里的"电子邮件"相关项进行了注册表相关写操作)《winamp》《winrar》等等准绿软件(在这儿,我只说它们是准绿的)也是如此。这类软件其实安装出来后,把其目录放在任何一台电脑上都能或者能较为正常的运行,这也是为什么大家能很方便的把它们改造成绿色软件的原因。现在真正的纯绿软件实际上是很少的,至于以后,也还是看不到纯绿一统天下的希望的,大家不可因噎废食。不可能只用纯绿软件而不用其它。而且大公司的软件一般还是非常可*的。
七、非纯绿软件的危害:
1、向系统关键目录或不属于该程序所在目录乱存放文件(默认临时文件夹除外)在原则上对机器的运行速度是没有大的影响的,除非乱放的文件改动了原有的系统关键文件,才会至使电脑变慢或运行不正常。但是,因为这些目录中的文件一般都比较多,很难对它们进行清理(鬼才知道哪个是能删,那个不能删),会使你的硬盘空间浪费,对于硬盘空间紧的朋友,那就非常讨厌了(此外,心里也不爽)。
2、向注册表乱写信息,如果乱写的信息并不影响系统的关键部分,对系统运行也是没有严重影响的,不过,有些信息写入了不删去,你的系统就会有些讨厌的东西出来,举例:你装上winrar后(典型安装设置),直接把winrar删了,你就会发现,你的右键菜单里会多出一些让人哭笑不得的东西。要注意的是,随着机器的使用,软件的安装、删除,这些可以感觉到和不能感觉到的信息会越来越多,而你的机器在运行过程中,几乎随时随刻不能离开对注册表的相关操作,注册表里的信息过多,机器查找所需信息的速度就会变慢,这时,机器的运行就表现为“变慢了”,这往往是一台电脑为什么越用越慢的最重要的原因之一。(提示:因为多数情况下,一个软件对注册表写的东西并不多,所以,在每一次垃圾进去了,用户是很难感觉到影响的)(又及,一些注册表清理软件,本人也用过,虽有作用,但是风险不少,是好是坏我也不知怎么评价……)。这些垃圾信息并非只有小公司的软件会留下,很多大公司的软件据本人的感觉,也是会留垃圾的,本人也很无耐。
解决办法吗?恕本人无能,在当今软件乱世,只怕多少有些无可耐何。本人是使用最笨的方法:Ghost镜像还原。基本上每三至四个月给它倒回一次。(工作文档等当然不能放在系统区了,呵呵)。
八、希望无知者不要信口开河,多多学习。最后,附上一个我自已做的纯绿软件---BCB编写的《水波特效演示》程序,给大家玩玩叭。
补充——初步判断一个软件是否纯绿软件的方法(注,只有对电脑比较熟悉的人能才办到,如果下面的说明,你基本能看懂,而无需请教别人,你就能做到了):
一、系统测试法:
1、将软件在别人的机器上安装,安装完成后,把安装出来的目录复制到你的机器中(如果本身就号称纯绿免装的,这步就免了)。
2、你的机器要求安装windows2000 或 windows XP 或 windows2003,使用受限用户登录(要求受限用户无对关键注册表有写权,无对重要目录有写权,当然了,默认的新建的用户就是这样的(XP下要将用户设为受限))。
3、受限用户登录后运行复制来的安装目录下的软件的主程序,如果正常,90%是纯绿。
4、对省下10%的说明——不排除可能编写者隐了动作,如果不成功也不报错,也不退出,还正常运行,一但能写的时就它就写。另外,还有一部分程序,如FoxMail,只对当前帐户相关于注册表进行写操作,因为“帐户相关于注册表"是"属于"对应帐户的,在受限帐号下也是可写的(特别说明一下,注销该帐户,注册表中该帐户的所有项目都会清去,所以也可以算是绿的)。
二、软件监控法:
1、如果上面的步子还不令你放心,还有一个工具值得一用,那就是《Filemon》,这是一个可以监视系统中任何软件对硬盘的读写操作的程序,通过它,你可以查到某个程序对你的硬盘的什么位置的什么文件进行了操作,这个程序只能在管理员帐户下用(切入系统进程)。
2、对于注册表的监视是很麻烦的事,《Regmon》可以办到,同上面的工具一样Regmon要求在管理员帐户下用(切入系统进程)。
3、90%的软件和上面的两个软件无冲突,省下的9%的是作者有意防止被监视(为什么有意防止被监,那你就自个想吧,一般都是比较可怕的东西),最后1%可能是因为程序实在相互不兼容了。
以上两工具都为同一公司(Sysinternals)出品,值得一用,附在最后(XTJS.rar)。
三、并非所有的不能在受限帐户下用的程序都不是纯绿的。某些程序可能要切入别的系统程序中,某些程序需要得到硬件信息等,这些最只有在管理员帐户下才能实现。还有一些程序可能没有考虑多用户操作系统等。只能说,通过了上面的测试的程序90%是纯绿的,没有通过的话90%是非纯绿的。有经验的朋友还可以据自已的经验得到更准确的结论。参考资料:以上资料,从网上下载的,与本人无关