12.1 注册表编程

      在注册表中,值可以是数值、字符串等多种类型。


633408563F99655118DF01601A58DCBF.jpg
5B57160632E07C2DC9332AC0D4F58D10.jpg

      对于注册表编程,可以使用 win32api 模块和 win32con 模块,win32api 模块封装了 Windows API 函数,常用的注册表操作有:
(1)RegOpenKye()/RegOpenKeyEx() 打开注册表
(2)RegCloseKey() 关闭注册表
(3)RegQueryValue()/RegQueryValueEx() 设置项值
(4)RegSetValue()/RegSetValueEx() 添加项值
(5)RegCreateKey()/RegCreateKeyEx() 添加项
(6)RegDeleteKey() 删除项
(7)RegDeleteKey() 枚举子键
(8)RegDeletetValue() 删除值
      下面的代码查询 IE 浏览器版本信息。

>>> import win32api
>>> import win32con
>>> key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Internet Explorer', 0, win32con.KEY_ALL_ACCESS)
>>> win32api.RegQueryValue(key, '')
''
>>> win32api.RegQueryValueEx(key, 'Version')
('9.11.18362.0', 1)
>>> win32api.RegQueryInfoKey(key)
(32, 9, 132870495522230263)
>>> win32api.RegCloseKey(key)

      检查随系统启动而启动的程序列表。

from win32api import *
from win32con import *

def GetValues(fullname):
    name = str.split(fullname, '\\', 1)
    try:
        if name[0] == 'HKEY_LOCAL_MACHINE':
            key = RegOpenKey(HKEY_LOCAL_MACHINE, name[1], 0, KEY_READ)
        elif name[0] == 'HKEY_CURRENT_USER':
            key = RegOpenKey(HKEY_CURRENT_USER, name[1], 0, KEY_READ)
        elif name[0] == 'HKEY_CURRENT_ROOT':
            key = RegOpenKey(HKEY_CURRENT_ROOT, name[1], 0, KEY_READ)
        elif name[0] == 'HKEY_CURRENT_CONFIG':
            key = RegOpenKey(HKEY_CURRENT_CONFIG, name[1], 0, KEY_READ)
        elif name[0] == 'HKEY_USER':
            key = RegOpenKey(HKEY_USER, name[1], 0, KEY_READ)
        else:
            print('Error, no key names:', name[0])
        info = RegQueryInfoKey(key)
        for i in range(0, info[1]):
            ValueName = RegEnumValue(key, i)
            print(str.ljust(ValueName[0], 20), ValueName[1])
        RegCloseKey(key)
    except BaseException as e:
        print('Sth is wrong')
        print(e)

if __name__ == '__main__':
    KeyNames = ['HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run',
               'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce',
               'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnceEx',
               'HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run',
               'HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce']
    for KeyName in KeyNames:
        print(KeyName)
        GetValues(KeyName)

      操作 Windows 注册表的另外一种是使用 winreg 模块。下面的代码演示了使用 winreg 枚举注册表值的用法。

import winreg

key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Explorer')
try:
    i = 0
    while 1:
        Name, Value, Type = winreg.EnumValue(key, i)
        print(repr(Name), ':', repr(Value), ':', Type)
        i += 1
except WindowsError:
    pass

print('='*20)
Name = "link"
Value, Type = winreg.QueryValueEx(key, Name)
print(Name, Value)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容