ver tamaño serial obtener modelo informacion duro disco capacidad c# hard-drive

c# - tamaño - ver serial disco duro cmd



Obtenga el número de serie del disco duro (8)

Quiero obtener el número de serie del disco duro. ¿Cómo puedo hacer eso? Intenté con dos códigos pero no estoy recibiendo

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] + "</br>"); } }

En este caso, no obtengo ningún número de serie único.
Y el segundo es

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

Aquí estoy obteniendo VolumeSerialNumber . Pero no es único. Si formateo el disco duro, esto cambiará. ¿Cómo puedo conseguir esto?


Aquí hay algunos códigos que pueden ayudar:

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);


Debajo de un método completamente funcional para obtener el número de serie del disco duro:

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; }


Estoy usando esto:

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


He utilizado el siguiente método en un proyecto y está funcionando con éxito.

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; }

puede llamar al método anterior como se menciona a continuación,

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

Si necesita un identificador único, use una combinación de estos ID.


Hm, mirando tu primer conjunto de código, creo que has recuperado (¿quizás?) El modelo del disco duro. El número de serie proviene de Win32_PhysicalMedia .

Obtener el modelo de disco duro

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); }

Obtenga el número de serie

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; }

Source

Espero que esto ayude :)


La mejor forma que encontré es, descarga un dll desde here

Luego, agrega el dll a tu proyecto.

Luego, agrega el código:

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

Luego, llame al ID del disco duro desde donde lo necesita

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

Nota: vaya a las propiedades del dll en el explorador y configure "Acción de compilación" en "Recurso incrustado"


Utilice el comando de shell "vol" y analice el serial desde su salida, así. Funciona al menos en 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; } } } }


Hay una manera simple para la respuesta de @ Sprunth.

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; } }