Utilizo una rutina que puede iniciar y detener servicios a través de Delphi pero también necesito poder desactivarlos, ¿es posible?¿Cómo puedo desactivar un servicio a través de Delphi?
Respuesta
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);
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.
También tenga en cuenta que el usuario debe tener los derechos adecuados para cambiar las configuraciones del servicio. –
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;
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. –
sí su derecho, no leí la pregunta completamente, la actualizaré –
Qué lástima, el enlace se rompe ahora –
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.
El proyecto tiene muy buena pinta Neftalí ... Felicitaciones por la iniciativa! – jachguate
Gracias Juan Antonio. La verdad es que aun está en la primera fase, pero tiene muchas posibilidades para ampliar funcionalidades. Un saludo –
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;
Por supuesto, también puedes usar M.FindService. ¡Hace exactamente lo mismo! – ChristianWimmer
Soy un gran admirador de la Biblioteca JEDI, definitivamente la uso. –
- 1. ¿Cómo transferir un java.util.Map a través de un servicio web?
- 2. Delphi advertencias desactivar falla
- 3. ¿Cómo puedo desactivar un UISegmentedControl?
- 4. ¿Cómo publicitar un servicio usando Bonjour a través de subredes?
- 5. Administrar IIS a través del código Delphi
- 6. Crear un servicio de Windows en delphi
- 7. ¿Cómo puedo invocar un servicio RESTful a través de Apache Camel?
- 8. ¿cómo puedo desactivar la salida a log4j.rootLogger?
- 9. ¿Cómo puedo desactivar _moz_resizing?
- 10. ¿Cómo puedo recibir OutputDebugString desde un servicio?
- 11. ¿Cómo agregaría datos nuevos a través de un servicio REST opuesto al servicio de estilo RPC?
- 12. ¿Puedo alojar (autohost) un Servicio WCF en un Servicio de Windows y exponerlo a través de http?
- 13. ¿Cómo puedo desactivar un botón en Xcode?
- 14. Cómo ejecutar IIS Express como un proceso iniciado a través de un servicio de Windows
- 15. ¿Cómo depurar un servicio de Windows con Delphi?
- 16. RESTO servicio WCF a través de SSL
- 17. Desactivar cadenas enormes en Delphi 2010
- 18. ¿Cómo puedo transferir datos entre dos aplicaciones delphi a través de Internet?
- 19. ¿Cómo puedo desactivar keep-alive en las solicitudes de cliente del servicio web ASP.NET?
- 20. ¿Transfiriendo datos binarios a través de un servicio web SOAP?
- 21. ¿Cómo puedo desactivar Java basurero?
- 22. ¿Cómo puedo desactivar los errores de javascript en "TWebbrowser"?
- 23. Delphi - ¿Cómo puedo mejorar
- 24. Desactivar el rastreo a través de la aplicación.config
- 25. Consumir el servicio oData de Delphi
- 26. Crear un servicio de Windows para abrir un programa- Delphi
- 27. ¿Cómo puedo enumerar a través de JObject?
- 28. Detener un servicio de Windows que depende de otro servicio a través del archivo por lotes
- 29. ¿Cómo desactivar un enganche a mi proceso?
- 30. ¿Cómo puedo desactivar estilos de CSS heredados?
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. –
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. –
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. –