首页 文章

硬盘或硬盘的序列号

提问于
浏览
8

起初看起来这可能是一个非常简单的问题,有些机构可能会试图给我建议尝试谷歌,也可能是这样 . 但对我来说,我很难尝试Google,Stack Overflow并且找不到任何好的解决方案 .

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

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

为了获得硬盘卷的序列号,我在网上找到了解决方案并且工作正常,但问题在于获取硬盘的序列号 .

有些机构可能会尝试将此问题作为下面的“放样溢出”问题的副本,或者可能会建议该问题的链接 . 但事实并非如此

并且以下任何问题都没有为C#中的这个问题提供良好的解决方案:

5 回答

  • 2

    这是最终的解决方案:

    Get Physical HDD Serial Number without WMI

    写这么多代码:

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

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

  • 1

    看到这个

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

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

    enter image description here

  • 1

    我发现的最好方法是:

    • here下载.dll

    • 将.dll添加到项目中

    • 添加此代码:

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

    • 从您需要的位置调用硬盘ID:

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

    注意:转到资源管理器中的dll属性并将 Build Action 设置为 Embedded Resource .

  • 8
    // 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;
    }
    
  • 4

    我看了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
    

相关问题