winreg運(yùn)用:Python自帶操作注冊(cè)表的模塊!
前言
大家好,我是IT共享者,人稱(chēng)皮皮。
注冊(cè)表這個(gè)東西大家可能都不是很熟悉,因?yàn)槲覀兤綍r(shí)用到的少;但是它是Windows的核心,很多軟件的啟動(dòng)和日志記錄什么的都包含在里面,可以說(shuō)它是一個(gè)大型的數(shù)據(jù)庫(kù)也不為過(guò),今天我們就來(lái)看看Python是如何操作注冊(cè)表的吧。
一、注冊(cè)表初次見(jiàn)面
進(jìn)入系統(tǒng)注冊(cè)表的方法多種多樣,最常見(jiàn)的就是運(yùn)行窗口輸入命令“regedit”,即可進(jìn)入注冊(cè)表:
注冊(cè)表中的幾個(gè)菜單分別對(duì)應(yīng)機(jī)器的根目錄登陸的用戶(hù)信息和本地機(jī)器信息以及用戶(hù)信息和本地配置信息等。
二、認(rèn)識(shí)操作注冊(cè)表的模塊
在Python中就有這么一個(gè)神奇的模塊,它可以用來(lái)操作注冊(cè)表。它就是-----"winreg",一個(gè)Python自帶的操作注冊(cè)表的模塊。
三、導(dǎo)入import winreg
1.常量
”winreg“總有很多有用的方法,基本上就是操作注冊(cè)表中的鍵值,我們挑幾個(gè)重要的來(lái)說(shuō)說(shuō)。首先我們來(lái)了解下”winreg“中的各個(gè)常量:
1).HKEY_ 常量winreg.HKEY_CLASSES_ROOT #存儲(chǔ)應(yīng)用和shell的信息winreg.HKEY_CURRENT_USER #當(dāng)前用戶(hù)自定義的信息winreg.HKEY_LOCAL_M(jìn)ACHINE #計(jì)算機(jī)系統(tǒng)所有的信息winreg.HKEY_USERS #所有用戶(hù)信息winreg.HKEY_PERFORMANCE_DATA #性能數(shù)據(jù)winreg.HKEY_CURRENT_CONFIG #本地計(jì)算機(jī)系統(tǒng)的硬件配置文件winreg.HKEY_DYN_DATA #windows98后的版本無(wú)法使用2).訪問(wèn)權(quán)限
winreg.KEY_ALL_ACCESS #所有權(quán)限winreg.KEY_WRITE ?蓪(xiě)winreg.KEY_READ ?勺xwinreg.KEY_EXECUTE ?蓤(zhí)行相當(dāng)于KEY_READwinreg.KEY_QUERY_VALUE #查詢(xún)注冊(cè)表鍵值winreg.KEY_SET_VALUE #創(chuàng)建、刪除或設(shè)置一組注冊(cè)表值winreg.KEY_CREATE_SUB_KEY #創(chuàng)建一個(gè)注冊(cè)表子項(xiàng)的注冊(cè)表鍵winreg.KEY_ENUMERATE_SUB_KEYS #枚舉注冊(cè)表子項(xiàng)所需的注冊(cè)表鍵winreg.KEY_NOTIFY #修改注冊(cè)表鍵時(shí)的提示winreg.KEY_CREATE_LINK #創(chuàng)建一個(gè)鏈接,預(yù)留給系統(tǒng)用3).64位的具體應(yīng)用
winreg.KEY_WOW64_64KEY #在64位Windows應(yīng)用程序應(yīng)該運(yùn)行在64位注冊(cè)表視圖winreg.KEY_WOW64_32KEY #在64位Windows應(yīng)用程序應(yīng)該運(yùn)行在32位注冊(cè)表視圖4).值類(lèi)型
winreg.REG_BINARY #任何形式的二進(jìn)制數(shù)據(jù)winreg.REG_DWORD #32位的數(shù)winreg.REG_DWORD_LITTLE_ENDIAN #32位的數(shù)字在低位優(yōu)先的格式,相當(dāng)于REG_DWORDwinreg.REG_DWORD_BIG_ENDIAN #32位的數(shù)字在高位優(yōu)先的格式winreg.REG_EXPAND_SZ #以null結(jié)尾的字符串包含環(huán)境變量的引用(% %)winreg.REG_LINK #Unicode符號(hào)鏈接winreg.REG_M(jìn)ULTI_SZ #一個(gè)以null結(jié)尾的字符串序列,由兩個(gè)空字符結(jié)束winreg.REG_NONE #沒(méi)有定義的值類(lèi)型winreg.REG_QWORD #64位的數(shù)winreg.REG_QWORD_LITTLE_ENDIAN #在低位優(yōu)先一個(gè)64位的數(shù)字格式,相當(dāng)于REG_QWORDwinreg.REG_RESOURCE_LIST #設(shè)備驅(qū)動(dòng)器資源列表winreg.REG_FULL_RESOURCE_DESCRIPTOR #硬件設(shè)置winreg.REG_RESOURCE_REQUIREMENTS_LIST #硬件資源列表winreg.REG_SZ #一個(gè)以null結(jié)尾的字符串
四、注冊(cè)表相關(guān)操作
1.連接遠(yuǎn)程計(jì)算機(jī)注冊(cè)表
reg=winreg.ConnectRegistry('\計(jì)算機(jī)名',winreg.HKEY_LOCAL_M(jìn)ACHINE)#返回值是所開(kāi)打鍵的句柄#第一個(gè)參數(shù)是指遠(yuǎn)程計(jì)算機(jī)名,第二個(gè)參數(shù)是指注冊(cè)表中的鍵,如HKEY_LOCAL_M(jìn)ACHINE,它是winreg中的常量。
不過(guò)我們?cè)谶@里要注意的是,如果遠(yuǎn)程注冊(cè)表沒(méi)有系統(tǒng)管理員權(quán)限,是無(wú)法正常訪問(wèn)注冊(cè)表的。所以我們先要判斷下它的訪問(wèn)權(quán)限。這里就要用到我們之前講的"ctypes"模塊中的判斷用戶(hù)是否是管理員用戶(hù)的方法了。
import ctypesimport sysdef admin(): aa=ctypes.windll.shell32.IsUserAnAdmin() return aa
if admin()==1: #有管理員權(quán)限可打開(kāi)遠(yuǎn)程注冊(cè)表 winreg.ConnectRegistry('\計(jì)算機(jī)名',winreg.HKEY_LOCAL_M(jìn)ACHINE)else: if sys.version_info[0]==3: #python版本是3以上的版本 ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1) else: #python2 版本 ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)2.關(guān)閉連接注冊(cè)表
連接之后我們不想用了,就要隨手把它給關(guān)閉了,也很簡(jiǎn)單,只要拿到打開(kāi)注冊(cè)表的句柄,就可以關(guān)閉了。
winreg.CloseKey(reg)
可以看到句柄的值不一樣。
其實(shí)還有一種方法,就是利用注冊(cè)處理對(duì)象的方法來(lái)關(guān)閉。
reg.Close()
注冊(cè)對(duì)象還支持上下文和分離處理對(duì)象周期:
reg.detach() #返回一個(gè)整數(shù),記錄當(dāng)前對(duì)象的生命周期,如果關(guān)閉注冊(cè)句柄對(duì)象,那么則為03.打開(kāi)注冊(cè)表鍵#打開(kāi)指定的鍵,返回一個(gè)處理對(duì)象winreg.OpenKey(key, sub_key, reserved=0, access=winreg.KEY_READ)winreg.OpenKeyEx(key, sub_key, reserved=0, access=winreg.KEY_READ)#key:HKEY_ 常量#sub_key:指定鍵的子鍵#reserved:一個(gè)保留的證書(shū),必須是零。默認(rèn)值為零#access:訪問(wèn)權(quán)限4.創(chuàng)建新的注冊(cè)表鍵winreg.CreateKey(key,sub_key)winreg.CreateKeyEx(key,sub_key,reserved=0,access=winreg.KEY_WRITE)#key:HKEY_ 常量#sub_key:指定鍵的子鍵#reserved:一個(gè)保留的證書(shū),必須是零。默認(rèn)值為零#access:訪問(wèn)權(quán)限
5.刪除注冊(cè)表中指定的鍵
winreg.DeleteKey( key,sub_key) #不能刪除帶有子項(xiàng)的鍵winreg.DeleteKeyEx(key,sub_key,reserved=0,access=winreg.KEY_WOW64_64KEY)#不能刪除帶有子項(xiàng)的鍵winreg.DeleteValue(key, value)#從某個(gè)注冊(cè)鍵中刪除一個(gè)命名值項(xiàng)#用法與上面相同,只是結(jié)果是刪除罷了
可以看到”cnm“已經(jīng)被刪除了。如果鍵不存在,刪除會(huì)報(bào)錯(cuò)。
6.枚舉注冊(cè)表鍵winreg.EnumKey(key,index) #枚舉打開(kāi)的注冊(cè)表鍵的子鍵,并返回一個(gè)字符串winreg.EnumValue(key,index)#枚舉打開(kāi)的注冊(cè)表鍵值,并返回一個(gè)元組#index:一個(gè)整數(shù),用于標(biāo)識(shí)所獲取鍵的索引
7.刷新注冊(cè)表鍵
winreg.FlushKey(key) #同步某個(gè)鍵的所有屬性寫(xiě)入注冊(cè)表8.讀取注冊(cè)表winreg.LoadKey(key,sub_key,file_name)#file_name:讀取注冊(cè)表的數(shù)據(jù)的文件
名9.查找注冊(cè)表鍵winreg.QueryInfoKey(key) #返回一個(gè)3元素元組的鍵的信息winreg.QueryValue(key,sub_key) #用一個(gè)字符串來(lái)檢索一個(gè)鍵的值winreg.QueryValueEx(key,value_name) #檢索與開(kāi)放權(quán)限的注冊(cè)表鍵相關(guān)聯(lián)的指定值的數(shù)據(jù)類(lèi)型和名稱(chēng)
10.保存注冊(cè)表鍵
winreg.SaveKey(key, file_name) #保存指定的鍵和所有指定文件的注冊(cè)表子項(xiàng)
11.啟用禁用注冊(cè)表winreg.DisableReflectionKey(key) #禁用winreg.EnableReflectionKey(key) #啟用
12.反射狀態(tài)是否禁用winreg.QueryReflectionKey(key) #結(jié)果為T(mén)rue 則表示禁用
13.在指定鍵上關(guān)聯(lián)值winreg.SetValue(key, sub_key, type, value) #添加鍵和值winreg.SetValueEx(key,value_name,reserved,type,value)#將數(shù)據(jù)存儲(chǔ)在一個(gè)開(kāi)放的注冊(cè)表鍵值字段#value_name:該字符串名稱(chēng)的注冊(cè)表子鍵#type:值類(lèi)型#value:子鍵的鍵值
可以看出它們的區(qū)別,而且前者值類(lèi)型只能指定為“winreg.REG_SZ”,而后者什么類(lèi)型都可以。
14.尋找應(yīng)用程序的位置并打開(kāi)
前面我們介紹了"winreg"幾乎所有的方法,現(xiàn)在我們就來(lái)具體做一個(gè)應(yīng)用練練手,就拿我們的360安全衛(wèi)士為例,我們嘗試著通過(guò)注冊(cè)表先找到它的位置然后打開(kāi)它。那么接下來(lái)小編開(kāi)始表演了:
1).定位360安全衛(wèi)士的注冊(cè)表項(xiàng):1)).打開(kāi)系統(tǒng)注冊(cè)表編輯器,然后進(jìn)行搜索關(guān)鍵字:
2)).定位到注冊(cè)表路徑
2).打開(kāi)注冊(cè)表鍵
通過(guò)我們找到的子鍵然后對(duì)其進(jìn)行查找操作,得到處理對(duì)象的句柄“reg”
reg=winreg.OpenKey(winreg.HKEY_LOCAL_M(jìn)ACHINE,r"SOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstall?安全衛(wèi)士")3).找到應(yīng)用的絕對(duì)路徑并打印
通過(guò)數(shù)值名稱(chēng)找到數(shù)值數(shù)據(jù),
path=winreg.QueryValueEx(reg,'DisplayIcon')
這樣就找到了這個(gè)應(yīng)用的絕對(duì)路徑了,返回值是一個(gè)元祖,我們使用索引訪問(wèn):
path[0]
可以看到我們已經(jīng)成功打印出了我們要找的應(yīng)用程序的絕對(duì)路徑了,接下來(lái)就可以愉快的打開(kāi)它了。打開(kāi)的方法多種多樣,什么“os”,“subprocess”,"ctypes","pywin32",一大堆的方法,不過(guò)小編還是覺(jué)得“os”最方便。
os.popen(path[0])
最后別忘了關(guān)閉對(duì)象處理句柄哦。
#兩種方法都可以關(guān)閉winreg.CloseKey(reg)reg.Close()
四、總結(jié)
利用”winreg“可以完成很多騷操作,你也可以通過(guò)注冊(cè)表設(shè)置系統(tǒng)開(kāi)機(jī)啟動(dòng)項(xiàng)以及其它操作,如果你想往黑客方面發(fā)展的話。
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開(kāi)發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車(chē)電氣化和底盤(pán)解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來(lái)出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
-
精彩回顧立即查看>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專(zhuān)題
- 1 人形機(jī)器人核心零部件,誰(shuí)是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒(méi)回牌桌,但重注全壓在了
- 6 蘋(píng)果或?qū)渴肿止?jié)騰訊大模型,我國(guó)大模型產(chǎn)業(yè)發(fā)展駛?cè)肟燔?chē)道
- 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來(lái),歌爾股份“智能體”在下一盤(pán)“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來(lái)當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷(xiāo)售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷(xiāo)售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專(zhuān)家 廣東省/江門(mén)市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市