Autor
|
Tema: Ayuda VBS, por favor!!!! (Leído 4,630 veces)
|
matarcola2
Desconectado
Mensajes: 14
|
Hola a tod@s, por favor si alguien puede ayudarme a crear un VBS que compruebe regularmente si una aplicación de windows ha estado cierto tiempo inactiva (de procesador o peticiones de memoria) y entonces se cierre.
La razón es que la empresa en al que trabajo tenemos más usuarios que licencias para un programa de gestión, pero no todos los usuarios necesitan el programa abierto toda la jornada. Incluso algunos usuarios lo abren por la mañana, se sacan la información que necesita y lo minimizan y no lo vuelven a utilizar hasta pasadas unas horas, de esta manera impidien que otros usuarios puedan entrar.
La cuestión mi idea es implantar por GPO (o no) una tarea programada que ejecute un VBS regularmente que compruebe la inactividad del proceso (nombreprograma.exe) y si no se ha usado por ejemplo en xx minutos le haga un taskkill.
Muchas gracias a todos.
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.821
|
Lo que pides no es tán fácil, Es un proceso, No un servicio, Desde el momento en que ejecutas el proceso, Este no marca un estado "Idle" de inactividad porque sigue abierto y con las dll's cargadas... O al menos por eso creo lo creo, No lo sé..
Con algo de esto te podría hacer una verificación:
- ¿Sabes que dll's carga el programa cuando está "activo", en uso? (No las que carga al abrir el programa, sino las que carga cuando "sacas información", Compruebalo.) - ¿Al programa se le manda algún parámetro al usarlo? Por ejemplo, si tiene que abrir un archivo, etc... - Si el nombre de la ventana del programa cambia entre el estado "en uso" e "inactivo", Entonces dime el nombre exacto del título de la ventana del programa cuando el programa no hace nada. - ¿El programa se minimiza a la barra de tareas, o al área de notificación? ¿Si el programa se encuentra minimizado en cualquiera de los dos casos, significa al 100% que el usuario ya ha terminado su tarea y se podría terminar el proceso?
PD: Y supongo, que la solución también te sirve en un bat, no?.
Salu2.
|
|
« Última modificación: 7 Mayo 2012, 13:25 pm por EleKtro H@cker »
|
En línea
|
|
|
|
matarcola2
Desconectado
Mensajes: 14
|
Hola.
Muchas gracias por tu respuesta.
La cuestión es que no controlo nada de dll´s, nombres de ventana, etc...
El programa se minimiza en la barra de tareas, pero eso no significa que ya se pueda cerrar, se tendría que cerrar al pasar 15 minutos, p.ej..
Despues de varios días buscando, en algún lado había visto un código en VBS que comprobaba los procesos de windows en ejecución y el consumo de recursos (procesador, memoria, etc...) pero no he sabido como adaptarlo a lo que yo quiero, pero eso he recurrido a este foro.
La cuestión es que si un usuario no ha utilizado el programa en 15-20 minutos es que no le ha hecho falta y podría haberlo utlizado otro usuario en su lugar.
Me da igual si es en VBS o un .bat.
Muchas gracias.
|
|
|
En línea
|
|
|
|
matarcola2
Desconectado
Mensajes: 14
|
Hola a tod@s, por favor si alguien puede ayudarme a crear un VBS que compruebe regularmente si una aplicación (proceso en ejecución) de windows ha estado cierto tiempo inactiva (de procesador o peticiones de memoria) y en caso de haber estado inactiva xx minutos cerrar dicha aplicación.
La aplicación corre localmente en los equipos y consume licencia al estar abierta y conectarse al BDSERVER.
La razón es que la empresa en al que trabajo tenemos más usuarios que licencias (son caras) para un programa de gestión que utlizamos, pero no todos los usuarios necesitan el programa abierto toda la jornada. Incluso algunos usuarios lo abren por la mañana, se sacan la información que necesita y lo minimizan y no lo vuelven a utilizar hasta pasadas unas horas, de esta manera impidien que otros usuarios puedan entrar.
Mi idea sería distribuirlo por GPO (o no) como una tarea programada que ejecute un VBS regularmente que compruebe la inactividad del proceso (nombreprograma.exe) y si no se ha usado en ese equipo por ejemplo en xx minutos le haga un taskkill.
Hace algún tiempo, en algún lado había visto un código en VBS que comprobaba los procesos de windows en ejecución y el consumo de recursos (procesador, memoria, etc...) pero no he sabido como adaptarlo a lo que yo quiero, pero eso he recurrido a vosotros..
La cuestión es que si un usuario no ha utilizado el programa en 15-20 minutos es que no le ha hecho falta y podría haberlo utlizado otro usuario en su lugar.
Muchas gracias.
|
|
|
En línea
|
|
|
|
matarcola2
Desconectado
Mensajes: 14
|
Hola, googleando me he encontrado estepost de Delphi: Basicamente obtenemos el tiempo de CPU que lleva la aplicacion, esperamos unos milisegundos y volvemos a obtener el tiempo de CPU. La diferencia entre uno y otro nos permite el % de CPU que ha usado la aplicacion. 1.uses PsApi; 2. 3.function CPUTime(Path: String): Integer; 4.var 5. Procesos: array[1..1024] of DWORD; 6. Needed, i: DWORD; 7. Process: THandle; 8. ModName: array[0..MAX_PATH] of Char; 9. CreationTime: FILETIME; 10. ExitTime: FILETIME; 11. KernelTime: FILETIME; 12. UserTime: FILETIME; 13. OldTime: int64; 14.begin 15. Result:= 0; 16. if EnumProcesses(@Procesos,SizeOf(Procesos),Needed) then 17. begin 18. for i:= 1 to (Needed div Sizeof(DWORD)) do 19. begin 20. Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, 21. FALSE,Procesos[i]); 22. if Process <> 0 then 23. begin 24. if GetModuleFileNameEx(Process,0,ModName,SizeOf(ModName)-1)>0 then 25. begin 26. if StrIComp(ModName,PChar(Path)) = 0 then 27. begin 28. if GetProcessTimes(Process,CreationTime,ExitTime,KernelTime,UserTime) then 29. begin 30. OldTime:= int64(KernelTime) + int64(UserTime); 31. Sleep(100); 32. if GetProcessTimes(Process,CreationTime,ExitTime,KernelTime,UserTime) then 33. begin 34. Result:= (int64(KernelTime) + int64(UserTime) - OldTime) div 10000; 35. end; 36. end; 37. // Solo usamos el primer proceso que encontramos 38. break; 39. end; 40. end; 41. CloseHandle(Process); 42. end; 43. end; 44. end; 45.end; Ejemplo de uso: 1. 2.ShowMessage(IntToStr(CPUTime('c:\windows\notepad.exe'))); 3.
Si alguien supiese adaptarlo a un script que se ejecute desde una tarea programada pero en vez de mucho consumo de cpu en unos segundos controlase el poco consumo de cpu en determinado tiempo, ya lo tendríamos...
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.821
|
Hola de nuevo, El % De CPU no es lo mismo que el CPUTIME, Lo digo por el code de Delphi, Aunque puedes obtener el %CPU con esta operación: TotalProcessRuntime / CpuTime / 100EDITO: Y otra cosa, No te recomiendo nada que las comprobaciones se hagan cada X milisegundos... Por dios, ¿Quieres reventar el PC? xD, Deja segundos de margen.
No es exactamente lo que pides, Pero aquí tienes: :: By Elektro H@cker :: :: Este code comprueba cuantos ciclos (Tiempo de CPU) se han utilizado desde el inicio del proceso. Si el ciclo de tiempo es superior al máximo permitido, Mata el proceso. :: PD: Hay un POSIBLE margen de error de tiempo de 10 segundos debido a que es el lapsus de tiempo (Delay) que tarda en actualizarse TASKLIST internamente. :: :: :: :: CONFIGURACIÓN :: :: Program=El nombre del proceso a comprobar. :: MAX_CPU_Activity_Time=HORAS:MINUTOS:SEGUNDOS Set "Max_CPU_Activity_Time=00:10:00" :: Delay=El tiempo de espera entre comprobación, En segundos. :: :::::::::::::::::::::::::::::::::::::::::::::::: :Check Tasklist /FI "CPUTIME gt %Max_CPU_Activity_Time%" | Find /I " %PROGRAM%" 1 >NUL Taskkill /F /T /IM " %PROGRAM%" 1 >NUL || Echo Error al intentar cerrar el proceso: %PROGRAM%... Ping -n %DELAY% Localhost 1 >NUL)
También te puedo hacer la comprobación basada en el consumo de RAM: :: By Elektro H@cker :: :: Este code comprueba la memoria que está usando un proceso. Si la memoria usada es inferior a la mínima memoria permitida, Mata el proceso. :: PD: Hay un POSIBLE margen de error de tiempo de 10 segundos debido a que es el lapsus de tiempo (Delay) que tarda en actualizarse TASKLIST internamente. :: :: :: :: CONFIGURACIÓN :: :: Program=El nombre del proceso a comprobar. :: Minimum_Memory_Usage=El mínimo uso de memoria permitido, En kilobytes. Set "Minimum_Memory_Usage=10000" :: Delay=El tiempo de espera entre comprobación, En segundos. :: :::::::::::::::::::::::::::::::::::::::::::::::: :Check Tasklist /FI "MEMUSAGE lt %Minimum_Memory_Usage%" | Find /I "%PROGRAM%" Taskkill /F /T /IM " %PROGRAM%" 1 >NUL || Echo Error al intentar cerrar el proceso: %PROGRAM%... Ping -n %DELAY% Localhost 1 >NUL)
También puedes comprobar todo esto y muchas más cosas que tasklist no permite, Usando " WMIC Process". Salu2.
|
|
« Última modificación: 10 Mayo 2012, 13:27 pm por EleKtro H@cker »
|
En línea
|
|
|
|
matarcola2
Desconectado
Mensajes: 14
|
Muchas gracias Electro H@cker, hoy por la tarde tan pronto termine el curro lo probaré, eres un genio.
|
|
|
En línea
|
|
|
|
matarcola2
Desconectado
Mensajes: 14
|
Hola, lo siento pero no consigo que funcione...
Gracias de todas maneras.
Saludos:-)
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.821
|
Hola, lo siento pero no consigo que funcione...
Gracias de todas maneras.
Saludos:-)
Ni siquiera te sirve el code que te puse del consumo de MB? Salu2
|
|
|
En línea
|
|
|
|
matarcola2
Desconectado
Mensajes: 14
|
Hola de nuevo.
Pues no, no me funciona ninguno de los dos, es como si no fuese capaz de ver la aplicacion que quiero monitorear, incluso he probado con mayusculas, minusculas, el primer caracter en mayuscula, etc....
Gracias de todas maneras.
|
|
|
En línea
|
|
|
|
|
|