Windows系统编程
Python是一门强大的脚本语言,它可以把其他语言编写的程序粘合在一起,可以很容易地调用外部程序,以及调用其他语言编写的动态链接库中的代码,甚至可以将Python程序打包为.exe可执行程序以便在没有安装Python的Windows系统中运行。
1. 注册表编程
对于Windows操作系统,注册表是非常重要的组成部分,Windows将几乎所有软/硬件系统配套信息都保存在注册表中。通过读取注册表中的数据,可以获取Windows平台的相应信息,比如,已安装的服务和程序列表,开机自动运行的程序列表、文件类型与程序的关联关系等;通过修改注册表中的数据,可以对Windows系统进行详细的配置。
Windows注册表有如下5个根键.
- HKEY_LOCAL_MACHINE(HKLM)
- HKEY_CURRENT_CONFIG(HKCC)
- HKEY_CLASSES_ROOT(HKCR)
- HKEY_USERS(HKU)
- HKEY_CURRENT_USER(HKCU)
在Windows shell中输入regedit可以打开注册表编辑器:
在注册表编辑器界面中可以对注册表的键和值进行增删改查等操作
在注册表中,值可以为数值、字符串等多种类型,详细类型如下:
类型名 | 说明 |
---|---|
REG_NONE | 没有类型 |
REG_SZ | 字符串类型 |
REG_EXPAND_SZ | 一个可扩展的字符串值,其中可以包括环境变量 |
REG_BINARY | 二进制类型 |
REG_DWORD/REG_DWORD_LITTLE_ENDIAN | DWORD类型,用于存储32位无符号整数,以little-endian格式存储 |
REG_DWORD_BIG_ENDIAN | DWORD类型,存储32位无符号整数,以big-endian格式存储 |
REG_LINK | 到其他注册表键的链接,指定根键或到目标键的路径 |
REG_MULTI_SZ | 一个多字符串值,指定一个非空字符串的排序列表 |
REG_RESOURCE_LIST | 资源列表,用于枚举即插即用硬件及其配置 |
REG_FULL_RESOURCE_DESCRIPTOR | 资源标识符,用于枚举即插即用硬件极其配置 |
REG_RESOURCE_REQUIREMENTS_LIST | 资源需求列表,用于枚举即插即用硬件极其配置 |
REG_QWORD/REG_QWORD_LITTLE_ENDIAN | QWORD类型,用于存储64位无符号整数,以littel-endian格式存储或未指定存储格式 |
对于注册表编程,可以使用win32api模块和win32con模块,其中win32api模块封装了Windows API 函数,提供了非常友好的接口。该模块中常用的注册表操作函数有8个。
RegOpenKey()/RegOpenKeyEx()
:打开注册表RegCloseKey()
:关闭注册表RegQueryValue()/RegQueryValueEx()
:读取项值RegCreateKey()/RegCreateKeyEx()
:添加项RegDeleteKey()
:删除项RegEnumKey()
:枚举子键RegDeletetValue()
:删除值
例子,查询注册表并输出本机安装的IE浏览器软件版本信息:
import win32api
import win32con
key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 'SOFTWARE\\Microsoft\\Internet Explorer', 0,
win32con.KEY_ALL_ACCESS)
print(win32api.RegQueryValue(key,''))
print(win32api.RegQueryValueEx(key,'Version'))
print(win32api.RegQueryInfoKey(key))
win32api.RegCloseKey(key)
(该程序需要在管理员权限下运行)结果:
检测随系统启动而启动的程序列表
from win32api import *
from win32con import *
def get_values(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_CLASSES_ROOT':
key = RegOpenKey(HKEY_CLASSES_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_USERS':
key = RegOpenKey(HKEY_USERS