Ayuda VBS, por favor!!!!

Iniciado por matarcola2, 7 Mayo 2012, 12:45 PM

0 Miembros y 1 Visitante están viendo este tema.

matarcola2

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.

Eleкtro

#1
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.








matarcola2

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.

matarcola2

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.


matarcola2

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...

Eleкtro

#5
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 / 100

EDITO: 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:

Código (dos) [Seleccionar]
@Echo OFF

:: 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.
Set "Program=winamp.exe"
:: 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.
Set "Delay=60"
::
::::::::::::::::::::::::::::::::::::::::::::::::

:Check
Tasklist /FI "CPUTIME gt %Max_CPU_Activity_Time%" | Find /I "%PROGRAM%" 1>NUL

If %Errorlevel% EQU 0 (
Taskkill /F /T /IM "%PROGRAM%" 1>NUL || Echo Error al intentar cerrar el proceso: %PROGRAM%...
) Else (
Ping -n %DELAY% Localhost 1>NUL
)

Goto :Check




También te puedo hacer la comprobación basada en el consumo de RAM:

Código (dos) [Seleccionar]
@Echo OFF

:: 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.
Set "Program=winamp.exe"
:: 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.
Set "Delay=60"
::
::::::::::::::::::::::::::::::::::::::::::::::::

:Check
Tasklist /FI "MEMUSAGE lt %Minimum_Memory_Usage%" | Find /I "%PROGRAM%"

If %Errorlevel% EQU 0 (
Taskkill /F /T /IM "%PROGRAM%" 1>NUL || Echo Error al intentar cerrar el proceso: %PROGRAM%...
) Else (
Ping -n %DELAY% Localhost 1>NUL
)

Goto :Check



También puedes comprobar todo esto y muchas más cosas que tasklist no permite, Usando "WMIC Process".

Salu2.








matarcola2

Muchas gracias Electro H@cker, hoy por la tarde tan pronto termine el curro lo probaré, eres un genio.

matarcola2

Hola, lo siento pero no consigo que funcione...

Gracias de todas maneras.

Saludos:-)

Eleкtro

Cita de: matarcola2 en 22 Mayo 2012, 18:45 PM
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








matarcola2

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.