注意:
获取到的信息是硬盘级别的,而不是和分区有关的信息
*相关参考链接
1. StackOverflow-Detecting SSD in Windows
2. Win32_PhysicalMedia文档
3. Win32_DiskDrive文档
4. MSFT_Disk文档
5. MSFT_PhysicalDisk文档
首先需要安装wmi模块,安装过程不再赘述,pip install wmi
WMI,是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI,如图所示,工具软件和脚本程序可以方便地读写WMI。
简单来说,WMI就是跨种族语言的操作系统层面信息管理的接口,有点类似RESTful API,get/set什么的(个人理解)
事出有因,最近看到LTT的一个视频,是一个讲Redkey的数据抹除工具,红钥匙样,嵌一个USB,主要功能就是提供“高级别的数据抹除”,甚至于说有些算法还是军用级别的,挺高大上。点我进入官网(https://redkeyusb.com/)
看视频的时候就听见加拿大白嫖王竟然吐槽这玩意儿还挺贵,打开官网一看!
我不说,各位细品
淦,看来真的是贫穷限制了我的想象力
一个家庭版的不打折卖300多,打了折还有150差不多
更别说究极版了,原价650差不多,打了折还有500左右
我寻思着,你要是个杀毒软件卖这价我还能接受
可就是个随身带的数据清除工具啊,我做个引导盘,随便整一个开源的数据清除软件,成本估计连个零头都占不到
不愧瞄准的是高端市场和特殊人群,就是有勇气喊出这个价,不得不佩服
瞧这酷炫的UI
于是乎,我就萌生出了重制一个Redkey的想法,姑且命名为RedkeyClone
目标是提供和Redkey同样的功能,但是开源免费
仅供学习使用,目的不是为了砸Redkey的牌子(狗头护体)
经过一番油管视频观看,大概对Redkey有了初步了解
以下为个人理解:
Redkey本身也是个启动盘,不过启动的是Linux系统,从引导的GRUB和开机后加载时大段滚动的文字界面大致可以看出来。同时加载完毕后就进入了Redkey的软件,核心都在软件部分。刨去软件,可以说这就只是个定制化的GRUB引导盘
而我打算基于Windows平台制作,一是规避Redkey,二是PE装机在国内很普遍
开发语言,选Python吧。一是最近都在写Minecraft插件,Java用的多,怕Python手生了;二是以前用Python写过类似磁盘和硬盘操作的程序ddWin,就是dd的Windows复刻版;三是除了这两门语言之外,也就C#熟一点,而Java是没指望进行一些底层操作的,至少以我的水平还不配,C#更是不算上手,Python算是一个折中的选择,何况有以前造的轱辘,岂不美哉
而本文就相当于一个备忘录,省的自己好不容易研究出来的到时候忘了
据我所知,Redkey是对硬盘进行操作的,因此我无需在意和分区有关的事情
媒介就是通过wmi模块和Windows系统py交互
WMI里面有很多都是和硬盘有关的,经过一番搜寻,找到了如下几个class
Win32_PhysicalMedia
Win32_DiskDrive
MSFT_Disk
MSFT_PhysicalDisk
好吧,开始调用吧
具体各参数的含义请参考官方文档,链接已经在“相关参考链接”部分给出
写的不好看,别介意
import wmi
# Win32_PhysicalMedia
w = wmi.WMI()
l = []
for obj in w.Win32_PhysicalMedia():
d = obj.properties
for key in d.keys():
d[key] = obj.wmi_property(key).value
l.append(d)
# Win32_DiskDrive
w = wmi.WMI()
l = []
for obj in w.Win32_DiskDrive():
d = obj.properties
for key in d.keys():
d[key] = obj.wmi_property(key).value
l.append(d)
# MSFT_Disk
w = wmi.WMI(namespace=r"Microsoft\Windows\Storage") # 指定命名空间
l = []
for obj in w.query("SELECT * FROM MSFT_Disk"):
d = obj.properties
for key in d.keys():
d[key] = obj.wmi_property(key).value
l.append(d)
# MSFT_PhysicalDisk
w = wmi.WMI(namespace=r"Microsoft\Windows\Storage") # 指定命名空间
l = []
for obj in w.query("SELECT * FROM MSFT_PhysicalDisk"):
d = obj.properties
for key in d.keys():
d[key] = obj.wmi_property(key).value
l.append(d)
为什么在d = obj.properties之后又要d[key] = obj.wmi_property(key).value?
– 直接通过d = obj.properties获取的,d的值全部都是None,必须要再wmi_property(key).value才能获取到值
– 当然也可以直接通过property_key访问,但是这样就写死了。如果只想获取特定的键,可以用此方法。如
# MSFT_PhysicalDisk
w = wmi.WMI(namespace=r"Microsoft\Windows\Storage") # 指定命名空间
l = []
for obj in w.query("SELECT * FROM MSFT_PhysicalDisk"):
l.append(obj.DeviceId)
只需获取DeviceId键就可以这样,注意:property_key不区分大小写(dEvIcEiD),但为了避免挨揍,还是老老实实的好
如何区别这四个?
– 额,其实我也分不太清。各取所需吧
– 个人认为,Win32_PhysicalMedia是偏重底层的,包括但不局限于硬盘
– 因为这个class内MediaType键的值都是Tape Cartridge/ZIP Disk/DVD-RAM/DVD-ROM/Memory Card/Hard Disk什么的东西,不同于通过其他class的MediaType值,什么Tape Cartridge/ZIP Disk…,都是在8-Bit-Guy频道才看到过的老玩意儿
注意
1. 有些class有系统要求(比如至少Windows8以上),详情参考官方文档的Requirements部分
2. 要是想获取分区的信息,到文档里去找找相关的class,获取的方法都类似
Your writing is like a breath of fresh air in the often stale world of online content. Your unique perspective and engaging style set you apart from the crowd. Thank you for sharing your talents with us.
Hey there You have done a fantastic job I will certainly digg it and personally recommend to my friends Im confident theyll be benefited from this site