Ya vimos como funciona, basicamente, Windows Script Host (WSH), aplicado solamente a la lectura de ciertos valores del Registro de Windows. Este post no tendrá como objetivo hacernos expertos en el tema, pero analizaremos un par de funciones para editar, agregar o eliminar valores del Registro.
Expondré un ejemplo común y práctico: le doy a un cliente X mi proyecto, 100% funcional, para que lo evalúe. Luego de 10 días de la primer apertura del archivo si el cliente no compró el sistema las macros deben dejar de funcionar ¿Que mejor que utilizar el Registro de Windows para esto?
Podríamos habilitar un blog aparte para hablar especifica y detalladamente sobre esta aplicación... cosa que, por lo menos de mi parte, no sucederá. =)
[+/-] Ver el resto / OcultarHablaremos un poco sobre el, para saber en que arenas nos estamos metiendo... o hundiendo.
El Registro de Windows es una simple e importantísima, fundamental ... base de datos. En ella el Sistema Operativo almacena todas las configuraciones habidas y por haber: usuarios, hardware, software, etc, etc. Desde que programas se ejecutarán al inicio del sistema a la ruta en donde se guarda el archivo que usamos como fondo de escritorio.
Así que mucho cuidado: en mis primeros pasos modificando el registro.... tuve que formatear mas de una vez mi PC, dado que "metí mano a lo loco" sin hacer antes un sencillo back-up. Total ¿que iba a pasar? Si, pasa eso: al principio tenemos cuidado pero luego modificamos valores "total ya la tenemos mas que clara" sin tomar los recaudos necesarios. Y ahí empiezan los desastres.
Primero: botón de inicio, ventana "ejecutar", escribimos: regedit y hacemos click sobre "regedit.exe", que es la interfaz que nos brinda Windows para interactuar con su Registro. Nos vamos al menú "Archivo / Exportar", damos un nombre acorde (conviene incluir la fecha) y guardamos:
listo, a trabajar tranquilos. vean las dos opciones que tenemos al pié del formulario: "Todo" y "Rama Seleccionada". Obviamente elegimos la primera.
Habrán notado que el Registro, visual y lógicamente, se encuentra organizado como el Explorador de Windows. Esos directorios principales que se observan se llaman "Ramas" y cada una guarda información específica:
HKEY_CLASSES_ROOT: Se registran todas las extensiones, de tipos de archivo.
HKEY_CURRENT_USER: Listado detallado de las configuraciones del usuario actual.
HKEY_LOCAL_MACHINE: Configuraciones de nuestro PC, como dónde está nuestro software y dónde estan instalados los drivers
HKEY_LOCAL_MACHINE: Configuraciones de nuestro PC, como dónde está nuestro software y dónde estan instalados los drivers
HKEY_USERS: Todas las configuraciones de los usuarios de la PC (www visitadas, aplicaciones, etc...).
HKEY_CURRENT_CONFIG: más detalles de la configuración actual.
A su vez dentro de cada rama encontramos claves, subclaves y entradas. Cada clave / subclave puede contener un valor, siendo este último la entrada. A su vez, cada entrada tiene la siguiente estructura:
1) Nombre
2) Tipo de dato
3) El valor en sí.
Rama: HKEY_CURRENT_USER - Varias claves / SubClaves -
1)Nombre del Valor: Wallpaper -
2)Tipo de dato: string (cadena) -
3)Valor: la ruta de acceso al archivo jpg que uso como wallpaper.
¿Se comprende bien hasta ahora?
Existen cientos de miles de entradas, dependiendo de la configuración de hard y soft de cada equipo.
Como toda base de datos que se precie de serlo, los datos que guarda pueden ser de distintos tipos. Veamos cuales:
a) Binarios (REG_BINARY): casi toda la info del hard se almacena en este formato y se representa en hexadecimal.
b) Numérico (REG_DWORD): un numero de 4 bytes de longitud. Los datos de los servicios de windows y controladores se guardan con d_word, y se representan en forma decimal, hexadecimal, binaria.
c) Texto (REG_SZ): cadena de texto de longitud fija.
d) Texto (REG_EXPAND_SZ): cadena de texto de longitud variable.
Hay un par mas, pero vamos a detenernos aquí ya que detallamos los principales.
Entonces: vimos que el Registro de Windows es una base de datos, ordenada en forma jerárquica, en donde el SO guarda info sobre su configuración, programas, hard, etc. Cada directorio (rama) guarda información específica y navegando por este directorio nos encontramos, en la parte derecha de la ventana, con las Entradas, las cuales tienen un Nombre, un Tipo de Datos y un Valor. Bueno... a ese valor vamos a crearlo, modificarlo o eliminarlo desde VBA.
Hagan backup del registro antes de seguir. Ya les avisé dos veces. ;)
Abrimos un nuevo libro, vamos a VBA y en el menú Herramientas/Referencias seleccionamos a l OCX WSH:
Luego de crear el objeto y tener acceso a sus propiedades, métodos y eventos, podremos manipular tres eventos que son (en este caso) de nuestro interés:
RegDelete: borrar
RegRead: leer
RegWrite: escribir
Empecemos con lo mas fácil: leer un valor (entrada) del registro. Visualicemos la ruta de acceso a la imagen que uso como fondo de escritorio:
Dim Registro As WshShell Sub LeerEntradaDelRegistro() 'en varias ocasiones no sabremos que tipo de datos vamos a leer, entonces 'dimensionamos una variable como Variant, así podemos guardar en ella 'cualquier tipo de datos: Dim Valor 'seteo el objeto Set Registro = New WshShell 'accedo a la entrada del registro (windows 7): Valor = Registro.RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper") 'lo muestro en un mensaje MsgBox Valor, vbInformation, "Info del Registro" 'destruyo el objeto, para liberar recursos Set Registro = Nothing End Sub
El código arriba descripto retorna lo siguiente:
bien. ya tengo la ruta, y ahora podría modificarla o eliminarla.
Para crear o modificar una entrada existente se utiliza el siguiente código:
Y les muestro una imagen de mi Registro, para que vean que no les miento:
Y para borrarla, mas que sencillo:
Sub CrearEditarEntrada() 'seteo la variable Set Registro = New WshShell 'le doy un nombre a mi programa Programa = "DamianExcel" 'y la ruta de acceso al mismo. Noten como concateno las variables y 'y nombres, para no generar errores Ruta = "C:\Program Files\DamianExcel" & "\" & Programa & ".exe" 'doy la orden de escritura. paso dos argumentos: '1)Name: rama_del_registro y programa '2)Value: el valor que tendrá la entrada, en este caso la ruta de acceso a mi programa: Registro.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\" & Programa & ".exe", Ruta 'destruyo el objeto, para liberar recursos Set Registro = Nothing End Sub
Y les muestro una imagen de mi Registro, para que vean que no les miento:
Sub BorrarEntrada() 'seteo la variable Set Registro = New WshShell'RegDelete se encargará de enviar la entrada al cementerio: Registro.RegDelete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\DamianExcel.exe" 'destruyo el objeto, para liberar recursos Set Registro = Nothing End Sub
Una cosa mas: si desean omitir la Referencia al objeto (desde el menú herramientas) podemos ir directamente a la automatización e invocarlo por código:
Set Registro = CreateObject("Wscript.Shell")
y así trabajarlo de idéntica forma.Vimos básicamente como crear, modificar y eliminar valores del registro de windows desde VBA, utilizando el objeto WSH.
Las aplicaciones? Infinitas. Podemos crear una entrada D_WORD (numérica) con, por ejemplo, el valor 10. Cada vez que nuestro usuario/cliente abra el archivo, con RegRead la leemos y con RegWrite decrementamos en valor en 1. Así le damos un período funcional de 10 aperturas para que vea si nuestro programa le sirve o no... lo que equivale a lo compra o no. De igual forma en lugar de un 10 también sería viable escribir una fecha y compararla... si transcurrieron "X" cantidad de días, las macros dejan de funcionar, o bien el archivo pierde características funcionales.
Cabe resaltar: comprenderán ahora el verdadero poder de VBA. Suelo reirme mucho cuando algunos "ningunean" a Visual Basic... quizás tiene sus puntos flojos (como todo), pero sabiéndolo manejar se pueden lograr cosas muy interesantes. El abuelo de VBA (el lenguaje BASIC) llegó para romper el monopolio de los grandes mainframes y sus todopoderosos departamentos de IT, de ahí que muchas de las versiones en contra de este lenguaje hayan nacido de quienes se les "arruinó" el negocio.
Tengan cuidado al momento de abrir archivos con macros, repito. Puedo tranquilamente leer sus PC's y hacerme llegar esa info por muchas vías, mientras les muestro como una macro colorea las celdas. Se entiende? Hace mucho tiempo que virus/malware/hackers,etc,etc dejaron de romper o arruinar un ordenador como "meta suprema", hoy el "curro" pasa por la obtención de información sobre el usuario. Y el Registro de Windows guarda mucha....
Tampoco piensen que están a la interperie, dado que Windows tiene sus defensas y si intentan acceder a ciertas ramas o valores solo obtendrán el error 70: "permiso denegado". Pero... por las dudas yo tendría mucho cuidado al activar una macro. El error 70 puede ser burlado por manos expertas.
Suerte y espero que les sea de utilidad.
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Etiquetas
Macros
Etiquetas:
Macros
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Para crear o modificar una entrada numérica hace falta un tercer argumento "REG_DWORD", por ejemplo para marcar la opción Compilar a petición:
ResponderEliminarRegistro.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\VBA\7.0\Common\CompileOnDemand", 1, "REG_DWORD"
Muchos de los problemas con el registro de Windows son debidos a cambiar el tipo de datos accidentalmente, por lo que siempre es recomendable indicarlos con el tercer argumento de RegWrite.
Pedro: muchas gracias x tu aporte sobre la forma correcta de escribir entradas numéricas. Nunca volví a tocar el tema (aquí solo toqué REG_SZ), ya que por ahí me voy a otros, de acuerdo a las consultas de mis lectores. Y así nunca mas escribí sobre esta forma de trabajo, ya que falta mucho por tratar.
ResponderEliminarDe nuevo gracias por el detalle importante que tocaste, a todos les será de utilidad a la hora de modificar el registro de windows.
Espectacular tu blog (http://pedrowave.blogspot.com/), la verdad que tiene ejemplos interesantísimos.
Damian, abusando de tu amabilidad y como bloqueros que somos adictos a Excel, no podemos olvidar las 4 funciones intrínsecas de VBA para editar el Registro de Windows: GetSetting, GetAllSettings, SaveSetting y DeleteSetting, aunque solo funcionen con claves de usuario en:
ResponderEliminarHKEY_CURRENT_USER\Software\VB and VBA Program Settings
Tiene la ventaja de no tocar otros registros de Windows, por lo que prima la seguridad.
Mi blog no pretende ser sobre Excel pero la mayoría de ejemplos de Interface Gráfico de Usuario (GUI en inglés) los preparo en esta herramienta de cálculo por ser la más extendida globalmente.
No hace falta decir que tu blog ya está en la lista de blogs que sigo y lo he linkado al mío.
Espero te animes a hacer comentarios en mi blog.
si, definitivamente sería una opción mas que correcta la que mencionas para usuarios noveles en el tema del registro, dado que se evitaría cometer algún error de gravedad. igualmente recomiendo una acción fundamental que yo mismo no llevé a cabo cuando me inicié con estas tareas: hacer una copia de seguridad antes de "tocar cualquier cosa", por que también resulta interesante conocer sobre todas las posibilidades de esta herramienta de trabajo. imaginate que una persona con tus conocimientos de informática tome un archivo que lleva la cuenta de sus aperturas en la clave que expones: en un segundo me arruina todo!!! jajaja. así que me veo en la necesidad de buscar "rutas alternativas" y evitar esto.
ResponderEliminartu blog, sencillamente, está espectacular y también soy seguidor ¿estaremos un poco sincronizados los excelmaníacos? me dedicaré a leer sus entradas, por que tiene proyectos muy buenos y de alto vuelo.
un abrazo y muchas gracias por tus comentarios.