怎么用脚本获取硬盘序列号

wen 实用脚本 2

硬盘序列号取证与自动化:三种脚本获取方案(WMI/PowerShell/注册表)


目录导读

  1. 为什么需要脚本获取硬盘序列号?(场景与合规)
  2. 环境准备:Windows与Linux下的权限与命令差异
  3. PowerShell + WMI(最通用,支持Win7+)
  4. cmd + wmic(兼容老系统)
  5. 注册表直读(无WMI依赖的极速方案)
  6. Linux/macOS下的Shell替代方案
  7. 防坑指南:虚拟机、RAID、U盘的特殊序列号处理
  8. 常见问题问答(Q&A)

为什么需要脚本获取硬盘序列号?

怎么用脚本获取硬盘序列号

在IT资产盘点、软件授权绑定、日志审计中,硬盘物理序列号(非卷标)是唯一且不可修改的硬件指纹,相比MAC地址可伪装,硬盘序列号被用于防止虚拟机克隆导致的软件许可冲突,手动通过diskpart或设备管理器查看效率低,且无法批量处理,脚本化能够实现五分钟内扫描全公司200台PC的运维需求,同时满足ISO 27001的资产审计要求。

环境准备:权限与命令差异

  • Windows:需要以管理员身份运行PowerShell或CMD(否则无法读取物理驱动器的SMART信息)。
  • Linux:需要root权限,或使用sudo执行hdparm/smartctl
  • 跨平台注意事项:PowerShell Core(v6+)可运行于Linux,但WMI类库不可用,需改用Get-Disk(Storage模块)返回的SerialNumber属性。

方案一:PowerShell + WMI(最通用)

Get-WmiObject Win32_PhysicalMedia | Select-Object Tag, SerialNumber
  • 解析Win32_PhysicalMedia直接对应物理磁盘(非分区)。SerialNumber字段通常为厂商写入的ASCII字符串,若为空(常见于NVMe SSD),则回退到Win32_DiskDriveSerialNumber属性(注意该属性可能包含空格)。
  • 优化脚本:排除虚拟磁盘或U盘,只保留InterfaceType='SCSI'ModelVirtual的条目。

方案二:cmd + wmic(兼容老系统)

wmic diskdrive get serialnumber
  • 注意:Windows 11 24H2已移除wmic.exe,但Win7/Server 2008仍可用,若提示“无效别名”,请使用方案一的PowerShell。
  • 变通技巧:通过wmic path win32_physicalmedia get serialnumber获取底层物理序列号(结果与方案一相同)。

方案三:注册表直读(无WMI依赖)

Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Enum\SCSI\Disk&Ven_*" -Recurse | ForEach-Object {
    $serial = $_.PSChildName -split '&' | Select-Object -Last 1
    if ($serial -match '^[A-Za-z0-9]{4,}$') { $serial }
}
  • 原理:注册表内的FriendlyNameDeviceInstance中包含了序列号(如ST500DM002-1BC142),但需要二次过滤厂商前缀,此方法不依赖WMI服务,适合系统服务被禁用时的应急排查。

Linux/macOS下的Shell替代方案

# Linux(需安装smartmontools)
sudo hdparm -i /dev/sda | grep SerialNo
# macOS(使用diskutil)
diskutil info disk0 | grep "Disk / Device" -A5 | grep "Serial Number"
  • 补充:对于NVMe设备,Linux使用nvme id-ctrl /dev/nvme0n1可读取sn字段,避免smartctl因驱动问题报错。

防坑指南:虚拟化与特殊硬件

  • 虚拟机(VMware/Hyper-V):序列号常为“Virtual”或空白,若需唯一标识,应同时读取Win32_BIOSSerialNumber(虚拟机的BIOS序列号有UUID前缀)。
  • RAID阵列:脚本读取的是逻辑卷序列号,并非物理磁盘,如需底层物理盘序列号,必须通过storcli(LSI)或ssacli(HP)等厂商工具,但这类工具不通用。
  • U盘/移动硬盘Win32_PhysicalMedia会返回它们,过滤条件为MediaType不等于Removable Media

常见问题问答(Q&A)

Q1:为什么我获取的序列号中间有空格,且包含“-”号? A:这是正常现象,例如希捷硬盘序列号是“9QM2A3B4”,但西部数据通常为“WD-WCC6Y2Z1K8X2”,PowerShell的Trim()方法可以删除首尾空格,但中间的连字符建议保留,因为它是型号代码的一部分。

Q2:脚本在普通用户下运行报“拒绝访问”怎么办? A:方案一需要管理员权限,若环境不允许提权,可改用方案二(wmic在部分系统允许普通用户读取),但Windows 11 22H2后可能失效,终极方案是使用Get-CimInstance(CIM替代WMI)偶尔可绕过权限限制,但成功率不稳定。

Q3:如何将脚本结果导出为CSV用于资产登记? A:在PowerShell命令后追加管道:... | Export-Csv -Path D:\disk_serial.csv -NoTypeInformation -Encoding UTF8


本文提供了从Windows到Linux的跨平台脚本获取硬盘序列号的完整方案,重点推荐PowerShell WMI方法作为首选,因其兼顾兼容性与输出结构化数据,对于批量运维场景,可结合for循环读取多台远程计算机(需开启WinRM),序列号是硬件的“身份证”,在虚拟化环境中请务必交叉验证,避免因设备克隆导致授权误判。

抱歉,评论功能暂时关闭!