2012-02-26 73 views
1

我開發的C#庫,使用這3個變量確定單聲道硬盤序列號?

生成一個唯一的硬件ID
  1. 機器名
  2. MAC地址
  3. 硬盤序列號

我能得到在.NET和Mono中的機器名稱和MAC地址,但我只能在.NET中獲得硬盤序列號。有誰知道是否有任何可能的方式獲得單聲道的硬盤序列號或應該只使用另一個變量(即:CPU名稱,主板ID等)?

+0

注意的是,機器名和MAC地址可以手動進行設置,因此他們不是真正獨一無二的。 – 2012-02-27 00:51:52

+0

GUID基於MAC地址... – ub3rst4r 2012-02-27 07:08:10

+0

而MAC地址可能被欺騙:http://osxdaily.com/2008/01/17/how-to-spoof-your-mac-address-in-mac -os-x /您不能認爲它對於特定計算機上的特定以太網接口是唯一的。 – 2012-02-27 12:40:15

回答

1

根據this documentation

的Mac OS X不支持從用戶級應用

獲得硬盤序列號如果需求是在Mac根本不是問題您(或您跳過Mac版),我要解決的問題一個畜生道:

使用this articlethis問題,你可以判斷:

  1. 你在

如果你知道你是在Linux系統上,你可以得到的hardrive串行通過running這樣system command運行單聲道或.NET

  • 哪個平臺是你:

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

    在mac上,您可以使用Disk Utility(以root身份)獲取硬盤序列號。在Windows上,您可以使用標準方法。

  • +0

    謝謝!我可能必須恢復到MAC OSX的唯一標識符原因的不同變量。 – ub3rst4r 2012-02-27 05:36:44

    1

    你可以得到它也與名爲ioreg

    從shell用戶權限:

    名爲ioreg -p IOService的-n AppleAHCIDiskDriver -r | grep的\ 「序列號\」 | awk的「{$打印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; 
        }