Visual Basic - runas...

Life is soft - evento anual de software empresarial
 
Vista:

runas...

Publicado por Mara (143 intervenciones) el 29/08/2004 05:42:15
tego winxp estoy en sesion con una cuenta limitada, quiero en un boton de comando programar que ejecute otra aplicacion pero como administrador, se que se hace con RunAs, pero quiero dar en el codigo la contraseña y no que me la pida cuando doy click en el boton porque el administrador no va a estar cuando se de click......
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:runas...

Publicado por RURI (583 intervenciones) el 29/08/2004 06:06:32
Mara:
Hace unos meses tuve que crear un módulo que hace lo que vos querés, la diferencia radica es que recibe el path del programa con una línea de órdenes. A continuación lo pego, es fácil de adaptar. Si tenés más dudas abrí una ventana de consola y teclea runas /?

Option Explicit
DefLng A-Z

Private Declare Function AllocConsole Lib "kernel32" () As Long
Private Declare Function FreeConsole Lib "kernel32" () As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, lpReserved As Any) As Long
Private Const STD_OUTPUT_HANDLE = -11&
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

'############################################################################
'CONSTANTES (INICIO)
'############################################################################
Private Const DominioUsuario As String = "GRUPODETRABAJO\Administrador"
Private Const Password As String = "PASSWORD"
'############################################################################
'CONSTANTES (FIN)
'############################################################################

'Bug: A veces, Sendkeys no envía la contraseña correctamente. Ocurre cuando hay otra consola abierta
'Para que el programa funcione, no debe haber otra consola abierta
'Nota: La siguiente línea sirve para escribir texto en la consola ('sOut contiene el texto que quiere escrfibirse, cWritten el número de caracteres escritos)
'Result = WriteConsole(hConsole, ByVal sOut, Len(sOut), cWritten, ByVal 0&)

'El módulo lee la línea de comandos para saber que programa ejecuta
'Cambiá los argumentos de la línea de comandos del proyecto. Está puesta my versión del interdev ubicado en D:\...

Public Sub Main()
On Error Resume Next
Dim hConsole As Long, l As Long, lExitCode As Long
Dim Result As Long, sOut As String, cWritten As Long, r As Single, strCmd As String

strCmd = Command$ 'lee la línea de comandos
If Left$(strCmd, 1) <> Chr$(34) Then Chr$ (34) & strCmd 'Si falta la comilla izquierda la coloca
If Right$(strCmd, 1) <> Chr$(34) Then Chr$ (34) & strCmd 'Si falta la comilla derecha la coloca
If AllocConsole() Then 'Asigna una nueva consola al proceso llamante.
hConsole = GetStdHandle(STD_OUTPUT_HANDLE) 'Obtiene el manejador de consola
If hConsole = 0 Then MsgBox "No se pudo iniciar la consola" 'Si falló devuelve mensaje
Else
MsgBox "No se pudo iniciar la consola" 'Si no puede asignar una conslola, devuelve mensaje
End If
'Corre un programa de consola, al estar tomada la consola por nuestro proceso,
'todo instrucción que corre por consola va a parar a nuestra consola y a ninguna otra
r = Shell("runas /user:" & DominioUsuario & " " & strCmd)
'Espera 500 ms para permitir la carga del programa runas en la consola
Wait 500
'Activa la ventana de la consola
AppActivate r
'Tipea el password en la ventana activa e introduce un enter
SendKeys Password & "{ENTER}"
'Espera 500 milisegundos para que efectivice la llamada (una eternidad)
Wait 500
CloseHandle hConsole 'Cierra la consola
FreeConsole 'Libera recursos
Wait 500
End Sub

Private Sub Wait(ByVal tm As Long)
Dim iniTime As Long
iniTime = timeGetTime
Do
DoEvents
Loop Until (timeGetTime - iniTime) > tm
End Sub

Saludos Ruri
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar