2011-04-15 141 views
8

的序列號起初,它可能看起來這是很容易的問題,一些機構可能試圖給我建議嘗試谷歌,它可能是這樣。 但對我來說這是很難我有嘗試谷歌,堆棧溢出,找不到什麼好的解決辦法。硬盤或硬盤驅動器

只是想硬盤或硬盤驅動器的序列號使用C#

請仔細閱讀:序列號的硬盤,但硬盤容量不序號(如C,d,E等)。

對於硬盤容量的越來越序列號,我發現網上的解決方案,它的工作很好,但問題是獲取硬盤的序列號。

一些機構可能會試圖使這個問題如下樁溢出問題的可能拷貝或者可能表明問題的鏈接。但它不是

而且沒有任何下文問題提供了針對此問題在C#中很好的解決方案:

  1. How to get Hard-Disk SerialNumber in C# (no WMI)?
  2. How to retrieve HDD Firmware Serial number in .net?
  3. Hdd Serial Number
+1

我不明白。您已經提供了答案的鏈接。這是你非常喜歡的截圖底部的文章。什麼是關於C++的「無聊」? – 2011-04-15 11:32:35

+0

更重要的是,爲什麼這麼多人需要找出我的硬盤的序列號?這個問題被問了很多(你已經發現至少有3個重複項),考慮到*絕對沒有有效的用例*。卷序列號是你可能*關心的唯一的東西;這是唯一重要的事情。 – 2011-04-15 11:33:36

+0

因爲我嘗試但不能在C#中實現它.....我和我使用硬盤序列號爲我們的應用程序,它只能在客戶端PC上運行,如果它發現我們的可執行數據庫中的客戶端PC的硬盤序列號應用程序.....在短,它匹配數據庫中的硬盤序列號1和從客戶端PC獲得運行時.........如果發現比我們的應用程序運行......... – Pritesh 2011-04-15 11:42:36

回答

8

這是最終的解決方案:

Get Physical HDD Serial Number without WMI

寫很多代碼:

DriveListEx diskInfo = new DriveListEx(); 
diskInfo.Load(); 
string serialNo = diskInfo[0].SerialNumber; 

不要忘了補充參考DriveInfoEx.dll

+1

爲什麼不簡單*將非託管C++代碼從DLL轉換爲託管C#?它沒有做任何託管語言中不可能的事情。然後消除對第三方DLL的依賴。 – 2011-04-20 03:47:36

+0

@科迪格雷,但對我來說,這是更難.......或者我甚至不嘗試.........如果你可以發佈它在這裏我會接受你的答案... ........謝謝....... – Pritesh 2011-04-20 04:19:32

+1

好的解決方案:但有些時候它不工作...我在4個電腦上嘗試過,它不能在第一臺電腦上工作,但在右鍵單擊時工作EXE並選擇「以管理員身份運行」選項。對於第二臺和第三臺PC來說工作良好...在沒有管理員權限的第四臺電腦上,它並沒有工作,因爲發生異常。 – 2011-08-12 08:03:48

4

看到這個

http://www.codeproject.com/KB/system/GetHardwareInformation.aspx 

只是從那裏下載演示,並選擇「數據存儲」選項卡,並從中選擇Win32_DiskDrive,您將獲得所有磁盤驅動器(硬盤)下面提及的信息,並在sectorpertrack之後和簽名屬性之前看到一個屬性「SerialNumber」...

enter image description here

+1

我已經試過了ti不提供系列號的硬盤........ – Pritesh 2011-04-15 11:10:38

+0

看到我編輯的答案.. – asharajay 2011-04-15 11:24:35

+1

你可以看到屏幕截圖belove鏈接當我運行應用程序時會發生什麼.... ....你不會找到「SerialNumber」字段.... LINK:http://pritesharyan.weebly.com/question3.html – Pritesh 2011-04-15 11:36:27

2

我發現最好的辦法是:

  1. 下載該.dll從here

  2. 添加。DLL以項目

  3. 添加以下代碼:

    [DllImportAttribute("HardwareIDExtractorC.dll")]
    public static extern String GetIDESerialNumber(byte DriveNumber);

  4. 呼叫從在你需要它的硬盤ID:

    GetIDESerialNumber(0).Replace(" ", string.Empty);

注:轉到exp中的dll屬性lorer並將Build Action設置爲Embedded Resource

+0

@Azar Bandri,好的,非常感謝你分享你的搜索..... – Pritesh 2012-09-30 10:04:31

1
// Function driveser (model) 
// Returns the serial number of the drive specified in "model" or an empty string. 
// Please include this is you are going to use it. 
// (C) By Zibri 2013 
// Free for non commercial use. 
// zibri AT zibri DOT org 

public string driveser(string model) 
{ 
    string functionReturnValue = null; 
    string devid = ""; 
    functionReturnValue = ""; 
    try { 
     ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_DiskDrive WHERE Model LIKE '%" + model + "%'"); 
     foreach (ManagementObject queryObj in searcher.Get()) { 
      if (!string.IsNullOrEmpty(queryObj("SerialNumber"))) 
       functionReturnValue = queryObj("SerialNumber"); 
      Debug.Print(queryObj("Model") + ":" + functionReturnValue); 
     } 
    } catch (ManagementException err) { 
     Debug.Print("An error occurred while querying for WMI data: " + err.Message); 
    } 
    return functionReturnValue; 
} 
1

我帶着ILSpy(http://ilspy.net/)一看就System.IO.DriveInfo類,我想通了 這個代碼,似乎很好地工作:

'------------------------------------------------------ 
' Declaration found in Microsoft.Win32.Win32Native 
'------------------------------------------------------ 
Friend Declare Auto Function GetVolumeInformation Lib "kernel32.dll" (drive As String, <Out()> volumeName As StringBuilder, volumeNameBufLen As Integer, <Out()> ByRef volSerialNumber As Integer, <Out()> ByRef maxFileNameLen As Integer, <Out()> ByRef fileSystemFlags As Integer, <Out()> fileSystemName As StringBuilder, fileSystemNameBufLen As Integer) As Boolean 

'------------------------------------------------------ 
' Test in my Form class 
'------------------------------------------------------ 
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click 
    Try 
     Dim volumeName As StringBuilder = New StringBuilder(50) 
     Dim stringBuilder As StringBuilder = New StringBuilder(50) 
     Dim volSerialNumber As Integer 
     Dim maxFileNameLen As Integer 
     Dim fileSystemFlags As Integer 
     If Not GetVolumeInformation("C:\", volumeName, 50, volSerialNumber, maxFileNameLen, fileSystemFlags, stringBuilder, 50) Then 
      Dim lastWin32Error As Integer = Marshal.GetLastWin32Error() 
      MsgBox("Error number:" & lastWin32Error) 
     Else 
      MsgBox(volSerialNumber.ToString("X")) 
     End If 

    Catch ex As Exception 
     MsgBox(ex.ToString()) 
    End Try 
End Sub