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.