martes, 20 de enero de 2015

VBA: Obtener el número de serie de un disco duro (o partición).

Quizá no le veas el sentido a la siguiente entrada, y puedas preguntarte para qué me puede servir conocer cuál es el número de serie de un disco duro (o partición).

Una posible utilidad es proteger tu libro de trabajo para que sólo pueda ser abierto desde tu equipo.. es decir, además de incorporar una contraseña al fichero, o añadir un procedimiento que pida usuario y contraseña, podríamos emplear este Número de Serie de tu disco duro como control de acceso.
Seguridad al cuadrado!!


Para ello necesitaremos la propiedad .SerialNumber que nos indica precisamente lo que neceistamos, nos devuelve el número de serie decimal que se utiliza para identificar de forma única un volumen de disco.

Para comprobar que lo que obtenemos con esta function es cierto, podemos acceder al botón de Inicio de Windows, y luego haremos clic en el cuadro de "Búsqueda", donde escribiremos 'cmd'.

VBA: Obtener el número de serie de un disco duro (o partición).



A continuación, en la ventana del Símbolo de sistema (o ventana de MS-DOS), escribe:
vol c:
o vol la unidad de la que quieras conocer el Número de Serie..

VBA: Obtener el número de serie de un disco duro (o partición).



En mi caso, el número de serie de la unidad C: es: 14AD E4A0

Ahoara, para comprobarlo, insertaremos el siguiente código de un procedimiento Function en un módulo general:

Function NumeroSerieUnidad(Optional ByVal LetraUnidad As String) As String
'Nota importante: Se recomienda activar la referencia de la librería 'Microsoft Scripting Runtime'
'Con esta función conseguimos el número de serie del disco duro (partición).
'Este Número de serie lo genera Windows al formatear la partición
Dim fso As Object, Drv As Object
Dim SerieUnidadDec As Long

Application.Volatile
'Creamos un objeto FileSystemObject
Set fso = CreateObject("Scripting.FileSystemObject")

'Asigamos la Letra de Unidad actual en caso de no especificarla en el argumento
If LetraUnidad <> "" Then
    Set Drv = fso.GetDrive(LetraUnidad)
Else
    Set Drv = fso.GetDrive(fso.GetDriveName(App.Path))
End If

With Drv
    'Devuelve True si la unidad especificada está preparada y False si no lo está.
    If .IsReady Then
        'SerialNumber Devuelve el número de serie decimal
        'que se utiliza para identificar de forma única un volumen de disco.
        SerieUnidadDec = Abs(.SerialNumber)
    Else
        SerieUnidadDec = -1
    End If
End With

'convertimos en Hexadecimal
SerieUnidadHex = Application.WorksheetFunction.Dec2Hex(SerieUnidadDec)

'Devovemos valor con la función
NumeroSerieUnidad = SerieUnidadHex
    
'Limpiamos las variables
Set Drv = Nothing
Set fso = Nothing
End Function



Si ejecutamos nuestra función en la hoja de cálculo, comprobamos que todo coincide...:

VBA: Obtener el número de serie de un disco duro (o partición).

4 comentarios:

  1. Estimado la serie obtenida cambia si se formatea el disco duro???

    ResponderEliminar
    Respuestas
    1. Hola Alan,
      en principio la identificación del disco duro, después de un formateo, sigue siendo la misma...
      Pero no puedo asegurártelo.. es algo que escapa a mis conocimientos
      Saludos

      Eliminar
  2. Hola Ismael, y como seria el código para comprobar si el archivo excell se esta ejecutando en un HDD determinado y sino es asi que se cierre el archivo?
    Te agradecería mucho tu respuesta.

    ResponderEliminar
    Respuestas
    1. Hola JJM
      con un condicional IF THEN.. tendrías que compararlo con el de tu HDD determinado, y si cumple cerrar archivo con workbook.close
      Saludos cordiales!

      Eliminar

Nota: solo los miembros de este blog pueden publicar comentarios.