Start/Stop Window Service from ASP.NET page
Last week, I needed to complete one task on which I am going to blog
about in this entry. The task is "Create a control panel like webpage to
control (Start/Stop) Window Services which are part of my solution
installed on computer where the main application is hosted".
Here are the important points to accomplish:
[1] You need to add System.ServiceProcess reference in your application. This namespace holds ServiceController Class to access the window service.
[2] You need to check the status of the window services before you explicitly start or stop it.
[3]
By default, IIS application runs under ASP.NET account which doesn't
have access rights permission to window service. So, Very Important part
of the solution is: Impersonation.
You need to impersonate the application/part of the code with the User
Credentials which is having proper rights and permission to access the
window service.
If you try to access window service it will generate "access denied" error.
The alternatives are: You can either impersonate whole application by adding Identity tag in web.cofig as:
<identity impersonate="true" userName="" password=""/>
This
tag will be under System.Web section. the "userName" and "password"
will be the credentials of the user which is having rights to access the
window service. But, this would not be a wise and good solution;
because you may not impersonate whole website like this just to have
access window service (which is going to be a small part of code).
Second
alternative is: Only impersonate part of code where you need to access
the window service to start or stop it. I opted this one. But, to be
fair; I am really unaware of the code part for impersonation. So, I just
googled it and injected the code in my solution in a separate class
file named as "Impersonate" with required static methods. In Impersonate
class; impersonateValidUser() is the method to impersonate a part of
code and undoImpersonation() is the method to undo the impersonation.
Below is one example:

You
need to provide domain name (which is "." if you are working on your
home computer), username and password of appropriate user to
impersonate.
[4] Here, it is very important to note that: You
need to have to store the Access Credentials (username and password)
which you are going to user for impersonation; to some secured and
encrypted format. I have used Machinekey Encryption to store the value
encrypted value inside database.
[5] So now; The real part is to
start or stop a window service. You are almost done; because
ServiceController class has simple Start() and Stop() methods to start
or stop a window service. A ServiceController class has parametrized
constructor that takes name of the service as parameter.
Code to Start the window service:
Code to Stop the window service:
Isn't that too easy! ServiceController made it easy :) I have attached a working example with this post here
to start/stop "SQLBrowser" service where you need to provide proper
credentials who have permission to access to window service.
hope it would helps./.