none
¿Es posible editar los datos de un acceso directo que ya exista? RRS feed

  • Pregunta

  • He visto procedimientos para crear un acceso directo, pero se puede modificar un acceso directo que ya exista via código? (VB Net)

    O sea, asignar el acceso directo a un objeto y cambiar sus propiedades.

    • Editado James2016-2 domingo, 30 de julio de 2017 7:05
    domingo, 30 de julio de 2017 7:04

Respuestas

  • Hola James:

     En la mañana te prepare un ejemplo, pero cuando se tiene a un pequeño de 10 meses, aveces no siempre podemos dedicarnos a otras cosas :-)

     Bien, modificar las propiedades de un Shorcut desde código administrado Vb.Net, es posible, solo tendrás que explorar la funcionalidad del objeto COM Shell, en el ejemplo que pondré abajo, hacemos dos cosas, para fines meramente didácticos crearemos un shortcut en el escritorio del usuario y posteriormente cambiaremos las propiedades de ese shortcut.

     Codigo:

        Private Sub CreateAndChangueShotCutInformation()
    
            Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
            Const name = "shortCutTest"
            Dim shl As New Shell32.Shell
            'Para fines de prueba creamos el acceso directo
            Dim sw As New StreamWriter(path + "\" + name + ".lnk", False)
            sw.Close()
    
            Dim dir As Shell32.Folder = shl.[NameSpace](path)
            Dim itm As Shell32.FolderItem = dir.Items().Item(name + ".lnk")
            Dim lnk As Shell32.ShellLinkObject = DirectCast(itm.GetLink, Shell32.ShellLinkObject)
            'Aqui es donde modificamos las propiedades
            lnk.Path = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\notepad.exe"
            lnk.Description = "Coloca aqui los comentarios que gustes"
            lnk.Arguments = "c:\sample.txt"
            lnk.WorkingDirectory = "c:\"
    
            lnk.Save()
        End Sub

    Como mencione, en el ejemplo anterior creamos y modificamos las propiedades del shortcut, en el codigo siguiente unicamente para fines didacticos, he separado el metodo anterior para que veas como modificar un shotcut ya creado, no necesariamente por nuestro codigo, podria ser uno creado previamente por el usuario:

     Código ejemplo:

        Private Sub ChangueShortCutInformation()
            Dim shl As New Shell32.Shell
            Dim dir As Shell32.Folder = shl.[NameSpace]("E:\Repository\Desktop\")
            Dim itm As Shell32.FolderItem = dir.Items().Item("Seguro.jpg - Acceso directo.lnk")
            Dim lnk As Shell32.ShellLinkObject = DirectCast(itm.GetLink, Shell32.ShellLinkObject)
            lnk.Path = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\notepad.exe"
            lnk.Description = "nobugz was here"
            lnk.Arguments = "c:\sample.txt"
            lnk.WorkingDirectory = "c:\"
    
            lnk.Save()
        End Sub

     Creo que esto podría ser una aproximación de lo que requieres.

    Espero te sea de utilidad.



    Saludos desde Monterrey, Nuevo León, México!!!

    • Propuesto como respuesta Pedro Ávila lunes, 31 de julio de 2017 3:24
    • Marcado como respuesta James2016-2 martes, 1 de agosto de 2017 2:32
    lunes, 31 de julio de 2017 2:51
  • Crea un nuevo acceso directo basado en uno existente, de hecho mantiene el valor de la opción 'ejecutar como administrador'. 


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta James2016-2 domingo, 30 de julio de 2017 20:47
    domingo, 30 de julio de 2017 19:12

Todas las respuestas

  • Abre el acceso directo con el Notepad, y observa el contenido. Verás que es puro texto, y que son una serie de secciones entre [] y luego una serie de parejas con Nombre=valor. Si lo abres en modo texto (por ejemplo, con File.ReadAllLines, cambias los valores, y lo vuelves a salvar (File.WriteAllLines) conseguirás modificar el acceso directo.
    domingo, 30 de julio de 2017 13:04
  • Gracias por la idea, trato de hacerlo pero no consigo visualizar las líneas. Este código funciona con un archivo de texto normal, pero no con un .lnk, cambiando incluso las codificaciones.

    ------------------------------------------------------------------

    Dim cTexto As String() = File.ReadAllLines("D:\AccesoDirecto.lnk")

     For Each cLinea As String In cTexto

        TextBox1.Text = TextBox1.Text & cLinea & Chr(13) & Chr(10)
     Next

    ------------------------------------------------------------------
    Qué puede estar fallando?

    Otra cosita: veo que al intentar abrirlo con el notepad, abre el ejecutable al que hace referencia ¿cómo ver el texto del .lnk y no del ejecutable al que apunta?

    (Trabajo en VS 2015 (VB net) instalado en Windows 10 Pro)
    • Editado James2016-2 domingo, 30 de julio de 2017 15:57
    domingo, 30 de julio de 2017 15:46
  • Agrega a tu proyecto la referencia 'Windows Script Host Object Model'


    Para el ejemplo intente cambiar algunas propiedades del acceso directo 'calc.exe.lnk' creado en mi escritorio.

    Agrega el espacio de nombres: Imports IWshRuntimeLibrary

    Dim Shell As New WshShell
    
    Dim link = CType(Shell.CreateShortcut(
    	Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "calc.exe.lnk")),
    	IWshShortcut)
    
    link.Description = "Mi calculadora"
    link.TargetPath = "D:\MyCalc\calc.exe"
    link.IconLocation = "D:\MyCalc\MyCalc.ico"
    link.Save()


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    domingo, 30 de julio de 2017 18:15
  • Gracias, pero en el código que me das no edita un acceso existente sino que crea uno nuevo porque usas Create.shortcut (¿o estoy errado?)

    ---------------------------------------

    Te explico lo que trato de hacer y hasta ahora no lo logro:

    Tengo un acceso directo que ejecuto como administrador (en propiedades del acceso directo\opciones avanzadas...) tiene habilitado: Ejecutar como administrador

    Trato de editar el comando de ese acceso directo porque si creo uno nuevo el nuevo ya no se crea habilitado para ser ejecutado como administrador.

    Nota: cambiar app.manifest para ejecutar como administrador, en este caso no me sirve, al ejecutar el comando igual dice que necesita privilegios elevados. Runas tampoco pq habría que poner la contraseña de usuario para que se ejecute automáticamente.

    ---------------------------------------------------------------

    O alguna propiedad que permita indicar que el acceso directo se ejecute como Administrador.


    • Editado James2016-2 domingo, 30 de julio de 2017 18:58
    domingo, 30 de julio de 2017 18:46
  • Crea un nuevo acceso directo basado en uno existente, de hecho mantiene el valor de la opción 'ejecutar como administrador'. 


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta James2016-2 domingo, 30 de julio de 2017 20:47
    domingo, 30 de julio de 2017 19:12
  • Sí, tienes razón, lo edita porque conserva el resto de propiedades, pero justo me deshabilita: Ejecutar como administrador.

    No sé si será por la versión de Windows, tengo Windows 10 Pro (1703)

    domingo, 30 de julio de 2017 19:26
  • Hola de nuevo, creo que la opción "Ejecutar como administrador" se desactiva solo cuando se cambia la Propiedad Destino (o sea el comando). Porfa prueba eso para estar seguro que funciona así y no es que en mi máquina esté funcionando distinto.
    domingo, 30 de julio de 2017 20:09
  • ¿Te refieres a la propiedad TargetPath?. El ejemplo que he escrito y donde se demuestra que la configuración de 'Ejecutar como administrador' permanece se basa en cambiar el valor de las propiedades 'Description', 'TargetPath' y 'IconLocation'.

    Hasta donde conozco todas las propiedades deberían conservar su valor, de hecho en la animación que adjunto -en el comentario anterior- demuestro lo que menciono. Nunca he probado configurar la opción de 'Ejecutar como administrador' desde código, sin embargo encontré un enlace que quizá pueda ayudarte, no puedo asegurar que sea el mecanismo correcto o que cuanto menos funcione (el Hack se encuentra a partir de la línea 15).

    C# code for Creating Shortcuts with Admin Privilege



    domingo, 30 de julio de 2017 20:19
  • Muchas gracias, pucha, en mi máquina al cambiar la propiedad TargetPath automáticamente se deshabilita la opción y ya no se puede ni activarla manualmente.

    Voy a seguir intentando con el enlace que pusiste.

    domingo, 30 de julio de 2017 20:47
  • Hola James:

     En la mañana te prepare un ejemplo, pero cuando se tiene a un pequeño de 10 meses, aveces no siempre podemos dedicarnos a otras cosas :-)

     Bien, modificar las propiedades de un Shorcut desde código administrado Vb.Net, es posible, solo tendrás que explorar la funcionalidad del objeto COM Shell, en el ejemplo que pondré abajo, hacemos dos cosas, para fines meramente didácticos crearemos un shortcut en el escritorio del usuario y posteriormente cambiaremos las propiedades de ese shortcut.

     Codigo:

        Private Sub CreateAndChangueShotCutInformation()
    
            Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
            Const name = "shortCutTest"
            Dim shl As New Shell32.Shell
            'Para fines de prueba creamos el acceso directo
            Dim sw As New StreamWriter(path + "\" + name + ".lnk", False)
            sw.Close()
    
            Dim dir As Shell32.Folder = shl.[NameSpace](path)
            Dim itm As Shell32.FolderItem = dir.Items().Item(name + ".lnk")
            Dim lnk As Shell32.ShellLinkObject = DirectCast(itm.GetLink, Shell32.ShellLinkObject)
            'Aqui es donde modificamos las propiedades
            lnk.Path = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\notepad.exe"
            lnk.Description = "Coloca aqui los comentarios que gustes"
            lnk.Arguments = "c:\sample.txt"
            lnk.WorkingDirectory = "c:\"
    
            lnk.Save()
        End Sub

    Como mencione, en el ejemplo anterior creamos y modificamos las propiedades del shortcut, en el codigo siguiente unicamente para fines didacticos, he separado el metodo anterior para que veas como modificar un shotcut ya creado, no necesariamente por nuestro codigo, podria ser uno creado previamente por el usuario:

     Código ejemplo:

        Private Sub ChangueShortCutInformation()
            Dim shl As New Shell32.Shell
            Dim dir As Shell32.Folder = shl.[NameSpace]("E:\Repository\Desktop\")
            Dim itm As Shell32.FolderItem = dir.Items().Item("Seguro.jpg - Acceso directo.lnk")
            Dim lnk As Shell32.ShellLinkObject = DirectCast(itm.GetLink, Shell32.ShellLinkObject)
            lnk.Path = Environment.GetFolderPath(Environment.SpecialFolder.System) + "\notepad.exe"
            lnk.Description = "nobugz was here"
            lnk.Arguments = "c:\sample.txt"
            lnk.WorkingDirectory = "c:\"
    
            lnk.Save()
        End Sub

     Creo que esto podría ser una aproximación de lo que requieres.

    Espero te sea de utilidad.



    Saludos desde Monterrey, Nuevo León, México!!!

    • Propuesto como respuesta Pedro Ávila lunes, 31 de julio de 2017 3:24
    • Marcado como respuesta James2016-2 martes, 1 de agosto de 2017 2:32
    lunes, 31 de julio de 2017 2:51
  • Muchas gracias, una de las cosas apasionantes que tiene la programación es que se puede hacer la misma cosa de varias maneras.
    martes, 1 de agosto de 2017 2:33