Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-09-2005
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 0
Aldo Va por buen camino
EnumServicesStatus y S.O. Windows Server 2003

Hola a todos:

Tengo una aplicación que es enumera todos los servicios instalados en el Sistema Operativo ( S.O. ), me funciona correctamente en todos ( incluido el XP ), pero en el Windows Server 2003 me falla en el llamado a la función EnumServicesStatus. Puede alguien orientarme o ayudarme.

Agradezco de antemano el tiempo que me dedicaís por intentar ayudarme en este problema que tengo.

Un saludo Aldo
Responder Con Cita
  #2  
Antiguo 23-09-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
No se como estarás invocando la función pero te pongo un código que encontré sobre este tema y que, según su autor, funciona en el Windows Server 2003 (es necesario entrar con una cuenta local de administrador):

Código Delphi [-]
function ServiceGetList(sMachine: string; slServicesList: TStrings): Boolean;
type
  TSvcA = array[0..0] of TEnumServiceStatus;
  PSvcA = ^TSvcA;
var
  j: integer;
  schm: SC_Handle;
  nBytesNeeded, nServices, nResumeHandle: Cardinal;
  ssa: PSvcA;
begin
  Result := False;
  
  try
    schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_ENUMERATE_SERVICE);

    if schm <> 0 then
      begin
        nResumeHandle := 0;
        nServices := 0;
        nBytesNeeded := 0;
        ssa := nil;
      
        EnumServicesStatus(schm, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, ssa[0],
          SizeOf(ssa), nBytesNeeded, nServices, nResumeHandle);
          
        GetMem(ssa, nBytesNeeded);
        
        EnumServicesStatus(schm, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, ssa[0],
          nBytesNeeded, nBytesNeeded, nServices, nResumeHandle);
          
        for j := 0 to nServices - 1 do
          begin
            slServicesList.Add(StrPas(ssa[j].lpDisplayName));
            slServicesList.Add(StrPas(ssa[j].lpServiceName));
          end;
          
        Result := True;
        FreeMem(ssa);
        CloseServiceHandle(schm);
      end;
  except
  end;
end;

Saludos!

Última edición por jmariano fecha: 23-09-2005 a las 12:57:50.
Responder Con Cita
  #3  
Antiguo 05-10-2005
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 0
Aldo Va por buen camino
Muchas gracias por tu dedicación, pero mucho me temo que no me ha valido. La verdad es que con algunas pequeñas diferencias, tu código se parece mucho al que tengo yo, pero sigo presentando el problema.
De hecho el llamado a esa función está en una aplicación desarrollada por mi empresa que es un Programador de tareas ( parecido al GBackSchd.exe ), pero con la diferencia que se pueden hacer tareas de distinta índole, más allá que hacer backups y restores de bases de datos.
Un tipo de tarea que se puede programar desde el programador de tareas es ejecutar otras aplicaciones y para que fucione correctamente, tiene en su configuración interna guardados el Usuario Administrador y su password, para que la aplicación invocada desde el programador de tareas se ejecute con los privilegios del Administrador.
Otra de las tareas es detener e iniciar servicios y es aquí concretamente donde presento problemas, porque cuando se va a obtener la lista de servicios instalados en el ordenador, falla el llamado a EnumServicesStatus.

Te agradezco tu colaboración, estoy investigando más.
Un saludo aldo
Responder Con Cita
  #4  
Antiguo 06-10-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¿Echaste un vistazo a la descripción de la función en la página Web MSDN de Microsoft? Es de suponer que sí. En todo caso, lo que creo que ayudaría sería conocer el error que obtienes, porque dices que falla la llamada a la función, pero, no especificas qué error se produce. En fin, por ver si puede servir de algo, más que nada. Además se plantean en la página antes mencionada las funciones "EnumServicesStatusEx", "EnumServicesStatusW" y "EnumServicesStatusA"... ¿tal vez pudiera alguna de estas resolver el problema? Igual ya comprobaste que no...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 06-10-2005
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 0
Aldo Va por buen camino
Muchas gracias por tu tiempo. Pongo en este mensaje el código de mi función y explico donde falla y que error me dá.

Código Delphi [-]
 function ObtenerInfoServicios(Equipo : string; Tipos : TServiceTypes;
   IncluirInactivos : boolean; Lista : TObjectList):boolean;
 var
   hSCManager : SC_HANDLE;
   dwServiceType, dwServiceState: DWORD;
   pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD;
   Buffer : PArrayTEnumServiceStatus;
   i : integer;
   InfS : TInfoServicio;
 begin
   Lista.Clear;
   Result := False;
   // Abrimos service manager
   hSCManager := OpenSCManager(PChar(Equipo), nil, SC_MANAGER_ENUMERATE_SERVICE);
   if (hSCManager=0) then begin
     ChequeaError();
     Exit;
   end;
 
   lpResumeHandle := 0;
   New(Buffer);
   try
     dwServiceType:=SERVICE_WIN32;
     dwServiceState:=SERVICE_STATE_ALL;
 
     Result:=EnumServicesStatus( hSCManager, dwServiceType, dwServiceState, Buffer^[0],
       SizeOf(Buffer^), pcbBytesNeeded, lpServicesReturned, lpResumeHandle );
 
     // assume that our initial array was large enough to hold all
     // entries. add code to enumerate if necessary.
 
     // Procesar los servicios devueltos
     for i := 0 to lpServicesReturned-1 do begin
       InfS:=TInfoServicio.Create;
       InfS.ServiceName:=Buffer^.lpServiceName;
       InfS.DisplayName:=Buffer^[i].lpDisplayName;
       InfS.ServiceStatus:=Buffer^[i].ServiceStatus;
       Lista.Add(InfS);
     end;
 
   finally
     Result := true;
     Dispose(Buffer);
     CloseServiceHandle(hSCManager);
   end;
 end;
[i]
Falla en el llamado a EnumServicesStatus. El Código de error que dá es el 1783 y el mensaje de dicho error es El fragmento ha recibido datos incorrectos

Lo curioso es que en el resto de los S.O. no falla y funciona correctamente.

No sé si me puedes ayudar con esta información. Un Saludo Aldo

Última edición por dec fecha: 06-10-2005 a las 13:19:23. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #6  
Antiguo 06-10-2005
Aldo Aldo is offline
Miembro
 
Registrado: ene 2004
Posts: 46
Poder: 0
Aldo Va por buen camino
Perdona. Ya he visto que hay algunos cambios en la función y he hecho lo mismo que me habéis mandado en la primera respuesta y ya está todo solucionado.

Gracias.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 16:29:30.


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