Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   EnumServicesStatus y S.O. Windows Server 2003 (https://www.clubdelphi.com/foros/showthread.php?t=25467)

Aldo 23-09-2005 11:40:57

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

jmariano 23-09-2005 12:53:50

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!

Aldo 05-10-2005 18:08:40

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

dec 06-10-2005 00:06:07

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

Aldo 06-10-2005 11:09:06

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

Aldo 06-10-2005 11:22:10

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.


La franja horaria es GMT +2. Ahora son las 07:14:26.

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