获取硬盘的序列号信息

      通过系统接口来获取机器的硬盘信息是编程中常遇见的小问题。

 

      一般情况下,我们常用GetLogicalDrives,GetDriveType这两个API来获取当前系统下,硬盘的逻辑分区信息,以及各个分区的硬件类型。

 

      这次要做的是获取硬盘的系列号信息。

 

      在网上有朋友提供一种以DeviceIoControl函数为核心的办法。通过该函数,发送IOCTL系列的指令,来访问设备的驱动,从而获取指定的信息,或者发送相应的指令。从MSDN上的注释来看,具备访问和控制的综合功能。

 

      但是,这个方法的使用过程中遇见了两个问题。

 

      第一.DeviceIoControl缺乏“自适应性”。

      

             BOOL DeviceIoControl(
                                                   HANDLE hDevice,
                                                   DWORD dwIoControlCode,
                                                   LPVOID lpInBuffer,
                                                   DWORD nInBufferSize,
                                                   LPVOID lpOutBuffer,
                                                   DWORD nOutBufferSize,
                                                   LPDWORD lpBytesReturned,
                                                   LPOVERLAPPED lpOverlapped
                                                 );

 

      我不知道用这个词来概括是否合适——简单地说,原因主要是它必须有程序员来进行错误处理。这个函数的返回值里有一对关于返回数据长度和返回数据指针的参数(即lpOutBuffer和lpBytesReturned),但是这个长度没有任何说服力——经常我们可以用这样的函数进行预读操作,从而获取实际结果需要的空间长度,并由此进行内存分配,但是这个函数没有这个能力。我所能做的就是尽可能的进行估计,然后尽可能的开足够大的空间,显得有点笨拙。

 

      写到这里的时候我觉得其实也可以写个循环,检测范围值是否为122号错误(空间不够),然后再增值空间的写法。这样也许能科学一点。

 

       第二.关于IOCTL的几个码定义

      

       有如下几个定义:

                              #define DFP_GET_VERSION        0x00074080
                              #define DFP_SEND_DRIVE_COMMAND 0x0007c084
                              #define DFP_RECEIVE_DRIVE_DATA 0x0007c088

 

       2号参数DWORD dwIoControlCode可以通过宏进行生成

 

       #define CTL_CODE(DeviceType, Function, Method, Access) (
       ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))

 

     

      在CSDN上看到过一个朋友这样的文字:

 

       “通常情况下,我们通过0XEC命令对IDE端口进行监测.获取硬盘信息.    
          一般情况下,我们就写个VXD或者DRIVER来完成.但是现在,通过MS的S.M.A.R.T.接口,我们可以直接从RING3调用

          API    DeviceIoControl()来获取硬盘信息.”

 

        后来经过查找,找到了以上定义的原版

 

        SMART_GET_VERSION

        SMART_RCV_DRIVER_DATA

        SMART_SEND_DRIVE_COMMAND

 

        这些值涵盖了上述的各个解释(http://www.77169.com/classical/HTML/36929.html),这个链接的位置有较为详细的描述。

 

        后记:

        SMART接口的使用和相关知识做一个后续的学习,补上这一课。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Python中,可以使用`wmi`模块来获取硬盘序列号。`wmi`是一个用于访问Windows管理信息的Python扩展模块。 首先,需要使用`pip`命令安装`wmi`模块: ``` pip install wmi ``` 然后,可以使用以下代码获取硬盘序列号: ```python import wmi def get_disk_serial_number(): c = wmi.WMI() for disk in c.Win32_DiskDrive(): return disk.SerialNumber.strip() serial_number = get_disk_serial_number() print("硬盘序列号:", serial_number) ``` 在这个例子中,我们使用`wmi.WMI()`创建了一个WMI()对象,通过遍历`Win32_DiskDrive()`获取硬盘序列号,并将其作为字符串返回。最后,打印出获得的硬盘序列号。 需要注意的是,`wmi`模块在Windows系统上可用,如果在其他操作系统上运行,可能需要使用其他的方法来获取硬盘序列号。 ### 回答2: 要获取硬盘序列号,可以使用Python中的`wmi`模块。`wmi`模块可以用于访问Windows管理接口,从而获取系统硬件信息。 首先,需要使用命令`pip install wmi`来安装`wmi`模块。 下面是一个获取硬盘序列号的示例代码: ```python import wmi def get_disk_serial(): c = wmi.WMI() disks = c.Win32_DiskDrive() serial_numbers = [] for disk in disks: serial_numbers.append(disk.SerialNumber) return serial_numbers disk_serials = get_disk_serial() for serial_number in disk_serials: print("硬盘序列号: " + serial_number) ``` 在上述代码中,我们首先导入`wmi`模块,然后定义一个名为`get_disk_serial()`的函数,用于获取硬盘序列号。在函数内部,我们使用`wmi.WMI()`创建了一个WMI对象,然后使用`c.Win32_DiskDrive()`获取所有硬盘信息。 接下来,我们使用一个循环遍历所有硬盘,并获取它们的序列号,将这些序列号保存在一个列表中。最后,我们返回这个列表。 在主程序中,我们调用`get_disk_serial()`函数来获取硬盘序列号,并使用一个循环打印每个硬盘序列号。 请注意,这段代码只适用于Windows系统。对于其他操作系统,获取硬盘序列号的方法可能会有所不同。 ### 回答3: 在Python中,可以使用`psutil`库来获取硬盘序列号。 `psutil`是一个跨平台库,它允许我们获取系统相关信息,包括CPU、内存、磁盘、网络等。 首先,我们需要确保已经安装了`psutil`库。可以使用以下命令来安装它: ``` pip install psutil ``` 接下来,我们可以使用如下代码来获取硬盘序列号: ```python import psutil def get_disk_serial(): partitions = psutil.disk_partitions() for partition in partitions: try: disk = psutil.disk_usage(partition.mountpoint) disk_serial = disk.serial_number if disk_serial: return disk_serial except Exception: pass return None serial_number = get_disk_serial() if serial_number: print("硬盘序列号为:", serial_number) else: print("未能获取硬盘序列号") ``` 上述代码中,`psutil.disk_partitions()`函数用于获取系统中的分区信息。然后,我们遍历每个分区并使用`psutil.disk_usage()`函数来获取磁盘的使用情况。`disk.serial_number`属性可用于获取磁盘的序列号。如果找到了有效的序列号,则返回它。 需要注意的是,对于某些操作系统或系统配置,获取硬盘序列号可能受到限制或不可行。在这种情况下,上述代码可能返回`None`。 上述代码可以在Windows、Linux和Mac操作系统上运行,并返回硬盘序列号(如果可获取)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值