2010-03-08 21 views

Respuesta

5
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=disabled', nil, SW_HIDE); 
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=auto', nil, SW_HIDE); 
ShellExecute(0, nil, 'cmd.exe', 'sc config "the service name" start=demand', nil, SW_HIDE); 
+12

Esa es la gestión del servicio deficiente. sc.exe está diseñado para ser utilizado por línea de comandos o scripts, y no está disponible en versiones anteriores de Windows. La aplicación debe usar la API de SCM. Y si realmente desea usar SC, no hay necesidad de invocar un shell. Ejecute sc.exe directamente. –

+0

Entiendo que no es una solución ideal, pero funcionó como lo necesitaba para un problema específico. Estoy evaluando la solución OpenService para uso general. –

+1

Considere también que al usar la API de SCM es mucho más fácil obtener errores, si los hay. Usando una herramienta de línea de comando además del código de salida, puede que tenga que interceptar y analizar el resultado, que es más difícil y puede ser específico del idioma. Para una solución rápida y sucia, está bien, pero no la usaría como una solución general. También consulte el JCL, IIRC, hay algunas clases para administrar los servicios. –

18

abrir el servicio con OpenService, y luego desactivarla haciendo pasar Service_Disabled como el parámetro de dwStartType para ChangeServiceConfig. Especifique un puntero nulo o Service_No_Change para el resto de los parámetros, ya que no está interesado en cambiarlos.

+1

También tenga en cuenta que el usuario debe tener los derechos adecuados para cambiar las configuraciones del servicio. –

3

Esto es lo que yo uso

Es sólo un pequeño envoltorio sobre algunos funciones API de Windows que fue muy útil para manejar NT-Servicios. Le permite consultar, iniciar, detener, pausar y activar/desactivar NT-Services en el sistema local o remoto .

http://blog.marcduerst.com/post/How-to-use-TServiceManager-to-manage-Windows-services.aspx

¿Qué le permite escribir 'agradable' código de Delphi;)

procedure DisableService(ServiceName: PChar); 
var SM: TServiceManager; 
begin 
    SM:=TServiceManager.Create; 
    try 
    SM.Connect; 
    SM.OpenServiceConnection(ServiceName); 

    //not working with TServiceManager as is 
    //but its easy to fix, see below   
    SM.DisableService; 


    finally 
    SM.Free; 
    end; 
end; 

la sección DisableService ya no haya sido escrito, pero lo único que se necesita es

procedure TServiceManager.DisableService; 
begin 
    ChangeServiceConfig(ServiceHandle, SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE, nil, nil, nil, nil, nil, nil, nil); 
end; 
+0

El código Delphi sería más agradable si demostrara lo que Eder pidió en lugar de lo que dijo que ya sabe cómo hacer. –

+0

sí su derecho, no leí la pregunta completamente, la actualizaré –

+0

Qué lástima, el enlace se rompe ahora –

7

Además utilizando los métodos anteriores, si necesita más control puede usar WMI.
Con Win32_Service class tener acceso a toda la información de los servicios instalados en la máquina y que puede tiene acceso a métodos: iniciar, detener, pausar, reanudar, Interrogar, crear, borrar, cambiar, ChangeStartMode ...

Aquí (Web/SourceForge) puede encontrar un conjunto de componentes para trabajar con WMI (GLibWMI components Library); Hay uno llamado CServiceInfo que le da toda la información y algunos métodos de esta clase.

Además del paquete están algunas demostraciones; Uno se llama (ServiceControl) e implementa todos los métodos.

alt text http://img341.imageshack.us/img341/8505/imagen336.png

Todo el paquete son de código incluido. Vea el código que puede ser útil para usted.

Atentamente.

+0

El proyecto tiene muy buena pinta Neftalí ... Felicitaciones por la iniciativa! – jachguate

+0

Gracias Juan Antonio. La verdad es que aun está en la primera fase, pero tiene muchas posibilidades para ampliar funcionalidades. Un saludo –

8

Puede usar el archivo JclSvcCtrl.pas de JEDI Components Library (JCL). He escrito un pseudo ejemplo que podría usar. Sin embargo, tenga en cuenta que no lo probé. Pero de esta manera debería funcionar (se omiten las comprobaciones de error):

M := TJclSCManager.Create; 
M.Refresh(true); //Not sure if true is needed or not (refresh all services) 
For i := 0 to M.ServiceCount -1 do 
begin 
    S := M.Services[i]; //TJclNtService 
    if CompareText(S.ServiceName, 'bla') then 
    begin 
    S.Stop; 
    S.StartType := sstDisabled; 
    S.Commit; 
    break; 
    end; 
end; 
+2

Por supuesto, también puedes usar M.FindService. ¡Hace exactamente lo mismo! – ChristianWimmer

+0

Soy un gran admirador de la Biblioteca JEDI, definitivamente la uso. –

Cuestiones relacionadas