2011-04-15 153 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