Серийный номер жесткого диска или жесткого диска
сначала может показаться, что это очень простой вопрос, и какой-то орган может попытаться дать мне совет попробовать Google, это может быть так. Но для меня это очень сложно, я попробовал Google, Stack Overflow и не могу найти хорошего решения.
просто хотите получить серийный номер жесткого диска или жесткого диска с помощью C#
пожалуйста, внимательно прочитайте: серийный номер жесткого диска, но не серийный номер тома жесткого диска (например, C, D, E и т. д.).
для получения серийного номера тома жесткий диск я нашел решение в сети, и его работа хорошо, но проблема с получение серийного номера жесткого диска.
какой-то орган может попытаться сделать этот вопрос возможной копией ниже вопроса переполнения ставки или может предложить ссылку на этот вопрос. Но это не так!--1-->
и не любой ниже Вопрос обеспечивает хорошее решение этой проблемы в C#:
5 ответов
это окончательное решение:
получить физический серийный номер HDD без WMI
написать этот код:
DriveListEx diskInfo = new DriveListEx();
diskInfo.Load();
string serialNo = diskInfo[0].SerialNumber;
Не забудьте добавить ссылку на DriveInfoEx.dll
.
посмотреть этот
http://www.codeproject.com/KB/system/GetHardwareInformation.aspx
просто загрузите демо оттуда и выберите вкладку " хранение данных "и выберите Win32_DiskDrive из этого вы получите информацию обо всех дисках(жесткий диск), упомянутых ниже, и увидите одно свойство" SerialNumber " после sectorpertrack и перед свойством подписи...
лучший способ, который я нашел:
скачать .dll от здесь
добавить .dll для вашего проекта
-
добавить этот код:
[DllImportAttribute("HardwareIDExtractorC.dll")]
public static extern String GetIDESerialNumber(byte DriveNumber);
-
вызовите идентификатор жесткого диска, откуда он вам нужен:
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/) к системе.ИО.Класс 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