Start/Stop service from an ASP . NET page

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="domainuser" password="password"/>

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Solution proposed here http://support.microsoft.com/kb/306158
said

Dim LOGON32_LOGON_INTERACTIVE As Integer = 2
Dim LOGON32_PROVIDER_DEFAULT As Integer = 0

If LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
    [...]
End if

It didn’t work for me.

I replaced LOGON_32_LOGON_INTERACTIVE with LOGON32_LOGON_SERVICE:

Dim LOGON32_LOGON_INTERACTIVE As Integer = 2
Dim LOGON32_LOGON_NETWORK As Integer = 3
Dim LOGON32_LOGON_BATCH As Integer = 4
Dim LOGON32_LOGON_SERVICE As Integer = 5
Dim LOGON32_LOGON_UNLOCK As Integer = 7
Dim LOGON32_LOGON_NETWORK_CLEARTEXT As Integer = 8
Dim LOGON32_LOGON_NEW_CREDENTIALS As Integer = 9
Dim LOGON32_PROVIDER_DEFAULT As Integer = 0

If LogonUserA(userName, domain, password, LOGON32_LOGON_SERVICE,LOGON32_PROVIDER_DEFAULT, token) <> 0 Then
    [...]
End if

And it works for me: the ASP .NET page can start/stop the service.

Method 2

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.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x