Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: The_Saint en 22 Abril 2013, 17:12 pm



Título: Detener servicios de windows
Publicado por: The_Saint en 22 Abril 2013, 17:12 pm
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.

Código:
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


Título: Re: Detener servicios de windows
Publicado por: Eleкtro en 23 Abril 2013, 01:15 am
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
  1. #Region " Change Service Status "
  2.  
  3.    ' [ Change Service Status Function ]
  4.    '
  5.    ' // By Elektro H@cker
  6.    '
  7.    ' Instructions :
  8.    ' Add a reference for "System.ServiceProcess"
  9.    '
  10.    ' Examples :
  11.    ' MsgBox(Change_Service_Status("Temas", Service.StopIt))
  12.    ' MsgBox(Change_Service_Status("Temas", Service.RunIt, True))
  13.  
  14.    Public Enum Service
  15.        RunIt = True
  16.        StopIt = False
  17.    End Enum
  18.  
  19.    Function Change_Service_Status(ByVal ServiceName As String, _
  20.                                   ByVal Run As Service, _
  21.                                   Optional Wait As Boolean = False) As Boolean
  22.  
  23.        Try
  24.            Dim Service As New System.ServiceProcess.ServiceController(ServiceName)
  25.  
  26.            Select Case Service.Status
  27.                Case System.ServiceProcess.ServiceControllerStatus.Stopped And Run
  28.                    Service.Start()
  29.                    If Wait Then Service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running)
  30.                Case System.ServiceProcess.ServiceControllerStatus.Running And Not Run
  31.                    Service.Stop()
  32.                    If Wait Then Service.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped)
  33.            End Select
  34.  
  35.            Service.Dispose()
  36.            Return True
  37.  
  38.        Catch ex As Exception
  39.            ' Throw New Exception(ex.Message)
  40.            Return False
  41.        End Try
  42.  
  43.    End Function
  44.  
  45. #End Region


Saludos.


Título: Re: Detener servicios de windows
Publicado por: The_Saint en 23 Abril 2013, 14:17 pm
El error que me da es este,http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(EHInvalidOperation);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true (http://,http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(EHInvalidOperation);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5);k(DevLang-csharp)&rd=true), en Visual Basic.Net ya lo hice en su dia pero quería aprender en C#:
(http://img594.imageshack.us/img594/4845/20130423141345consoleap.jpg)

Saludos. ::)


Título: Re: Detener servicios de windows
Publicado por: The_Saint 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.
¿sabeis como se pueden buscar la libreria similar en 64 bits?
Valdria esta ?http://es.originaldll.com/file/system.serviceprocess.resources.dll/8270.html (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.


Título: Re: Detener servicios de windows
Publicado por: Eleкtro en 30 Abril 2013, 13:06 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