Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Start Windows Service programmatically

I am having an issue with an application that I am creating. I am trying to start a windows service through my C# app. When I click my start button, it looks like everything goes through but when I log into the server, the service still does not show that it is running. However, the second time I run it, I get an exception that says the instance of the service is already running. Again when I log into the server, the service appears to be stopped. Has anyone ever seen this?

Here is my code.

try
{
    while (reader.Read())
    {
        int timeoutMilliseconds = 1000;
        string serviceName = reader["ServiceName"].ToString();
        string permission = reader["Permission"].ToString();

        if (permission == "E")
        {
            lblServStartSuccess.Visible = true;

            ServiceController service = new ServiceController(serviceName);
            TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running, timeout);
        }
        else
        {
            lblServErrorStart.Visible = true;
        }
    }
}
catch (Exception ex)
{
    Response.Write(ex.ToString());
}

EDIT: Here is the exception I received on one service:

System.InvalidOperationException: Service Logical Disk Manager Administrative Service was not found on computer '.'. ---> System.ComponentModel.Win32Exception: The specified service does not exist as an installed service --- End of inner exception stack trace

I know the service exists. Do I need to add something in front of the service to tell it what server to look at?

like image 425
Matt Avatar asked Oct 14 '22 13:10

Matt


People also ask

What is C# ServiceBase?

Provides a base class for a service that will exist as part of a service application. ServiceBase must be derived from when creating a new service class.


2 Answers

If the code you showed is executing on a different machine than where the service is supposed to run (I'm not clear from your comments if that's the case or not), you would need to provide the machine name in the ServiceController constructer.

Is it possible you are successfully starting the service, but not on the machine you think? That would fit the symptoms you describe.

ServiceController service = new ServiceController(serviceName, serverName);

Also see ServiceController constructor documentation.

like image 45
hatchet - done with SOverflow Avatar answered Oct 17 '22 01:10

hatchet - done with SOverflow


Here is code I have in a Window Service responsible for stopping starting other services running on the same server.

ServiceController controller = new ServiceController(serviceName);
if (controller.Status==ServiceControllerStatus.Running)
    controller.Stop();

if (controller.Status==ServiceControllerStatus.Stopped)
    controller.Start(); 
like image 21
Gary Kindel Avatar answered Oct 17 '22 02:10

Gary Kindel