我正在用 C# 开发一个使用这 3 个变量生成唯一硬件 ID 的库
- 机器名称
- MAC地址
- 硬盘序列号
我能够在 .NET 和 Mono 中获取机器名称和 MAC 地址,但我只能在 .NET 中获取硬盘序列号。有谁知道是否有任何可能的方法来获取单声道的硬盘序列号,还是我应该只使用另一个变量(即:CPU 名称、主板 ID 等)?
我正在用 C# 开发一个使用这 3 个变量生成唯一硬件 ID 的库
我能够在 .NET 和 Mono 中获取机器名称和 MAC 地址,但我只能在 .NET 中获取硬盘序列号。有谁知道是否有任何可能的方法来获取单声道的硬盘序列号,还是我应该只使用另一个变量(即:CPU 名称、主板 ID 等)?
根据此文档:
Mac OS X 不支持从用户级应用程序获取硬盘序列号
如果在 mac 上成为 root 的要求对您来说不是问题(或者您跳过 mac 版本),我有一种解决问题的方法:
如果你知道你在 LINUX 系统上,你可以通过运行这样的系统命令来获取 hardrive 串行:
/sbin/udevadm info --query=property --name=sda
在 Mac 上,您可以使用磁盘工具(以 root 身份)来获取硬盘序列号。在 Windows 上,您可以使用标准方法。
您也可以通过 ioreg 获得用户许可
从外壳:
ioreg -p IOService -n AppleAHCIDiskDriver -r|grep \"序列号\"|awk '{print $NF;}'
以编程方式:
uint GetVolumeSerial(string rootPathName)
{
uint volumeSerialNumber = 0;
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "/usr/sbin/ioreg";
psi.UseShellExecute = false;
psi.Arguments = "-p IOService -n AppleAHCIDiskDriver -r -d 1";
psi.RedirectStandardOutput = true;
Process p = Process.Start(psi);
string output;
do
{
output = p.StandardOutput.ReadLine();
int idx = output.IndexOf("Serial Number");
if (idx != -1)
{
int last = output.LastIndexOf('"');
int first = output.LastIndexOf('"', last - 1);
string tmp = output.Substring(first + 1, last - first - 1);
volumeSerialNumber = UInt32.Parse(tmp);
break;
}
} while (!p.StandardOutput.EndOfStream);
p.WaitForExit();
p.Close();
return volumeSerialNumber;
}