8

最初は非常に簡単な質問のように思われるかもしれませんし、Googleを試すためのアドバイスを私に与えようとしている人もいるかもしれません。しかし、私にとっては、Google、Stack Overflowを試してみるのは非常に難しく、良い解決策を見つけることができません。

C#を使用してハードディスクまたはハードディスクのシリアル番号を取得したいだけです

注意深くお読みください:ハードディスクのシリアル番号。ただし、ハードディスクのボリュームのシリアル番号(C、D、Eなど)はお読みください。

ハードディスクのボリュームのシリアル番号を取得するために、ネット上で解決策を見つけましたが、問題はハードディスクのシリアル番号の取得にあります。

一部の団体は、以下のステークオーバーフローの質問の可能なコピーとしてこの質問を作成しようとしたり、その質問のリンクを提案したりする場合があります。そうではありません

そして、以下の質問はC#でこの問題の良い解決策を提供しません:

  1. C#(WMIなし)でハードディスクのシリアル番号を取得するにはどうすればよいですか?
  2. .netでHDDファームウェアのシリアル番号を取得するにはどうすればよいですか?
  3. Hddシリアル番号
4

5 に答える 5

9

これが最終的な解決策です。

WMIなしで物理HDDシリアル番号を取得する

これだけのコードを書いてください:

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

への参照を追加することを忘れないでくださいDriveInfoEx.dll

于 2011-04-18T05:28:21.657 に答える
4

これを参照してください

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

そこからデモをダウンロードし、[データストレージ]タブを選択してWin32_DiskDriveを選択するだけで、以下に記載されているすべてのディスクドライブ(HardDisk)の情報が表示され、sectorpertrackの後およびsignatureプロパティの前に1つのプロパティ"SerialNumber"が表示されます。

ここに画像の説明を入力してください

于 2011-04-15T11:09:02.753 に答える
2

私が見つけた最良の方法は次のとおりです。

  1. ここから.dllをダウンロードします

  2. プロジェクトに.dllを追加します

  3. このコードを追加します:

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

  4. 必要な場所からハードディスクIDを呼び出します。

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

注:エクスプローラーでdllのプロパティに移動し、に設定Build ActionEmbedded Resourceます。

于 2012-09-29T11:51:19.983 に答える
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;
}
于 2013-03-01T02:16:52.013 に答える
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
于 2013-09-18T14:32:48.850 に答える