Crear accesos directos de Windows desde aplicaciones Java

13 08 2010

Una de las cuestiones sobre las que no existe demasiada información en la red es la creación de accesos directos de Windows de forma programática y menos aún cómo hacerlo desde una aplicación Java. En este post explicaré cómo realizar esta tarea de una manera bastante sencilla.

Para empezar, decir que no existe ningún comando en Windows con el que sea posible crear accesos directos, al menos en Windows XP y Windows Server hasta su versión 2008.

Imaginemos ahora el siguiente escenario: tenemos un recurso compartido por Samba o en nuestra red de Windows y tenemos un aplicativo Java ejecutándose desde un servidor Windows Server 2008 que se encarga de hacer accesible este recurso desde todos los equipos de la red, mediante un acceso directo en el escritorio de los usuarios, por ejemplo. Asumiendo que tenemos ya controlado el acceso por Samba a los equipos desde nuestra aplicación, las dos cuestiones a resolver para conseguir nuestro objetivo son:

1. Averiguar qué mecanismo usa Windows para la creación de accesos directos y

2. Hacer una llamada al mismo desde nuestra aplicación Java.

Analicemos ambas cuestiones por separado:

1. Averiguar qué mecanismo usa Windows para la creación de accesos directos:

Tras mucho buscar en Internet topé con una buena referencia [1] de la cual se desprende que para crear accesos directo en Windows programáticamente es a través de CScript.

Sabiendo esto, podemos escribir un sencillo script como el siguiente:

'Creación del objeto Shell
Set WshShell = WScript.CreateObject("WScript.Shell")

'Recuperamos los argumentos de la llamada a este script
LinkName = WScript.Arguments(0)
LinkPath = WScript.Arguments(1)
LinkTargetPath = WScript.Arguments(2)

'Definimos la localización del fichero LNK
LinkFilename = LinkPath + "\" + LinkName + ".lnk"

'Creamos el objeto LNKFile
Set LNKFile = WshShell.CreateShortcut(LinkFilename)

'Establecemos los contenidos del fichero LNK
LNKFile.TargetPath = LinkTargetPath
LNKFile.Arguments = ""
LNKFile.Description = "Acceso directo a " + LinkTargetPath
LNKFile.HotKey = ""
LNKFile.WindowStyle = "1"
LNKFile.WorkingDirectory = ""

'Guardamos el fichero LNK en disco
LNKFile.Save

A este script lo llamaremos createlnk.vbs y recibirá tres parámetros: 1º: nombre para el fichero (sin extensión), 2º: ruta donde se guardará el fichero lnk (p.e.:c:\links), 3º: destino del acceso directo (p.e.: \\shared\folder).

Obsérvese que este script se ejecutará en nuestro servidor, en el cual se está ejecutando la aplicación Java.

2. Hacer una llamada al mismo desde nuestra aplicación Java:

Esta parte es más sencilla, puesto que desde Java es posible lanzar ejecutables mediante la creación y ejecución de procesos. La llamada al script descrito en el primer punto podría ser algo como lo siguiente:

Process process = Runtime.getRuntime().exec("cscript \"c:\\scripts\\createlnk.vbs\" \"test\" \"c:\\links \\\\shared\\resource\"");
if (process.waitFor() == 0) {
    // OK
} else {
    // Error
}

Sólo quedaría copiar este acceso directo a las máquinas remotas que nos interesen mediante Samba.

Referencias:

[1] Administering Windows Server 2008 Server Core

Anuncios

Acciones

Information

4 responses

20 10 2011
joselopezpua

Hola neook07, los parámetros debes pasarlos en el código Java, que es el que invoca al shell script con Runtime.getRuntime().exec. Si te fijas, lo que haces es componer un string con la llamada al script tal y como la harías desde el símbolo del sistema. Prueba a hacer la llamada al script manualmente y cuando te cree el acceso directo correctamente, incrusta la llamada en el código java parametrizando ésta llamada a tu gusto.

Espero que esto te ayude.

Saludos!

20 10 2011
neook07

muchas gracias por la ayuda, ya me resulto, pero tengo un problema, cuando voy a compilar, el compilador no copia las librerias, entonces no sirve de nada, no se si sera por el ide con el que trabajo, es netbeans 6.9

20 10 2011
joselopezpua

Este caso concreto no precisa librerías específicas, es más, la clase Runtime y Process pertenecen a java.lang. Tu problema se sale del ámbito de este post 😉

Saludos y gracias por tu lectura.

19 10 2011
neook07

hola, muy interesante tu post, pero hay unas cosa que no entiendo, cuando hago el script, donde paso los parametros, en el escript? o en el codigo java, de veras que estoy haciendo mi propio instalador en java pero esto de los accesos directos es lo que me tiene un poco con la cabeza grande, de antemano gracias por su atencion.

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




A %d blogueros les gusta esto: