none
Ejecutar misma aplicación con privilegios elevados pasando parámetros cuando la aplicación es de única instancia RRS feed

  • Pregunta

  • Hola como están!, 

    Tengo un problema, tengo una aplicación de única instancia, necesito ejecutar la misma aplicación con privilegios de administrador y pasar le un parametro, hasta ahi todo funciona bien.

    Para eso utilizo el evento MyApplication_StartupNextInstance, el problema aparece cuando necesito escribir en el registro del sistema y necesito permisos de administrador, como no se esta ejecutando una nueva instancia, sino que los parametros se pasan a la instancia existente, que no esta corriendo con permisos de administrador, no puedo escribir en el registro del sistema.

    este es el código que estoy utilizando:

    Imports System.Security.Principal
    Imports Microsoft.VisualBasic.ApplicationServices
    Imports Microsoft.Win32
    
    Namespace My
        Partial Friend Class MyApplication
            Private Sub MyApplication_StartupNextInstance(sender As Object, e As StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
                Try
                    For Each arg As String In  e.CommandLine
                        Select Case arg.Trim.ToLower
                            Case "-dwk"
                                disableWindowsKey(True)
                            Case "-ewk"
                                disableWindowsKey(False)
                        End Select
                    Next
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End Sub
    
            Private Sub disableWindowsKey(ByVal state As Boolean)
                Dim procStartInfo As New ProcessStartInfo
                Dim procExecuting As New Process
                Dim identity = WindowsIdentity.GetCurrent()
                Dim princi = New WindowsPrincipal(identity)
                Dim isElevated As Boolean = princi.IsInRole(WindowsBuiltInRole.Administrator)
                Dim regScancode As RegistryKey
                Dim binary As Byte() = New Byte() {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0, &H3, &H0, &H0, &H0, &H0, &H0, &H5B, &HE0, &H0, &H0, &H5C, &HE0, &H0, &H0, &H0, &H0}
                Try
                    If isElevated Then
                        regScancode = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Control\\Keyboard Layout", True)
                        If regScancode Is Nothing Then
                            regScancode = Registry.LocalMachine.CreateSubKey("System\\CurrentControlSet\\Control\\Keyboard Layout")
                        End If
                        If (Not regScancode Is Nothing) Then
                            If state Then
                                regScancode.SetValue("Scancode Map", binary, RegistryValueKind.Binary)
                                regScancode.Close()
                            Else
                                regScancode.DeleteValue("Scancode Map")
                                regScancode.Close()
                            End If
                        End If
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End Sub
    
        End Class
    End Namespace

    Mi pregunta es, hay alguna forma de solucionar mi problema:

    Sin ejecutar la aplicación siempre como administrador.

    Manteniendo la aplicación como única instancia.




    jueves, 5 de mayo de 2016 1:05

Todas las respuestas