Ver Mensaje Individual
  #2  
Antiguo 23-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Reputación: 24
ArdiIIa Va por buen camino
Cita:
Empezado por knife_sj
mi problema es como hago para "saber" cuando se ejecuta algún programa, es decir, cuando yo hago 2ble click sobre algo: como hago para que mi programa se entere de esto y compruebe que dicho software esta permitido ejecutar.
les agradezco desde ya las respuestas
Podrías hacer algún programa/servicio para monitorizar los programas o procesos que están ejecutándose en una máquina determinada, para ello podrías utilizar las antiguar funciones ToolHelp incluidas en el API de windows, pero en este sentido creo que existen procedimientos mejores... te pongo un poco de código de ejemplo:
Código Delphi [-]
//Este procedimiento busca todos los procesos en ejecución y los añade a LISTVIEW
procedure TForm1.Button1Click(Sender: TObject);
Var
  pidProcess: array [0..1023] of DWORD;
  hProcess: DWORD;
  dwCount: DWORD;
  hMod: HMODULE;
  ModuleFileName: array[0..MAX_PATH] of Char;
  i: Integer;
  Item : TListItem;
begin
ListView1.Items.Clear;

  if EnumProcesses(@pidProcess, SizeOf(pidProcess), dwCount) then
    for i := 0 to dwCount div SizeOf(DWORD) do
    begin
    Item := ListView1.Items.Add;
    Item.Caption := IntToStr(pidProcess[i]);
    Item.SubItems.Add(GetExeName( pidProcess[i]) );
    end;
End;
***
Código Delphi [-]
//Esta funcion creo que con su nombre basta...
function GetExeName(ProcessIDWord):string;
var ProcHandle   : THandle;
    szName       : array [0..Max_Path] of char;
    ModHandle    : HModule;
    cb,cbNeeded,
    NumModules   : DWord;
begin
  ProcHandle:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
                          False, ProcessID);
  if ProcHandle<>0 then begin
    try
      cb:=SizeOf(ModHandle);
      if EnumProcessModules(ProcHandle,
                            @ModHandle,
                            cb, cbNeeded) then begin
        NumModules:=cbNeeded div SizeOf(HModule);
        if (NumModules>0) and (GetModuleFileNameEx(ProcHandle,
                                                   ModHandle,
                                                   @szName,
                                                   SizeOf(szName))>0)
                                then
          Result:=szName;
      end;
    finally
      CloseHandle(ProcHandle);
    end;
  end;
end;

Ahora que ya tenemos la lista de programas en ejecución (sin utilizar las Toolhep), tienes varias opciones, por ejemplo:
  • Tener en la máquina cliente una lista de programas permitidos y compararla con la lista de procesos en ejecución, si existen alguna anomalía, matar el proceso en cuestión...
  • Si elaboras un programa cliente / servidor, podrías mandar esta lista de procesos al programa servidor y que sea este el que revise los procesos de una máquina, con otra lista de procesos permitidos, y si es el caso, que avise al operario de turno para patear al intruso...

La Forma de comunicación entre máquinas y el envío de paquetes podrías hacerlo según la idea que hace algunos días me propuso seoane, el hilo está aquí.

Espero que esta información te resulte útil, esto es solamente una propuesta
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO

Última edición por ArdiIIa fecha: 23-02-2007 a las 16:59:22.
Responder Con Cita