最初はとても簡単な質問のように思えるかもしれませんし、Googleを試すためのアドバイスを私に与えようとしている人もいるかもしれません。しかし、私にとっては、Google、Stack Overflowを試してみるのは非常に難しく、適切な解決策を見つけることができません。
C#を使用してハードディスクまたはハードディスクのシリアル番号を取得したいだけです
注意深くお読みください:ハードディスクのシリアル番号。ただし、ハードディスクのボリュームのシリアル番号(C、D、Eなど)はお読みください。
ハードディスクのシリアル番号を取得するために、ネット上で解決策を見つけましたが、問題はハードディスクのシリアル番号の取得にあります。
一部の団体は、以下のステークオーバーフローの質問の可能なコピーとしてこの質問を作成しようとしたり、その質問のリンクを提案したりする場合があります。そうではありません
そして、以下の質問はC#でこの問題の良い解決策を提供しません:
これが最終的な解決策です。
これだけのコードを書いてください:
DriveListEx diskInfo = new DriveListEx();
diskInfo.Load();
string serialNo = diskInfo[0].SerialNumber;
DriveInfoEx.dll
への参照を追加することを忘れないでください。
これを見てください
http://www.codeproject.com/KB/system/GetHardwareInformation.aspx
そこからデモをダウンロードして[データストレージ]タブを選択し、ここからWin32_DiskDriveを選択すると、以下に記載されているすべてのディスクドライブ(HardDisk)の情報が表示され、sectorpertrackの後および署名プロパティの前に1つのプロパティ "SerialNumber"が表示されます。
私が見つけた最良の方法は次のとおりです。
ここ から.dllをダウンロードします
プロジェクトに.dllを追加します
このコードを追加します:
[DllImportAttribute("HardwareIDExtractorC.dll")]
public static extern String GetIDESerialNumber(byte DriveNumber);
必要な場所からハードディスクIDを呼び出します。
GetIDESerialNumber(0).Replace(" ", string.Empty);
注:エクスプローラーでdllのプロパティに移動し、Build Action
をEmbedded Resource
に設定します。
// 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;
}
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