利用VB.NET訪問注冊表
2024-07-10 13:01:33
供稿:網友
利用vb.net訪問注冊表
譯者注:訪問注冊表的例子比較多,然而通過vb.net訪問注冊表的例子并不多,本文翻譯了一篇msdn上的利用vb.net存取注冊表的例子,挺詳細也挺全面的。 ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchimpdragdrop.asp)
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提供了四個訪問注冊表的函數,為了使用它們,首先必須有讀寫權限。任何運行在全信任模式下的代碼都必須有訪問注冊表的必要的權限??梢圆榭磖egistrypermission類從而獲得更多的信息。
vb.net函數
描述
deletesetting
刪除注冊表中應用程序中的某項或鍵值
getsetting
返回注冊表中應用程序入口點的鍵值
getallsettings
返回注冊表中程序入口點的一列鍵值
savesetting
在注冊表中創建或保存程序的設置
注意:不能通過getsetting函數返回某項的名字
如果無法保存某項的設置,將觸發一個argumentexception對象。參見argumentexception可以獲得更多的相關信息。
下面的例子在注冊表中創建了一個主鍵和兩個子鍵。首先打印主鍵的值,然后輸出主鍵及其兩個子鍵的值,然后刪除第二個子鍵,在輸出主鍵和第一個子鍵的值來確定是否刪掉了第二個子鍵。
' create the first key.
savesetting("testapp","startup","firstkey","first")
' create the first subkey.
savesetting("testapp","firstkey","firstsubkey","firstsub")
' create the second subkey.
savesetting("testapp","firstkey","secondsubkey","secondsub")
try
' write the first key's value.
console.writeline ((getsetting("testapp","startup","firstkey"))
' write the first key as well as its two subkeys.
console.writeline (getallsettings("testapp","startup"))
catch e as argumentexception
catch e as exception
console.writeline (e.gettype.tostring)
finally
end try
deletesetting("testapp","firstkey","secondsubkey")
try
console.writeline (getsetting("testapp","startup","firstkey"))
console.writeline (getallsettings("testapp","startup"))
catch e as argumentexception
catch e as exception
console.writeline (e.gettype.tostring)
finally
end try
用vb.net內置的注冊表訪問函數是有限制的你只能訪問到hkey_current_user/software/vb and vba program settings下的注冊表項,而且要想訪問到該項下的條目必須登錄到系統,因為hkey_current_user主鍵在未登錄情況下是不能訪問的。
用.net框架訪問注冊表
上面提到,用vb.net內置的注冊表訪問函數只能訪問到hkey_current_user/software/vb and vba program settings下的注冊表項,因而應用是很有限的。這時,你可以用.net框架的microsoft.win32命名空間中的registry和registrykey類來訪問注冊表??蓞⒁妑egistry和registrykey。
安全須知:向當前用戶的注冊表(microsoft.win32.registry.currentuser)寫入數據比向本地機的注冊表(microsoft.win32.registry.localmachine)寫數據更安全。還有兩一種情況,就是當你正在創建的鍵值已經被先前的另一個可能惡意的進程創建時,這就是典型的蹲坐。為了這種情況發生,用registrykey.getvalue方法來獲得鍵值,當某個鍵不存在時該方法將返回nothing。
registry類提供了一些可以訪問注冊表主鍵及其子鍵的一些方法,基鍵本身是只讀的。下表列出了registry類提供的訪問注冊表的方法
key
description
classesroot
定義了關聯到文檔和屬性的類型
currentconfig
包含不屬于特定用戶的硬件配置信息
currentuser
包含了當前用戶參數的信息,例如環境變量
dyndata
包含了動態注冊表數據,如某些虛擬設備驅動器所用到的數據
localmachine
存儲了本地機的配置數據,包括五個子鍵hardware, sam, security, software, and system
performancedata
包含了軟件組件的性能信息
users
包含了默認用戶參數的信息
下面的例子顯示了如何從hkey_current_user讀取一個dword鍵值:
imports microsoft.win32
dim regversion as registrykey
dim keyvalue as string
keyvalue = software//microsoft//testapp//1.0
regversion = registry.currentuser.opensubkey(keyvalue, false)
dim intversion as integer = 0
if (not regversion is nothing) then
intversion = regversion.getvalue("version", 0)
regversion.close()
end if
接下來的例子是從hkey_current_user中讀取,增加,并寫入一個dword值:
imports microsoft.win32
dim regversion as registrykey
regversion =
registry.currentuser.opensubkey("software//microsoft//testapp//1.0", true)
if regversion is nothing then
' key doesn't exist; create it.
regversion =
registry.currentuser.createsubkey("software//microsoft//testapp//1.0")
end if
dim intversion as integer = 0
if (not regversion is nothing) then
intversion = regversion.getvalue("version", 0)
intversion = intversion + 1
regversion.setvalue("version", intversion)
regversion.close()
end if
權限
system.security.permission命名空間中的registrypermission類操縱著訪問注冊表變量的能力。registry變量存儲在那些只有registrypermission的代碼才能訪問到的內存區域。類似的,當授予權限時只給它們能完成任務的最小的權限。參見registrypermission 和 system.security.permissions。
注冊表訪問權限值是由registrypermissionaccess枚舉定義的,參見registrypermissionaccess獲得更多信息,下表只列出其成員。
value
description
allaccess
創建、讀取和寫入注冊表變量的權限。
create
創建注冊表變量的權限。
noaccess
不能訪問注冊表。
read
讀取注冊表變量的權限。
write
寫入注冊表變量的權限。
注意:如果你需要一些權限組合的話,例如你需要讀寫而不需要新建權限,你可以使用下面的位運算符,如下例:
registrypermissionaccess.write or registrypermissionaccess.read _
"hkey_local_machine/software/microsoft/testapp"
使用注冊表編輯器訪問注冊表
當你在配置你的工程時,你可能要用到注冊表編輯器來對目標計算機的注冊表添加鍵值??蓞⒖紃egistry editor獲得更多信息。
訪問注冊表編輯器:
1、打開一個配置工程。
2、找到view菜單,指向editor,然后點擊registry。
在配置工程中使用注冊表可參考registry settings management in deployment。
結論:
注冊表是一個存儲應用程序信息和用戶個人設置的理想位置,可以通過注冊表來檢查與你的程序正在交互的系統硬件或程序的信息。
大多數情況下,通過vb.net運行時函數訪問注冊表就足夠了,然而有時候你可能會用到.net框架的registry和registrykey類。這兩種訪問注冊表的方法都很簡單,但是這種方法有安全問題,必須小心謹慎,例如你不能在某個鍵中包含明文密碼或其它的敏感信息。