Получить серийный номер жесткого диска

Я хочу получить серийный номер жесткого диска. Как я могу это сделать? Я пробовал с двумя кодами, но я не получаю

StringCollection propNames = new StringCollection(); ManagementClass driveClass = new ManagementClass("Win32_DiskDrive"); PropertyDataCollection props = driveClass.Properties; foreach (PropertyData driveProperty in props) { propNames.Add(driveProperty.Name); } int idx = 0; ManagementObjectCollection drives = driveClass.GetInstances(); foreach (ManagementObject drv in drives) { Label2.Text+=(idx + 1); foreach (string strProp in propNames) { //Label2.Text+=drv[strProp]; Response.Write(strProp + " = " + drv[strProp] + "
"); } }

В этом я не получаю уникальный серийный номер.
А второй –

 string drive = "C"; ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"" + drive + ":\""); disk.Get(); Label3.Text = "VolumeSerialNumber="+ disk["VolumeSerialNumber"].ToString(); 

Здесь я получаю VolumeSerialNumber . Но это не единственный. Если я отформатирую жесткий диск, это изменится. Как я могу это получить?

    Хм, глядя на ваш первый набор кода, я думаю, что вы извлекли (может быть?) Модель жесткого диска. Серийный номер из Win32_PhysicalMedia .

    Получить модель жесткого диска

      ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach(ManagementObject wmi_HD in searcher.Get()) { HardDrive hd = new HardDrive(); hd.Model = wmi_HD["Model"].ToString(); hd.Type = wmi_HD["InterfaceType"].ToString(); hdCollection.Add(hd); } 

    Получить серийный номер

      searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"); int i = 0; foreach(ManagementObject wmi_HD in searcher.Get()) { // get the hard drive from collection // using index HardDrive hd = (HardDrive)hdCollection[i]; // get the hardware serial no. if (wmi_HD["SerialNumber"] == null) hd.SerialNo = "None"; else hd.SerialNo = wmi_HD["SerialNumber"].ToString(); ++i; } 

    Источник

    Надеюсь это поможет 🙂

    Я использовал следующий метод в проекте и успешно работает.

     private string identifier(string wmiClass, string wmiProperty) //Return a hardware identifier { string result = ""; System.Management.ManagementClass mc = new System.Management.ManagementClass(wmiClass); System.Management.ManagementObjectCollection moc = mc.GetInstances(); foreach (System.Management.ManagementObject mo in moc) { //Only get the first one if (result == "") { try { result = mo[wmiProperty].ToString(); break; } catch { } } } return result; } 

    вы можете вызвать вышеупомянутый метод, как указано ниже,

     string modelNo = identifier("Win32_DiskDrive", "Model"); string manufatureID = identifier("Win32_DiskDrive", "Manufacturer"); string signature = identifier("Win32_DiskDrive", "Signature"); string totalHeads = identifier("Win32_DiskDrive", "TotalHeads"); 

    Если вам нужен уникальный идентификатор, используйте комбинацию этих идентификаторов.

    Для ответа Спрунта есть простой способ.

     private void GetAllDiskDrives() { var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); foreach (ManagementObject wmi_HD in searcher.Get()) { HardDrive hd = new HardDrive(); hd.Model = wmi_HD["Model"].ToString(); hd.InterfaceType = wmi_HD["InterfaceType"].ToString(); hd.Caption = wmi_HD["Caption"].ToString(); hd.SerialNo =wmi_HD.GetPropertyValue("SerialNumber").ToString();//get the serailNumber of diskdrive hdCollection.Add(hd); } } public class HardDrive { public string Model { get; set; } public string InterfaceType { get; set; } public string Caption { get; set; } public string SerialNo { get; set; } } 

    Используйте команду «vol» shell и выполните синтаксический анализ с ее выхода, как это. Работает как минимум в Win7

     using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CheckHD { class HDSerial { const string MY_SERIAL = "F845-BB23"; public static bool CheckSerial() { string res = ExecuteCommandSync("vol"); const string search = "Number is"; int startI = res.IndexOf(search, StringComparison.InvariantCultureIgnoreCase); if (startI > 0) { string currentDiskID = res.Substring(startI + search.Length).Trim(); if (currentDiskID.Equals(MY_SERIAL)) return true; } return false; } public static string ExecuteCommandSync(object command) { try { // create the ProcessStartInfo using "cmd" as the program to be run, // and "/c " as the parameters. // Incidentally, /c tells cmd that we want it to execute the command that follows, // and then exit. System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command); // The following commands are needed to redirect the standard output. // This means that it will be redirected to the Process.StandardOutput StreamReader. procStartInfo.RedirectStandardOutput = true; procStartInfo.UseShellExecute = false; // Do not create the black window. procStartInfo.CreateNoWindow = true; // Now we create a process, assign its ProcessStartInfo and start it System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo = procStartInfo; proc.Start(); // Get the output into a string string result = proc.StandardOutput.ReadToEnd(); // Display the command output. return result; } catch (Exception) { // Log the exception return null; } } } } 

    Ниже полнофункциональный метод получения серийного номера жесткого диска:

     public string GetHardDiskSerialNo() { ManagementClass mangnmt = new ManagementClass("Win32_LogicalDisk"); ManagementObjectCollection mcol = mangnmt.GetInstances(); string result = ""; foreach (ManagementObject strt in mcol) { result += Convert.ToString(strt["VolumeSerialNumber"]); } return result; } 

    Я использую это:

      private static string wmiProperty(string wmiClass, string wmiProperty){ using (var searcher = new ManagementObjectSearcher($"SELECT * FROM {wmiClass}")) { try { IEnumerable objects = searcher.Get().Cast(); return objects.Select(x => x.GetPropertyValue(wmiProperty)).FirstOrDefault().ToString().Trim(); } catch (NullReferenceException) { return null; } } } 

    Вот код, который может помочь:

     ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); string serial_number=""; foreach (ManagementObject wmi_HD in searcher.Get()) { serial_number = wmi_HD["SerialNumber"].ToString(); } MessageBox.Show(serial_number); 

    Лучший способ найти, скачать dll отсюда

    Затем добавьте dll в свой проект.

    Затем добавьте код:

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

    Затем вызовите идентификатор жесткого диска, где он вам нужен.

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

    Примечание: перейдите к свойствам dll в проводнике и установите «Build action» в «Embedded Resource»

    Давайте будем гением компьютера.