【问题标题】:Serial number of Hard Disk or Hard Drive硬盘或硬盘驱动器的序列号
【发布时间】:2011-08-06 06:06:29
【问题描述】:

起初,这似乎是一个非常简单的问题,并且某些机构可能试图给我建议尝试使用 Google,它可能是这样。 但对我来说,我尝试了 Google、Stack Overflow 并找不到任何好的解决方案。

只想使用 C# 获取硬盘或硬盘的序列号

请仔细阅读:硬盘序列号,而不是硬盘卷的序列号(例如C、D、E等)。

为了获取硬盘卷的序列号,我在网上找到了解决方案并且效果很好,但问题是获取硬盘的序列号。

一些机构可能试图将此问题作为以下 Stake Overflow 问题的可能副本,或者可能会建议该问题的链接。但它不是

在 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

【问题讨论】:

  • 我不明白。您已经提供了答案的链接。这是最底部的文章,带有您非常喜欢的屏幕截图。 C++ 有什么“无聊”的地方?
  • 更重要的是,为什么这么多人需要找出我的硬盘序列号?考虑到绝对没有有效的用例,这个问题被问了很多(您已经发现了至少 3 个重复项)。卷序列号是您可能唯一关心的;这是唯一重要的事情。
  • 因为我尝试但无法在 C# 中实现它.....并且我为我们的应用程序使用硬盘的序列号,如果它找到客户端 PC 的硬盘序列号,它只能在客户端 PC 中运行在我们应用程序的可执行文件数据库中......在简短的情况下,它与数据库中的硬盘序列号 1 和运行时从客户端 PC 获取的硬盘序列号匹配............如果找到比我们的应用程序将运行.....
  • @CodyGray 我确信有一个用例考虑到这个问题有 6k 视图。我正在开展一个项目,我们正在更换旧硬盘并需要硬盘序列号。我正在寻找一种远程提取此信息的方法。

标签: c# .net hard-drive serial-number


【解决方案1】:

这是最终的解决方案:

Get Physical HDD Serial Number without WMI

写这么多代码:

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

别忘了添加对DriveInfoEx.dll的引用。

【讨论】:

  • 为什么不简单地将非托管 C++ 代码从 DLL 翻译 到托管 C#?它没有做任何托管语言不可能的事情。然后消除对第三方 DLL 的依赖。
  • @Cody Gray,但对我来说更难......或者我什至还没尝试......如果你能把它贴在这里我会接受你的回答............谢谢............
  • 很好的解决方案:但有时它不起作用...我在 4 台电脑上尝试过,它在第一台电脑上不起作用,但在右键单击 EXE 并选择“以管理员身份运行”时起作用选项..在第 2 台和第 3 台电脑上运行良好......在第 4 台没有管理员权限的电脑上,它没有工作,因为发生了异常......
  • DriveInfoex.dll 不适用于 Windows 7 操作系统。它抛出以下错误 System.IO.FileLoadException:无法加载文件或程序集“DriveInfoEx.dll”或其依赖项之一。此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。 (HRESULT 异常:0x800736B1)
  • @EvgeniyKrechun,请详细说明是什么意思?
【解决方案2】:

看到这个

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

只需从那里下载演示并选择“数据存储”选项卡并从中选择 Win32_DiskDrive,您将获得下面提到的所有磁盘驱动器(硬盘)的信息,并在 Sectorpertrack 之后和签名属性之前看到一个属性“SerialNumber”...

【讨论】:

  • 你可以在 belove 链接上看到屏幕截图,当我运行应用程序时会发生什么......你不会找到“SerialNumber”字段......链接:pritesharyan.weebly.com/question3.html跨度>
  • 可能是系统问题。我用谷歌搜索了一下,据说很多解决方案在 Windows XP 和 64 位 Windows 系统上都不起作用。您可能需要根据软件应在其上运行的系统找到多种解决方案
  • 不,我不这么认为是 WinXp 的问题。 bz 我在 WinXP 中将它用于应用程序注册目的我想要硬盘序列号、主板和处理器......用于制作产品密钥。当时它工作正常..意味着我得到了一切......我认为它的硬盘驱动器/主板/IDE控制器的概率......但我不是合适的人来回答这个问题是硬件问题......对不起亲爱的..
  • @jAX,没关系,亲爱的........我也用于同样的目的......但我很高兴感谢您的回复...... .......
【解决方案3】:

我找到的最好方法是:

  1. here下载.dll

  2. 将 .dll 添加到您的项目中

  3. 添加此代码:

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

  4. 从你需要的地方调用硬盘ID:

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

注意:在资源管理器中进入dll的属性,将Build Action设置为Embedded Resource

【讨论】:

    【解决方案4】:
    // 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;
    }
    

    【讨论】:

      【解决方案5】:

      我用 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
      

      【讨论】:

        猜你喜欢
        • 2010-10-15
        • 2020-07-15
        • 2012-02-08
        • 2023-03-31
        • 2014-02-26
        • 2018-01-26
        • 2017-01-27
        • 1970-01-01
        • 2011-05-04
        相关资源
        最近更新 更多