如何在 Lua 上使用 Win API 获取硬盘的序列号

Posted

技术标签:

【中文标题】如何在 Lua 上使用 Win API 获取硬盘的序列号【英文标题】:How to get the serial number of the hard disk using Win API on Lua 【发布时间】:2019-08-11 21:31:09 【问题描述】:
local ffi = require("ffi")
ffi.cdef[[
  int __stdcall GetVolumeInformationA(
  const char* lpRootPathName,
  char* lpVolumeNameBuffer,
  uint32_t nVolumeNameSize,
  uint32_t* lpVolumeSerialNumber,
  uint32_t* lpMaximumComponentLength,
  uint32_t* lpFileSystemFlags,
  char* lpFileSystemNameBuffer,
  uint32_t nFileSystemNameSize
);
]]
local serial = ffi.new("unsigned long[1]", 0)
ffi.C.GetVolumeInformationA(nil, nil, 0, serial, nil, nil, nil, 0)
serial1 = serial[0]

这将给出逻辑驱动器的序列号,我需要获取硬盘驱动器的序列号。我怎样才能得到它?

【问题讨论】:

*** 上有很多关于如何检索您想要的序列号的问题。 我需要通过脚本的序列号进行许可证检查。我对其他方式不感兴趣。 这并没有改变我所说的。 【参考方案1】:

wmic 不是 WinAPI 的一部分,但它提供了更简单的解决方案:

local function get_HDD0_serial()
   local pipe = io.popen"wmic diskdrive where(index=0) get serialnumber /value"
   local serial = (pipe:read"*a":match"SerialNumber=([^\r\n]*)" or ""):match"^(.-)%s*$"
   pipe:close()
   return serial
end

print(get_HDD0_serial())

如果你只想要 WinAPI 解决方案,你可以使用 getWmiQueryResult 重写它

【讨论】:

太酷了。谢谢你。但我还有另一个问题。该脚本适用于全屏应用程序。执行 io.popen 后,将其最小化。是否可以让它在后台运行? @Darexu - 不在纯 Lua 中。可能,您确实需要 FFI 才能访问 getWmiQueryResult(或其他一些 WinAPI 函数)。

以上是关于如何在 Lua 上使用 Win API 获取硬盘的序列号的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Lua C API 获取由 lua 设置的元表

如何使用 C# 拦截 Win32 API 调用?

Lua - 如何传递一个 API 调用获得的字符串来调用另一个 API 调用

获取电脑硬件信息(CPU,主板,显卡,硬盘,之类) API是啥?

玩转Win10自带BitLocker加密U盘、硬盘分区,忘记BitLocker密码也不怕!

如何使用 win32 api 获取域用户帐户列表?