Inicio > .NET Framework, C#, Cómo hacer > Cómo obtener el número serial del disco duro (y más)

Cómo obtener el número serial del disco duro (y más)


En ocasiones tenemos que obtener cierta información del sistema que parecería imposible a primera vista. El jefe nos dice: “necesitamos que obtengas el número de disco duro sobre el que corre la aplicación para poderlo usar al generar la licencia al cliente”. Entonces nos quedamos con cara de ¿¡¿what?!? y empezamos a dar vueltas en nuestro cubículo. Y al final resulta que es muy fácil obtener dicha información.

Microsoft cuenta con una herramienta para acceder a informacón de administración en un ambiente empresarial (redes, servidores, etc). Ésta recibe el nombre de WMI: Windows Management Instrumentation [1]. WMI es una implementación de Web-Based Enterprise Management, el cual es una iniciativa de la industria, y que utiliza el estándar Common Information Model para representar sistemas y aplicaciones, redes y dispositivos, de forma local o incluso de forma remota.

Para el caso que nos ocupa, WMI nos es de utilidad. Ya lo habrás adivinado, si no, no lo hubiera mencionado, ¿verdad?

En el caso de C# y el .NET Framework, la funcionalidad de WMI se encuentra contenida en el espacio de nombres System.Management, y hay que referenciar a la librería System.Management.dll. La mecánica para consultar información es sencilla:

  1. Crear un objeto de tipo ManagementObject pasándole como parámetro la consulta a realizar.
  2. Descargar la información desde WMI ejecutando el método Get.
  3. Recorrer la colección Properties del objeto para obtener los resultados.
    A continuación te presento un programita que hace exactamente lo anterior.
    
    using System;
    using System.IO;
    using System.Management;
    
    namespace Fermasmas.Wordpress.Com
    {
      class Program
      {
        static void Main(string[] args)
        {
          int count = 0;
    
          DirectoryInfo currentDir = new DirectoryInfo(Environment.CurrentDirectory);
          string path = string.Format("win32_logicaldisk.deviceid=\"{0}\"",
            currentDir.Root.Name.Replace("\\", ""));
          ManagementObject disk = new ManagementObject(path);
          disk.Get();
    
          foreach (PropertyData property in disk.Properties)
          {
            string name = property.Name.PadRight(25);
            string value = (property.Value ?? string.Empty)
              .ToString().PadRight(25);
            Console.WriteLine("Nombre: {0} Valor: {1}", name, value);
            if ((++count % 10) == 0)
            {
              Console.WriteLine("Presione una tecla para continuar o [ESC] para cancelar... ");
              ConsoleKeyInfo key = Console.ReadKey(true);
              if (key.Key == ConsoleKey.Escape)
                break;
            }
          }
    
          Console.WriteLine("Presione una tecla para terminar... ");
          Console.ReadKey(true);
        }
      }
    }
    
    

La cadena de texto que le paso al constructor representa una clase WMI, y el ya mencionado método Get descarga los datos desde WMI. De ahí, todo es pan comido: solo es cuestión de iterar sobre las propiedades y obtener la que nos interesa. De hecho, si ya sabes cual es el nombre de la propiedad que buscas, basta con invocar al indexador del ManagementObject. Por ejemplo, para ver el número serial del disco, basta con ejecutar este código:

DirectoryInfo currentDir = new DirectoryInfo(Environment.CurrentDirectory);
string path = string.Format("win32_logicaldisk.deviceid=\"{0}\"", 
    currentDir.Root.Name.Replace("\\", ""));
ManagementObject disk = new ManagementObject(path);
disk.Get();

string serial = disk["VolumeSerialNumber"].ToString();

Algunas referencias a continuación.

Referencias
  1. Acerca de WMI
  2. Cómo utilizar WMI
  3. Algunos ejemplos de WMI
Categorías:.NET Framework, C#, Cómo hacer Etiquetas:
  1. Carmen
    agosto 11, 2010 a las 10:04 am

    hola perdon pero el codigo no funciona me podrias decir por que razon

    • agosto 11, 2010 a las 10:15 am

      Bueno, a mí me funciona. Mejor dime: ¿qué error es el que te aparece? Sin el tipo de excepción, el mensaje, etc. es difícil de adivinar… Espero tu respuesta.

      ¡Saludos!

    • Straad
      marzo 4, 2014 a las 3:21 pm

      A mi sí me funciono, tal vez si estas usando un Framework distinto (yo use el 4.5.1) necesites agregar las referencias del espacio de nombres a agregar. Lo puedes hacer desde el explorador de soluciones.

      Buen aporte :D

  2. enero 10, 2012 a las 5:57 am

    Este numero de serie es el del volumen no el del disco, me refiero el del fabricante.

  3. Orlando B
    enero 10, 2014 a las 12:07 am

    Como puedo hacer esto en Python

  4. Cristian F.
    junio 30, 2014 a las 3:01 pm

    En Framework 4.0 no existe el método ManagementObject para la System.Management.. Necesito una solución para framework 4.0

    • julio 1, 2014 a las 12:57 pm

      Hola Cristian,

      claro que por supuesto que desde luego que existe una clase ManagementObject dentro del espacio de nombres System.Management para .NET Framework 4.0. No sé de dónde habrás sacado que no. De hecho, la clase está disponible para .NET 1.1, 2.0, 3.0, 3.5, 4.0, 4.5 y 4.5.1.

      En la siguiente liga encontrarás la documentación de la clase para .NET 4.0.
      http://msdn.microsoft.com/en-us/library/system.management.managementobject(v=vs.100).aspx

      Asegúrate de que tu proyecto esté referenciando los ensamblados necesarios (consulta la documentación para ver cuál necesitas).

      Saludos.

  1. abril 30, 2010 a las 9:54 am
  2. enero 2, 2011 a las 12:12 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s