Detener servicios de windows

Iniciado por The_Saint, 22 Abril 2013, 17:12 PM

0 Miembros y 1 Visitante están viendo este tema.

The_Saint

Buenas el caso es que estoy haciendo un aplicación de consola, para un rotado de Log,pero me falla el parado de los servicios y no entiendo el porque,me pueden orientar.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceProcess;

namespace ServiceProcess
{
    class Program
    {
       
        static void Main(string[] args)
        {
            string nameservice;
            nameservice = "KMService";
            Console.WriteLine("Deteniendo servicio");
            Detener(nameservice);
            Console.WriteLine("Servicio detenido");     
            Console.ReadKey();
           

        }
        static void Detener(string nameservice)
        {
            string serviceName = nameservice;
            ServiceController service = new ServiceController(serviceName);
            int timeoutMilliseconds = 5000;
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
            service.Stop(); //AQUI FALLA
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);
               
           

        }

    }
         
}


Saludos
<< Si piensas que eres demasiado pequeño para tener impacto.
Prueba a irte a la cama con un mosquito>>

Eleкtro

#1
Claro, no puedes iniciar un servicio que ya se encuentra iniciado, ni detener uno que ya está detenido.

De todas formas no dás ningún detalle acerca del error, solo dices que "falla", podrías haber mostrado la excepción porque no somos magos para adivinar lo que ocurre.

Pero deduzco que el problema es ese porque en tu código no compruebas el estado del servicio. solo puede ser eso, o que el servicio no se pueda detener por alguna dependencia.

Usa un convertidor online de VBNET a C# con esta función que hice, y listo:

Código (vbnet) [Seleccionar]
#Region " Change Service Status "

    ' [ Change Service Status Function ]
    '
    ' // By Elektro H@cker
    '
    ' Instructions :
    ' Add a reference for "System.ServiceProcess"
    '
    ' Examples :
    ' MsgBox(Change_Service_Status("Temas", Service.StopIt))
    ' MsgBox(Change_Service_Status("Temas", Service.RunIt, True))

    Public Enum Service
        RunIt = True
        StopIt = False
    End Enum

    Function Change_Service_Status(ByVal ServiceName As String, _
                                   ByVal Run As Service, _
                                   Optional Wait As Boolean = False) As Boolean

        Try
            Dim Service As New System.ServiceProcess.ServiceController(ServiceName)

            Select Case Service.Status
                Case System.ServiceProcess.ServiceControllerStatus.Stopped And Run
                    Service.Start()
                    If Wait Then Service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running)
                Case System.ServiceProcess.ServiceControllerStatus.Running And Not Run
                    Service.Stop()
                    If Wait Then Service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped)
            End Select

            Service.Dispose()
            Return True

        Catch ex As Exception
            ' Throw New Exception(ex.Message)
            Return False
        End Try

    End Function

#End Region



Saludos.








The_Saint

<< Si piensas que eres demasiado pequeño para tener impacto.
Prueba a irte a la cama con un mosquito>>

The_Saint

Bueno para quien le interese,es que la libreria System.ServiceProcess no funciona en 64 bits,lo he probado en 32 bits y funciona perfectamente. No se si es porque es windows 8 o por que el sistema es 64 bits.
¿sabeis como se pueden buscar la libreria similar en 64 bits?
Valdria esta ?http://es.originaldll.com/file/system.serviceprocess.resources.dll/8270.html
Donde se pondria?
En el caso que se llamen igual se puede renombrar añadiendo 64 bits al final?

Saludos.
<< Si piensas que eres demasiado pequeño para tener impacto.
Prueba a irte a la cama con un mosquito>>

Eleкtro

#4
Cita de: Heisenberg_w0rms en 24 Abril 2013, 12:10 PM
Bueno para quien le interese,es que la libreria System.ServiceProcess no funciona en 64 bits,lo he probado en 32 bits y funciona perfectamente. No se si es porque es windows 8 o por que el sistema es 64 bits.

Hola, solo quiero decirte que lo de los 64bits es una tontería, yo uso Windows 7 de 64 bits y como ves te mostré un código funcional.
Lo de que no te funcione porque séa Windows 8 también parece otra tontería, si no fuesen compatible las classes del FW en Windows 8 sería para darle una tremenda hostia a Microsoft, pero eso ya no te lo puedo confirmar.

un saludo!

EDITO: Quizás si pruebas mi aplicación te pueda sacar de dudas si la "System.Serviceprocess" funciona en Win8 de 64 bits o no: http://foro.elhacker.net/net/aporte_aeroswitcher-t389187.0.html;msg1849223#msg1849223