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