我尝试使用wmi来获取硬盘的序列号。我做的是这样的:
启动ipython并使用以下方式获取序列号:
import wmi
c = wmi.WMI()
for x in c.Win32_PhysicalMedia():
print x结果如下所示:
instance of Win32_PhysicalMedia
{
SerialNumber = "2020202020202020202020205635514d385a5856";
Tag = "\\\\.\\PHYSICALDRIVE0";
};但我的计算机是win7,我使用管理员权限启动ipython,然后再次执行相同的操作,但现在结果不同:
instance of Win32_PhysicalMedia
{
SerialNumber = " 5VMQZ8VX";
Tag = "\\\\.\\PHYSICALDRIVE0";
};我猜第二个结果更像是一个正确的结果。那么谁能告诉我在windows上获取序列号的正确方法,包括XP,Vista,Win7,Win8?
我发现很多人使用CreateFileA和DeviceIoControl来获取序列号。
发布于 2012-03-13 20:12:41
如果你在谷歌上搜索"Win32_PhysicalMedia",第二个结果是一个错误报告,现在我仔细阅读了所有内容,它看起来准确地描述了你的问题(但从我看到的情况来看,它没有提供任何修复):http://connect.microsoft.com/VisualStudio/feedback/details/623282/win32-physicalmedia-returns-incorrect-serial-number-on-vista-or-higher-when-run-as-standard-user
因此,你可能不得不自己动手解决问题。这是我最初在这个答案中写的:
看看这两个字符串:
2020202020202020202020205635514d385a5856
5VMQZ8VX (yes there's a space in front)请注意,第一个显示为十六进制数。0x20是一个空格字符。因此,第一个序列号有许多空格,后面跟着几个字节的实际数据,这使得两个序列号在大小上具有可比性。
现在,使用十六进制到ASCII码的转换器,比如http://www.dolcevie.com/js/converter.html,然后输入第一个数字。你会得到:
V5QM8ZXV看看这看起来有多相似?现在唯一的区别是字节排序(字节顺序)。
要一劳永逸地解决这个问题,您需要告诉我们您认为这三个序列号中的哪一个是序列号的“适当”表示(理想情况下,它将与驱动器上打印的内容相匹配)。一旦弄清楚所处的位置(显然取决于平台--可能取决于Python、WMI或您正在使用的Python WMI模块的版本),就可以很容易地在三种表示形式之间进行转换。
发布于 2020-11-29 08:47:14
迟到比以往任何时候都好,我希望这对其他人有帮助。我不知道从哪拿来的。
import wmi
c = wmi.WMI()
hddSerialNumber = c.Win32_PhysicalMedia()[0].wmi_property('SerialNumber').value.strip()
print(hddSerialNumber)发布于 2012-03-13 20:16:03
>>> import binascii
>>> binascii.a2b_hex("2020202020202020202020205635514d385a5856")
' V5QM8ZXV'替换字符被交换...看起来它们可能是相同的序列号。
https://stackoverflow.com/questions/9683278
复制相似问题