如何在 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 - 如何传递一个 API 调用获得的字符串来调用另一个 API 调用
获取电脑硬件信息(CPU,主板,显卡,硬盘,之类) API是啥?