Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-06-2008
mcalmanovici mcalmanovici is offline
Miembro
 
Registrado: jun 2006
Posts: 78
Poder: 18
mcalmanovici Va por buen camino
Problema al iniciar servicio con windows.

Hola gente:
antes que nada quiero agradecer por todas sus contestaciones ya que son muy útiles.
Escribo porque estoy teniendo un problema con un servicio que desarrolle en delphi.
El servicio cuando lo corro desde delphi (pongo F9 para ejecutarlo) funciona bien y hace lo que yo quiero.
Ahora bien cuando lo instalo (C:\Mariano\ServicioDelphi\Servicio1.exe /INSTALL) y reinicio la máquina este servicio se pone como "nombre de usuario" SYSTEM (cosa que quiero que pase) en el administrador de sistemas pero no ejecuta nada de lo que programe.
El código es muy simple, lo único que hace es ejecutar el word si se ejecuta primero la calculadora.
Espero que puedan ayudarme porque me estoy volviendo un poco loco con este tema....
Les dejo el código a ver si me pueden dar una mano:
Código Delphi [-]
program Servicio1;
uses
  SvcMgr,
  SysUtils,
  Servicio in 'Servicio.pas' {Service1: TService};

{$R *.RES}
begin
  // Windows 2003 Server requires StartServiceCtrlDispatcher to be
  // called before CoRegisterClassObject, which can be called indirectly
  // by Application.Initialize. TServiceApplication.DelayInitialize allows
  // Application.Initialize to be called from TService.Main (after
  // StartServiceCtrlDispatcher has been called).
  //
  // Delayed initialization of the Application object may affect
  // events which then occur prior to initialization, such as
  // TService.OnCreate. It is only recommended if the ServiceApplication
  // registers a class object with OLE and is intended for use with
  // Windows 2003 Server.
  //
  // Application.DelayInitialize := True;
  //
  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(TService1, Service1);
  Application.Run;
  while True do
  begin
    Service1.MatarProceso;
    sleep(5000);
  end;
end.
 
 
unit Servicio;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ExtCtrls, Psapi, ShellAPI;
type
  TService1 = class(TService)
  private
    { Private declarations }
    procedure KillProcess(hProcess: DWORD);
    function GetProcessByFileName(AFileName: TFileName): DWORD;
  public
    function GetServiceController: TServiceController; override;
    procedure MatarProceso;
    { Public declarations }
  end;
var
  Service1: TService1;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;
procedure TService1.MatarProceso;
var
  hProcessWord: DWORD;
  hProcessCalc: DWORD;
begin
  hProcessWord := GetProcessByFileName('C:\Archivos de programa\Microsoft Office\OFFICE11\WINWORD.exe');//App2
  hProcessCalc := GetProcessByFileName('C:\WINDOWS\system32\calc.exe');//App1
  if ((hProcessWord <> 0) and (hProcessCalc = 0)) then
    KillProcess(hProcessWord);
  if ((hProcessCalc <> 0) and (hProcessWord = 0)) then
    WinExec(PChar('C:\Archivos de programa\Microsoft Office\OFFICE11\WINWORD.EXE'),SW_SHOWNORMAL);
//    ShellExecute(, 'open', 'C:\Archivos de programa\Microsoft Office\OFFICE11\WINWORD.exe', nil, nil, SW_SHOWNORMAL) ;
 
end;
function TService1.GetProcessByFileName(AFileName: TFileName): DWORD;
var
  pidProcess: array [0..1023] of DWORD;
  hProcess: DWORD;
  dwCount: DWORD;
  hMod: HMODULE;
  ModuleFileName: array[0..MAX_PATH] of Char;
  i: Integer;
begin
  Result := 0;
  if EnumProcesses(@pidProcess, SizeOf(pidProcess), dwCount) then
    for i := 0 to dwCount div SizeOf(DWORD) do
    begin
      hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pidProcess[i]);
      if (hProcess <> 0) then
        try
           EnumProcessModules(hProcess, @hMod, SizeOf(hMod), dwCount);
           GetModuleFilenameEx(hProcess, hMod, ModuleFileName, SizeOf(ModuleFileName));
           if SameFileName(ModuleFileName, AFileName) then
           begin
             Result := pidProcess[i];
             break;
           end;
        finally
          CloseHandle(hProcess);
        end;
    end;
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
procedure TService1.KillProcess(hProcess: DWORD);
var
  hProc: DWORD;
begin
  hProc := OpenProcess(PROCESS_TERMINATE, False, hProcess);
  if hProc <> 0 then
    try
      TerminateProcess(hProc, 0);
    finally
      CloseHandle(hProc);
    end;
end;
end.

Muchas gracias.
Mariano.
Responder Con Cita
  #2  
Antiguo 26-06-2008
mcalmanovici mcalmanovici is offline
Miembro
 
Registrado: jun 2006
Posts: 78
Poder: 18
mcalmanovici Va por buen camino
Solución al problema y otra pregunta:
El problema esta que cuando va a crear la aplicación (en este caso word.exe) lo crea como una aplicación del usuario SYSTEM y no lo veo en primer plano.
Alguien tiene alguna idea para poder ejecutarlo con el usuario actual que esta logueado en la máquina???.. O sea ejecutar el servicio cuando ingreso a la pc como hasta ahora (con el usuario SYSTEM) y luego que el word me lo ejecute con el usuario de la pc para poder utilizarlo.


Saludos.
Muchas gracias.
Mariano.
Responder Con Cita
  #3  
Antiguo 27-06-2008
mcalmanovici mcalmanovici is offline
Miembro
 
Registrado: jun 2006
Posts: 78
Poder: 18
mcalmanovici Va por buen camino
Me estoy volviendo loco con este tema.
Tal vez alguno conoce alguna función distinta a shellexecute y winexec para poder abrir una aplicacion con el usuario logueado...
La aplicación como comente antes se abre desde un servicio que tiene como usuario a SYSTEM.
Tambien me interesaría poder obtener del administrador de tareas el nombre de usuario que esta corriendo cada proceso.

Disculpen la insistencia pero no sé como hacerlo.
Muchas gracias.

Mariano.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Detener\Iniciar proceso de windows jocey Varios 3 19-02-2008 03:41:26
Iniciar e instalar servicio desde un boton! JuanErasmo API de Windows 5 25-02-2007 10:57:34
Iniciar un servicio marceloalegre Varios 0 16-05-2005 02:01:13
Iniciar servicio desde linea de comandos Sergio J. Varios 3 23-12-2004 14:48:06
Iniciar tu aplicacion al arancar windows JaMFrY Varios 4 05-01-2004 18:24:43


La franja horaria es GMT +2. Ahora son las 17:44:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi