单声道确定硬盘序列号?

时间:2012-02-26 20:31:52

标签: c# mono hardware uniqueidentifier serial-number

我正在使用C#开发一个库,使用这3个变量

生成一个唯一的硬件ID
  1. 机器名称
  2. MAC地址
  3. 硬盘序列号
  4. 我能够在.NET和Mono中获取机器名称和MAC地址,但我只能在.NET中获取硬盘驱动器序列号。有没有人知道是否有任何可能的方法来获取单声道硬盘序列号或我应该只使用另一个变量(即:CPU名称,主板ID等)?

2 个答案:

答案 0 :(得分:1)

根据this documentation

  

Mac OS X不支持从用户级应用程序获取硬盘序列号

如果要求作为root用户不是你的问题(或者你跳过mac版本),我有一个蛮横的方法来解决问题:

使用this articlethis问题,您可以确定:

  1. 您运行的是Mono还是.NET
  2. 你在哪个平台
  3. 如果您知道自己在LINUX系统上,那么可以通过running system command Disk Utility来获得连续硬件序列号:

    /sbin/udevadm info --query=property --name=sda
    

    在Mac上,您可以使用{{3}}(以root身份)获取硬盘序列号。在Windows上,您可以使用标准方法。

答案 1 :(得分:1)

您也可以使用ioreg的用户权限获取

来自shell的

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;
    }