jueves, 6 de octubre de 2011

Esto resulto un poco más difícil que la entrada anterior sobre la dirección MAC de la PC, pues hay múltiples ejemplos de código para obtener el número de serie del disco duro pero solo funcionan con IDE y no para SATA y ¿Quien tiene un PC con disco duro IDE en estos días? Yo tengo uno pero no me considero un estándar representativo de la sociedad.


La verdad, aquí hice trampa. Por que parece ser que WMI por si mismo no tiene la capacidad de obtener el número de serie de un disco SATA y al menos yo no encontré una alternativa viable así que utilice un código en C++ para llegar a un nivel más bajo de lo que pude con C# y así obtener la información, unmanaged code o código no administrado le llaman al uso de códigos así.


WMI significa Windows Management Instrumentation y sirve también para obtener otras cosas como el número de serie de la tarjeta madre por ejemplo, trabajando mediante una instancia de ManagementObjectSearcher y consultas tipo SQL para obtener una colección de los objetos Win32_BaseBoard. Para eso necesitamos el espacio de nombres System.Management.


Aquí no vamos a ver este método pero creo que ya le di suficientes palabras clave para que busquen en el Google si les interesa saber más.


Regresando a este código que les decía, la parte de C++ que comento no lo programe yo, si no que lo encontré en The Code Project y lo adapte a mis necesidades. Empecemos con esta parte.


Pueden descargar el código fuente y el programa ejemplo original de aquí para tener la dll DriveInfoEx.dll que vamos a necesitar. En esta dll se tienen los métodos necesarios para obtener la información del disco duro que queremos. Hay que agregarla como referencia a nuestro sistema en C# así como también la dll System.Management.dll, que si no la tienes por default para poder usar el espacio de nombres puedes buscarla en C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ si tienes al menos .NET framework 2.


Les dejo aquí una función de muestra de como aprovechar a DriveInfoEx.dll para obtener el número de serie hasta de discos SATA.


public static string getHardDiscInfo()
{
#region Variables de uso local
DriveListEx listado = null;
string informacion = string.Empty;
ulong capacidad = 0;
ulong capacidadReal = 0;
#endregion
listado = new DriveListEx(); // Inicializar la lista
// Obtener la informacion de los discos duros
listado.Load();
// Revisar si hay informacion de los discos duros
if (listado != null && listado.Count > 0)
{
// Recorrer la lista de discos duros
foreach (DriveInfoEx disco in listado)
{
// Capacidad del disco redondeada a miles
capacidad = disco.DriveSize/1000000000;
// Capacidad del disco calculada a 1024
capacidadReal = disco.DriveSize/1073741824;
informacion += "Modelo: " + disco.ModelNumber + "\r\n";
informacion += "N° Revisión: " + disco.RevisionNumber + "\r\n";
informacion += "N° de Serie: " + disco.SerialNumber + "\r\n";
informacion += "Capacidad: " + capacidad + "GB\r\n";
informacion += "Capacidad Real: " + capacidadReal + "GB\r\n";
informacion += "Tamaño del Buffer: " + disco.BufferSize + "\r\n";
informacion += "Tipo: " + disco.DriveType + "\r\n\r\n";
}
}
else
{
informacion = "No se encontro información de discos duros";
}
return informacion;
}

1 comentario:

Por favor trata de escribir bien, no te pido que no te falte ni un acento pero por favor evita escribir como metroflogger o facebookero. Este blog es un sitio decente. Gracias.

Subscribe to RSS Feed Follow me on Twitter!