I implemented a web page (ASP .NET, VB) to start/stop a Windows service.
I used impersonification, as described here: http://support.microsoft.com/kb/306158
Everything it's ok when the page reads the service's status:
_domain = Me.TextBoxDomain.Text
_user = Me.TextBoxUserName.Text
_password = Me.TextBoxPassword.Text
_s = New ServiceController(Constant.ServiceName)
If impersonateValidUser(_user, _domain, _password) Then
Me.LabelServerStatusValue.Text = _s.Status.ToString
undoImpersonation()
Else
'Error
End If
The problem occurs when the page tries to start (or stop) the service:
_domain = Me.TextBoxDomain.Text
_user = Me.TextBoxUserName.Text
_password = Me.TextBoxPassword.Text
_s = New ServiceController(Constant.ServiceName)
If impersonateValidUser(_user, _domain, _password) Then
If _s.Status = ServiceControllerStatus.Stopped And _s.Status <> ServiceControllerStatus.StartPending Then
_s.Start()
_s.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(5))
End If
undoImpersonation()
Else
'Error
End If
Comments:
- Exception is "Access denied", but the impersonated user is the same, both for the status and the start/stop
- The user is the same user I logged in the PC. And I can start/stop user from the Service console
Any idea?
I added the identity element in the web.config and it works, but I don't want the whole application impersonates the Administrator user (it was just a test):
<identity impersonate="true" userName="domain\user" password="password"/>
Solution proposed here http://support.microsoft.com/kb/306158 said
It didn't work for me.
I replaced LOGON_32_LOGON_INTERACTIVE with LOGON32_LOGON_SERVICE:
And it works for me: the ASP .NET page can start/stop the service.
In my case, both LOGON32_LOGON_INTERACTIVE and LOGON32_LOGON_SERVICE don't work.
However, LOGON32_LOGON_NETWORK works for me. Note that the user has admin privilege therefore is able to start/stop the windows service.