在Windows环境下用Python获取到硬盘的详细信息

注意:
获取到的信息是硬盘级别的,而不是和分区有关的信息

*相关参考链接
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什么的(个人理解)


Redkey

事出有因,最近看到LTT的一个视频,是一个讲Redkey的数据抹除工具,红钥匙样,嵌一个USB,主要功能就是提供“高级别的数据抹除”,甚至于说有些算法还是军用级别的,挺高大上。点我进入官网(https://redkeyusb.com/)
看视频的时候就听见加拿大白嫖王竟然吐槽这玩意儿还挺贵,打开官网一看!
我不说,各位细品
Home

Professional

Ultimate

淦,看来真的是贫穷限制了我的想象力
一个家庭版的不打折卖300多,打了折还有150差不多
更别说究极版了,原价650差不多,打了折还有500左右
我寻思着,你要是个杀毒软件卖这价我还能接受
可就是个随身带的数据清除工具啊,我做个引导盘,随便整一个开源的数据清除软件,成本估计连个零头都占不到
不愧瞄准的是高端市场和特殊人群,就是有勇气喊出这个价,不得不佩服
瞧这酷炫的UI
Redkey 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,获取的方法都类似

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇