Principales respuestas
¿Es posible editar los datos de un acceso directo que ya exista?

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
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
-
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
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.
- Propuesto como respuesta Jorge TurradoMVP domingo, 30 de julio de 2017 14:54
-
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
-
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.- Propuesto como respuesta Jorge TurradoMVP domingo, 30 de julio de 2017 20:12
- Votado como útil Jorge TurradoMVP domingo, 30 de julio de 2017 20:12
-
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
-
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
-
-
-
¿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
-
-
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
-