Estoy tratando de verificar si el programa svchost se está ejecutando, que en realidad es el servicio de Windows. Si ese servicio no se está ejecutando, vuelva a iniciarlo. Es decir, si el usuario intenta finalizar la tarea desde el administrador de tareas, vuelva a iniciarla.

c#
0
Adeel Yousafzai 15 jun. 2020 a las 13:46

3 respuestas

La mejor respuesta

Actualización de la respuesta anterior:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Management;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            var data = IsServiceActive("unstoppable");
            Console.WriteLine("PID: {0}, Status: {1}", data.Id, data.Status);
            Console.ReadLine();
        }

        private static SrvData IsServiceActive(string srvname)
        {
            string status = "NA";
            int id = -1;

            ServiceController[] srvc = ServiceController.GetServices();
            foreach (var sr in srvc)
            {
                if (sr.ServiceName == srvname)
                {
                    // get status
                    status = sr.Status.ToString();
                    // get id
                    ManagementObject wmiService;
                    wmiService = new ManagementObject("Win32_Service.Name='" + srvname + "'");
                    wmiService.Get();
                    id = Convert.ToInt32(wmiService["ProcessId"]);
                    break;
                }
            }

            SrvData result = new SrvData() { Id = id, Status = status };
            return result;
        }
    }

    public class SrvData
    {
        public string Status { get; set; }
        public int Id { get; set; }
    }
}
0
jonathana 15 jun. 2020 a las 13:40

Puedes hacer así.

ServiceController sc = new ServiceController(ServiceName);
if (sc.Status == ServiceControllerStatus.Running)
{
//do something
}
else
{
    sc.Start();
}

Yo diría que verifique el estado de ServiceControllerStatus.Stopped y luego inicie el servicio.

Y para responder a su otra pregunta cómo obtener PID.

int pid= Process.GetProcessesByName(ServiceName)[0].Id;
0
vivek nuna 15 jun. 2020 a las 11:03

el nombre es diferente en servicios y administrador de tareas

0
Adeel Yousafzai 15 jun. 2020 a las 11:07