none
Ayuda con Script VBS. RRS feed

  • Pregunta

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

    martes, 8 de mayo de 2012 8:27

Todas las respuestas

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

    jueves, 10 de mayo de 2012 6:19