Serial del disco duro

20/07/2005 - 03:58 por Henry Sanchez | Informe spam
Hola Grupo,

Hace mas de un año que no entraba al grupo y me sorprendio esta nueva
interfaz.

Me alegro ver que muchos de los viejos conocidos todavia frecuentan el grupo
y que ademas hay muchos usuarios nuevos.

Tengo la siguiente inquietud:

La idea s hacer una funcion que encuentre el Serial del disco duro (Numero
unico que identifique el PC en el cual se esta corriendo el programa).

Hice esta consulta hace mucho mas de un año y con la ayuda de Fernando logre
la siguiente funcion:

Public Function SerialDisco() As String
Dim OWMI As Object
Dim Disco As Object
Dim Discos As Object

Set OWMI = GetObject("WINMGMTS:")
Set Discos = OWMI.instancesof("Win32_physicalMedia")
For Each Disco In Discos
SerialDisco = Disco.serialnumber
Exit For
Next Disco

End Function

La verdad no entiendo muy bien el funcionamiento de este codigo, pues la
ayuda de VBA es practicamente nula en este tipo codigo.
No hay ejemplos, instrucciones como OWMI.instancesof("Win32_physicalMedia")
no tienen ninguna explicacion, (por ejemplo que otras cadenas de caracteres
se pueden usar ademas de "Win32_physicalMedia" y que significado tienen, en
fin.

Por eso me limite a usar esta funcion como una receta, sin buscarle sentido.

La funcion trabaja crrectamente, pero en algunos equipos (muy pocos, en
realidad)genera errores.

Por este motivo trate de buscar en la ayuda como obtener el serial del disco
duro del computador y despues de hacer miles de ensayos, obtuve la siguiente
funcion (otra receta que no entiendo muy bien por los mismos motivos de la
anterior):

Public Function SerialDisco() As String
Dim SistemaArchivos As Variant
Dim Unidad As Variant

Set SistemaArchivos = CreateObject("Scripting.FileSystemObject")
Set Unidad =
SistemaArchivos.getdrive(SistemaArchivos.getdrivename(ThisWorkbook.Path))
SerialDiscoDuro = Unidad.serialnumber
End Function

Esta funcion trabaja bien.

Ambas funciones devuelven una cadena diferente para cada computador en que
corren, pero el serial que calcula la primera funcion es diferente del que
calcula la segunda.

Como supongo que cada disco duro tiene un solo serial, me gustaria saber
cual de las dos funciones es la que calcula el No verdadero y que es lo que
calcula la otra funcion.

Saludos,

Henry
 

Leer las respuestas

#1 Héctor Miguel
20/07/2005 - 21:52 | Informe spam
hola, Henry !

... una funcion que encuentre el Serial del disco duro (Numero unico que identifique el PC en el cual se esta corriendo el programa).
... la siguiente funcion:
Public Function SerialDisco() As String [... "Win32_PhysicalMedia" ...]
... no entiendo muy bien el funcionamiento... la ayuda de VBA es practicamente nula en este tipo codigo.
... me limite a usar esta funcion como una receta, sin buscarle sentido.
... trabaja crrectamente, pero en algunos equipos (muy pocos, en realidad) genera errores.
... trate de buscar en la ayuda como obtener el serial del disco duro del computador y despues de hacer miles de ensayos
... la siguiente funcion (otra receta que no entiendo muy bien por los mismos motivos de la anterior):
Public Function SerialDisco() As String [... "Scripting.FileSystemObject"...]
... devuelven una cadena diferente para cada computador... pero el... que calcula la primera... es diferente del que calcula la segunda.
... supongo que cada disco duro tiene un solo serial, me gustaria saber cual... calcula el No verdadero y que es lo que calcula la otra funcion.



1) la informacion que necesitas la puedes encontrar en la MSDN / SDK [que por cierto... es mas amplia y basta que...] :D
visita como 'punto de arranque'... -> http://tinyurl.com/2mros [ademas de que existen bastantes sitios con llamadas a las API's] ;)
[ahi podras consultar/obtener/probar/... con otro tipo de propiedads para cada 'tipo' de informacion]
[probablemente] tambien encontraras la -posible- 'causa' de los errores, ya que los WMI 'requieren' Win_NT/2000/XP :-(
2) el serial que devuelve la funcion que utliza WMI [Windows Management Instrumentation] -al navegar por la info anterior veras que...-
ES el numero con el cual ->el fabricante<- ha 'etiquetado' [fisicamente] la unidad de almacenamiento [HD]
[es decir... es el unico y 'verdadero' numero de serie] :D
3) el serial que devuelve ->cualquier otro metodo/procedimiento/llamada/API/...'<- NO es 'permanente' -?-
[es decir... cambia por cada vez que la unidad de almacenamiento 'pasa' por un proceso de 'preparacion' ->se le da formato<-] :D
4) aunque se que sera mas que 'suficiente' informacion [NO la que te 'proveo' en este mensaje, sino la que existe en la MSDN/SDK] :))
haz unas pruebas con los siguientes codigos de ejemplo ;)

si cualquier duda... comentas?
saludos,
hector.
== en un modulo de codigo 'normal' ==Sub Unidad_Fisica()
' como 've' las unidades una pc con windows_NT/2000/XP como SO '
Dim Disco As Object
With GetObject("WinMgmts:")
For Each Disco In .InstancesOf("Win32_DiskDrive")
MsgBox "Serie decimal: " & Disco.Signature & vbCr & _
"Serie Hexadecimal: " & Hex(Disco.Signature) & vbCr & _
"Fabricante: " & Disco.Manufacturer & vbCr & _
"Tipo de medio: " & StrConv(Disco.MediaType, vbProperCase) & vbCr & _
"Modelo: " & Disco.Model & vbCr & _
"Nombre: " & Disco.Name & vbCr & _
"Identificador: " & Disco.Signature
Next
End With
End Sub
Sub Unidad_Logica()
' por cada unidad logica '
Dim Disco As Object
With GetObject("WinMgmts:")
For Each Disco In .InstancesOf("Win32_LogicalDisk")
MsgBox "Unidad disco: " & Disco.Name & vbCr & _
"Serie logica: " & Disco.VolumeSerialNumber
Next
End With
End Sub
Sub Medio_Fisico()
' la 'etiqueta' que le pone el fabricante =>NO cambia<= al re/formatear unidades '
Dim Disco As Object
With GetObject("WinMgmts:")
For Each Disco In .InstancesOf("Win32_PhysicalMedia")
MsgBox "Serie Fabrica: " & Application.Trim(Disco.SerialNumber)
Next
End With
End Sub
Sub NumeroDeSerie()
' mismo numero de serie que Win32_LogicalDisk '
With CreateObject("Scripting.FileSystemObject")
MsgBox .GetDrive(.GetDriveName("C:")).SerialNumber & vbCr & _
Hex(.Drives.Item("C:").SerialNumber)
End With
End Sub

Preguntas similares