Colabora.NET
 

Obtener El Serial Interno de los Discos Duros

Mediante la Utilización de WMI

 

Fecha: 14/Feb/2007 (13-02-07)
Autor: Ivan E. Ordoñez O. ([email protected])

http://ivanelias.spaces.live.com/blog/

 


Introducción

En los Últimos Años El Licenciamiento de software se ha visto afectado debido a las personas que buscan decompilar nuestro software para obtener beneficios del mismo sin nuestro consentimiento y por ello asegurarnos que nuestras aplicaciones sean utilizadas por personas que hallan adquirido el software Legalmente haciendo uso de algunos algoritmos de verificación proporcionándole al usuario el 99% de nuestra aplicación y guardando para nosotros mismo el 1% que no es mas que nuestro algoritmo de verificación para confirmar que un usuario válido pueda usar el programa estos es mas comúnmente conocido como Activación de Software.

 

La Activación es una Buena Solución, pero eso también significa tener una conexión a internet, y también que los programadores mas pequeños y con mucho menos recursos (Como un Servidor :>)) no podemos pagar un servidor permanentemente disponible para validar usuarios. Conversando con un amigo desarrollador de Clipper sobre la famosa era del MS-DOS (Tiempos Aquellos, jeje) donde los programadores enlazaban el Número de serial del Volumen del Disco Duro pero esto no era una buena solución debido a que si se formateaba el disco se generaba un nuevo numero de serial. Una Mejor solución es obtener el Número de Serial del disco duro proporcionado por el fabricante, Este valor no cambiara cada vez que se desee formatear el disco., Claro si el cliente compra un nuevo disco duro pues tendrá un problema y tendrá que llamarnos :D, pero por otro lado pues nuestro software estará mucho mas protegido a un precio exageradamente bajo.

El código:

Primero Vamos a Crear una Clase para almacenar la información sobre el Disco Duro llamada DiscoDuro.vb

Public Class DiscoDuro
    Private _Modelo As String
    Private _Tipo As String
    Private _Serial As String

    'Propiedad para Manejar el Modelo del Disco
    Public Property Modelo() As String
        Get
            'Retorna el Modelo del Diso Duro
            Return _Modelo
        End Get
        Set(ByVal value As String)
            'Asigna el Modelo del Disco Duro
            _Modelo = value
        End Set
    End Property

    'Propiedad para Manejar el Tipo del Disco
    Public Property Tipo() As String
        Get
            'Retorna el Tipo del Diso Duro
            Return _Tipo
        End Get
        Set(ByVal value As String)
            'Asigna el Tipo del Disco Duro
            _Tipo = value
        End Set
    End Property

    'Propiedad para Manejar el Serial del Disco
    Public Property Serial() As String
        Get
            'Retorna el Serial del Diso Duro
            Return _Serial
        End Get
        Set(ByVal value As String)
            'Asigna el Serial del Disco Duro
            _Serial = value
        End Set
    End Property

End Class

 

Luego deberás agregar una referencia al proyecto de System.Management ya que esta no viene referenciada por defecto así que deberás agregarla para pasar al siguiente paso". Este nos permite tener acceso a los objetos WMI (Windows Management Instrumentation) pero, ahora nos encontramos con un problema: la Información de los discos duros se encuentra en la clase Win32_DiskDrive y la información de los seriales del disco se encuentra en la clase Win32_PhysicalMedia así que debemos buscar ambos e integrarlos mediante la clase que creamos anteriormente (DiscoDuro.vb) haciendo uso de una lista de tipo ArrayList para almacenar la información de los discos duros.

Bueno ahora debes crear un nuevo Formulario y luego agrega al inicio del código "Imports System.Management

Veamos ahora el código del formulario:

<

'Importamos el namespace System.Management para Accesar al Windows Management Instrumentation
Imports System.Management

Public Class Form1
    'Declaramos una coleccion del tipo ArrayList
    Dim hdLista As New ArrayList

    'En el evento Load escribiremos el codigo para obtener la informacion
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        'Creamos ahora un objeto ManagementObjectSearcher y agregaremos la cadena de seleccion 
        'para obtener de la clase Win32_DiskDrive
        ' la Informacion del modelo y el tipo del Disco Duro
        Dim BuscardorWMI As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")

        For Each wmi_HD As ManagementObject In BuscardorWMI.Get
            'creamos un objeto del tipo DiscoDuro
            Dim Hd As New DiscoDuro
            'asignamos el valor del Modelo obtenido de la consulta
            ' en la propiedad Modelo del objeto Hd
            Hd.Modelo = wmi_HD("Model").ToString
            'asignamos el valor del Tipo obtenido de la consulta
            ' en la propiedad Modelo del objeto Hd
            Hd.Tipo = wmi_HD("InterfaceType").ToString
            'y Finalmente agregamos dicho objeto Hd al ArrayList que creamos
            hdLista.Add(Hd)
        Next


        'Creamos ahora una nueva instancia del objeto que habiamos
        ' creado del tipo ManagementObjectSearcher 
        'y agregaremos la cadena de seleccion para obtener de la clase Win32_PhysicalMedia
        ' los seriales internos 
        'de los Discos Duros que hallamos encontrado en el ciclo anterior
        BuscardorWMI = New ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia")
        'Deifinimos a i como un contador para manejar el ArrayList
        Dim i As Integer = 0

        For Each wmi_HD As ManagementObject In BuscardorWMI.Get
            'Indica continuar con el ciclo mientras que i sea menor que
            ' la cantidad de discos encontrados
            If i < hdLista.Count - 1 Then
                'creamos  un nuevo objeto del Tipo DiscoDuro para ir almacenando alli 
                'cada uno de los discos duros encontrados
                Dim hd As New DiscoDuro
                'asignamos el valor acutalde la lista en el objeto HD
                hd = hdLista(i)
                'debemos verificar que el valor del campo "SerialNumber" obtenido en la busqueda 
                'no sea un valor nulo de lo contrario 
                'la aplicacion arrojará una excepcion
                If wmi_HD("SerialNumber").ToString = Nothing Then
                    'en el caso de  que se halla encontrado el serial la propiedad "Serial" del
                    ' objeto hd se guardará los siguiente:
                    hd.Serial = "No se Pudo Obtener El Serial"
                Else
                    'en el caso contrario almacenaremos el numero de serial interno 
                    'del disco duro en la propiedad "Serial" del objeto hd
                    hd.Serial = wmi_HD("SerialNumber").ToString
                End If
                'incrementando i
                i += 1
            End If
        Next

        'aqui coloco una manera de mostrarlo ustedes pueden escoger la que mejor les paresca
        For Each hd As DiscoDuro In hdLista
            'por cuestiones de tiempo yo escogí usar un MessageBox
            MessageBox.Show(hd.Modelo & vbCrLf & hd.Tipo & vbCrLf & hd.Serial)
        Next

    End Sub
End Class


Espacios de nombres usados en el código de este artículo:


System.Management

 


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: IvanElias_SerialDisco_VB.zip - (49,8 KB) KB

(MD5 checksum: 7AD96E8742A5FAD824702D01697F21F7)

 


Ir al índice principal de el Guille