uncomment - Credenciales elevadas para VB6
vba comment multiple lines (3)
Necesito obtener credenciales elevadas (para iniciar un servicio) en una aplicación VB6, pero solo si el usuario necesita reiniciar el servicio (es decir, no quiero obtener credenciales elevadas cada vez que se inicia la aplicación, solo cuando el usuario selecciona reiniciar ) ¿Cómo puedo hacer esto en VB6?
Bastante fácil, pero la forma preferida implica un nuevo proceso elevado. Este ejemplo se usa con un interruptor para saber que se debe realizar el Inicio del servicio en lugar de las operaciones normales:
VERSION 5.00
Begin VB.Form Form1
BorderStyle = 1 ''Fixed Single
Caption = "Form1"
ClientHeight = 3060
ClientLeft = 45
ClientTop = 345
ClientWidth = 4560
LinkTopic = "Form1"
MaxButton = 0 ''False
MinButton = 0 ''False
ScaleHeight = 3060
ScaleWidth = 4560
StartUpPosition = 3 ''Windows Default
Begin VB.CommandButton Command1
Caption = "Start Service"
Height = 495
Left = 1448
TabIndex = 0
Top = 1283
Width = 1665
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Const BCM_SETSHIELD As Long = &H160C&
Private Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" ( _
ByVal hWnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Sub Command1_Click()
ShellExecute hWnd, "runas", App.EXEName & ".exe", "-start", CurDir$(), vbNormalFocus
End Sub
Private Sub Form_Load()
If UCase$(Trim$(Command$())) = "-START" Then
Caption = "Starting Service"
Command1.Visible = False
''Service starting functionality goes here.
Else
Caption = "Service Starter"
''For Shield to work you must have a Common Controls v. 6
''manifest and call InitCommonControls before loading
''this form (i.e. preferably from Sub Main).
SendMessage Command1.hWnd, BCM_SETSHIELD, 0&, 1&
Command1.Visible = True
End If
End Sub
Deberá llamar al WinAPI - CoImpersonateClient o LogonUser.
Solo recuerde disminuir sus privilegios después, y sea DARN cuidadoso con lo que hace cuando está elevado (por ejemplo, no haga NADA con la entrada del usuario).
Otra opción, que creo que es preferible (si está disponible), es usar un objeto configurado COM +. Puede hacer que el subsistema COM + administre credenciales, y simplemente limitar el acceso para llamar al objeto según sea necesario. Esto tiene la ventaja de crear un límite de confianza REAL entre el código de bajo privilegio y el código de alto privilegio.
Una solución es usar el alias de elevación COM http://msdn.microsoft.com/en-us/library/ms679687(VS.85).aspx .
Este enlace debería ser útil si su objetivo es VB6 http://www.vbforums.com/showthread.php?t=459643 .