Visual Basic - Ejecutar aplicacion en W2k/XP como usuario distint

Life is soft - evento anual de software empresarial
 
Vista:

Ejecutar aplicacion en W2k/XP como usuario distint

Publicado por Jalbam (26 intervenciones) el 18/08/2004 09:57:32
Hola, tengo una red con W2k, y los usuarios son del tipo restringido, periodicamente he de ejecutar unos archivos en cada máquina con el usuario "Administrador", como puedo crear un .exe que lo ejecute el usuario, y que por programa pase la clave del administrador al sistema sin que el usuario conozca dicha clave????
Gracias por adelantado
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:Ejecutar aplicacion en W2k/XP como usuario dist

Publicado por ruri (583 intervenciones) el 26/08/2004 04:42:10
Jalbam:
Hace un par de meses tuve un problema similar. Windows trae un programa llamado RunAs. Si hacés click derecho sobre un ejecutable con la tecla Shift apretada lo podés llamar. Tiene una versión de consola que acepta un montón de parámetros, excepto la contraseña. Yo lo "solucioné" a medias con un SendKeys. El tema es que si algo interrumpe el SendKeys queda una ventana de consola abierta (no muestra la conbtraseña). Normalmente al segundo intento sunciona sin problemas. Te mando el código, si se te ocurre como mejorarlo avisame
_________________________________________________________

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 = "Dominio\Administrador"
Private Const Password As String = "Clave Administrador"
'############################################################################
'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
________________________________________________________
Si el código no funciona, revisá los parámetros de Runas (desde consola colocá runas /?). Depende como esté configurada tu red podés necesitar pasar algún otro parámetro

Espero que te sea útil
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