Ayuda con mi programa

Iniciado por LukaCrosszeria, 19 Mayo 2014, 18:52 PM

0 Miembros y 1 Visitante están viendo este tema.

LukaCrosszeria

Saludos!

Tengo una duda, como puedo agregar/eliminar una variable de sistema permanentemente? He leido guias y lo he logrado, pero automaticamente en el reinicio se elimina. Quisiera que se quedaran permanentemente este es el codigo que tengo:




Public Class Form1
    Public Declare Function SetEnvironmentVariable Lib "kernel32.dll" Alias "SetEnvironmentVariableA" (ByVal _
     lpName As String, ByVal lpValue As String) As Long
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SetEnvironmentVariable("Test", "1234")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Shell("shutdown -r -f -t 0") 'Reinicia el equipo en Win XP
    End Sub
End Class




Saludos!

kub0x

Buenas LukaCrosszeria,

tú código es totalmente funcional sólo para modificar variables del sistema temporalmente, nada queda guardado en el registro. Para ello deberías replantear tu código y adaptarlo para que escriba en el registro.

La siguiente información la he extraído de la msdn donde tienes la documentación completa de como trabajar con Environment Variables:

Citar
...
...
Calling SetEnvironmentVariable has no effect on the system environment variables. To programmatically add or modify system environment variables, add them to the HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment registry key
...
...

Link -> http://msdn.microsoft.com/en-us/library/windows/desktop/ms682653%28v=vs.85%29.aspx

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


LukaCrosszeria

Saludos!


Hice lo que pude, intente agregar al registro el valor directamente pero me da un error.

Este es el codigo:



Imports System.IO
Imports System.Security.Principal
Public Class Form1
    Public Declare Function SetEnvironmentVariable Lib "kernel32.dll" Alias "SetEnvironmentVariableA" (ByVal _
     lpName As String, ByVal lpValue As String) As Long
    Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        My.Computer.Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Control\Session Manager\Environment").SetValue("Test", "1234", Microsoft.Win32.RegistryValueKind.String)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Shell("shutdown -r -f -t 0") 'Reinicia el equipo en Win XP
    End Sub

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

    End Sub
End Class

kub0x

Para escribir en la rama del registro (HKLM) del sistema necesitas de privilegios de administrador ya que las políticas ahí expuestas son comunes a todos los usuarios, por lo que win$ lleva un control riguroso sobre las modificaciones. Por lo demás todo se ve fino, aunque no lo probé.

Aun así aqui puedes echarle un vistazo a la documentación de la msdn sobre las Registry Keys: http://msdn.microsoft.com/es-es/library/2kk9bxk9%28v=vs.110%29.aspx

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


LukaCrosszeria

En tal caso, como le daria permisos a mi programa para que pudiera registrar las llaves de entradas en el registro de Environments  Variables?

kub0x

Buenas de nuevo,

se me ocurren dos maneras, la primera es manual y sería ejecutando el programa en modo administrador para otogarle los máximos privilegios del usuario.

La otra es mediante el manifiesto de la aplicación .NET, los manifiestos son archivos que describen propiedades (así como los de metadatos) y una de esas propiedades define el nivel de privilegios requerido por la aplicación, esto último lo podras leer aquí: http://msdn.microsoft.com/es-es/library/bb384691.aspx

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


LukaCrosszeria

Este es el error que me da:



kub0x

Anteriormente te dije que era la falta de privilegios, realmente necesitas permisos de lectura sobre esa rama del registro, aquí te dejo la descripción de la excepción segun la MSDN pero es algo sobre lo que ya te he advertido, nada nuevo:

Citar
UnauthorizedAccessException   

The RegistryKey is read-only, and cannot be written to; for example, the key has not been opened with write access.

Esto está extraído del segundo enlace que puse...

Cita de: kub0x en 20 Mayo 2014, 00:42 AM
...
Aun así aqui puedes echarle un vistazo a la documentación de la msdn sobre las Registry Keys: http://msdn.microsoft.com/es-es/library/2kk9bxk9%28v=vs.110%29.aspx
...

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate