WiX uninstaller: restart service if present - windows-services

Part of our app involves registering a plug-in to a third-party product. While the third-party service is running, it has our DLL loaded, so the files on disk are locked.
So when we uninstall our product, we need to begin by stopping the third-party service, and then restart it when we're done with the uninstall. (We also do the same stop/restart thing at install time, because if this is an upgrade, then the existing files are again locked.)
WiX has a command that handles the happy path, no problem:
<ServiceControl Id="SomeUniqueId" Name="NameOfTheirService"
Start="both" Stop="both"/>
I.e., stop the service at the beginning of both install and uninstall, and restart it at the end of both install and uninstall. So far so good.
The problem comes if the end-user uninstalls the third-party app first, and then tries to uninstall our app. Our app won't work with the third-party service, but if the user wants to uninstall them both, there's nothing to force them to do it in a particular order. However, if the third-party service is no longer installed, then our uninstaller:
Tries to stop the third-party service, fails because the service no longer exists, decides the failure isn't important, and continues.
Uninstalls our product.
Tries to restart the third-party service, fails because the service no longer exists, decides this failure is important, and brings up an error dialog saying, "Service 'NameOfTheirService' (NameOfTheirService) failed to start. Verify that you have sufficient privileges to start system services." (Retry / Cancel)
If the user clicks Retry, goto 3.
If the user clicks Cancel, roll back, and un-uninstall.
In other words, WiX's error handling is wrong. Stopping a service should be failure-tolerant, and it is. Starting a service after install can be failure-intolerant; that's fine: fail my install if the service won't start. But starting a service after uninstall should be failure-tolerant, and it is not.
How can I restart a service after uninstall, without failing the uninstall if that service no longer exists?

If you add the Wait attribute to the SeviceControl element and set it to no then as well as "Retry" and "Cancel" you'll also get an "Ignore" button that users can click to continue the Install/Uninstall without having started/stopped the service.

Related

Bot is getting stuck at "Download Dependencies" in A360

Automation Anywhere A360 BOT stuck in downloading dependencies, whenever I try to run the bot in dev server.
What I have tried:
Re-installing the Bot Agent with Admin role.
Restarting the Bot Agent Service and preloading the packages.
Stopping the Bot Agent Service and renaming the Global Cache Folder to some other name. Then Again starting the Bot Agent.
Sometimes I see this issue and I have remove the device from within the control room devices list, clear the global cache and then run through the device connection process again.

Permissions for apps started by services running as Local System

We have a legacy service running which is responsible for monitoring another service, but also starts a console application (written in C) which continues running in the background. If we start the console application from the cmd prompt, it works fine. If we also start the service under the Network Service account, it also starts the console app fine, but in that case it cannot start the other service.
So since the service has to monitor (start/stop) another service, it must be started under Local System account to get the necessary privileges - but the problem is that the console application started by this service then cannot read its configuration from the appdata folder.
I can see that the console app gets the APPDATA folder as C:\Windows\System32\config\systemprofile\AppData\Roaming, but the app states that the configuration file inside this folder cannot be found so it closes itself. When I start it from a normal user account, it goes to this users' appdata folder and works properly. I even tried giving the Users group additional permissions for its folder inside the systemprofile\AppData\Roaming folder (which doesn't make sense, since the app is running as Local System), but it didn't help.
What is the best way to make this console app read settings from the Local System appdata folder?
Or, alternatively, is it possible to grant this single service permissions to start other services, without starting it as Local System?
If we start the console application from the cmd prompt, it works fine.
This means that the account you are logged in to has sufficient rights to do everything you need. Specify that account on the service's "Log On" tab and you should be good to go!

Windows Service Install Ends in Rollback

When I try to install a Windows service:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil
I get, what looks to be, some success messages and some failure messages. Part way down:
An exception occurred during the Install phase.
System.ComponentModel.Win32Exception: The specified service has been marked for deletion
At the end:
The Rollback phase completed successfully.
The transacted install has completed.
The installation failed, and the rollback has been performed.
The service is given an entry in the Services applet, but it is marked as "Disabled". When I attempt to change it to another state, I get a "marked for deletion" error message.
There are no messages in the Event Log. There is nothing useful in the log file created by installutil.exe (I believe it's written to the current working directory).
I have no direction to go with this. What do I do?
It turns out that the install might, or probably will, fail if that service is highlighted in the Services applet. It's safest to just close the Services applet, install the service, and then re-open the Services applet. It's really stupid.
Also, make sure to run the console as admin.
I experienced the same and the issue for me was that a service with the same name was already installed. So in order to install the new service I had to uninstall the older services. I am learning how to create and setup windows services and thus the naming conflicting. Tried uninstalling the service first through:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\installutil -u servicename.exe
Once this statement executes successfully, install your service and it should succeed without any rollbacks.
Right Click on Command Prompt and choose RUN AS ADMINISTRATOR
Then copy and paste in: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe C:\TestService\bin\Debug\TestService.exe
Result in TestService.InstallLog is:
Installing service TestService...
Service TestService has been successfully installed.
Some times this happens due to permission issues.
Run the "Developer Command Prompt for VS 2012" as Administrator.
Then it will work.
Adding few more check's and points to solve this above issue.
Build service in release mode and take release folder files and kept in different path
Copy that path and go to visual studio command prompt window and run this bellow sample command to install the service.
Please close services.msc window if its opened , then run C:Program Files (x86)\Microsoft Visual Studio 11.0>InstallUtil.exe C:\RunLocationServices\TestService.exe
Go services.msc and select that service and click on start ,if it changed to "started" then your service running fine.
Still if issue exists then
Another Checkpoint & SOLUTION
When a service starts, the service communicates to the Service Control Manager how long the service must have to start (the time-out period for the service).
If the Service Control Manager does not receive a "service started" notice from the service within this time-out period,
the Service Control Manager terminates the process that hosts the service.
This time-out period is typically less than 30 seconds.
If you do not adjust this time-out period, the Service Control Manager ends the process.
To adjust this time-out period, follow these steps:
1.Go to Start > Run > and type regedit
2.Navigate to: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
With the control folder selected, right click in the pane on the right and select new DWORD Value
3.Name the new DWORD: ServicesPipeTimeout
4.Right-click ServicesPipeTimeout, and then click Modify
Click Decimal, type '180000', and then click OK
5.Restart the computer
Still if issue exists then problem in your service code ,infinate loop may occur due to your methods/classes of service calling. Do code review of each line.
This problem is due to security, you'd better open developer command prompt for VS 2012:
RUN AS ADMINISTRATOR
and install your service. It will surely fix your problem.
I tried and the issue was resolved.

Windows Service installer

I created a Windows service and an installer for it. Now I want to run the windows service under account say na\test.\
I am specifieng it in Projectinstaller.
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.User;
this.serviceProcessInstaller1.Password = "pass123"
this.serviceProcessInstaller1.Username = "na\test";
I am installing the above in so many servers.
All the servers might not have the permissions to na\test.
If it doesn't have permissions the installation is getting stopped.
Is there anyway that I can catch that exception and if the user doesnt have permissions, restart the installation with local user account automatically.
If your installer is created using NSIS install packager you can test for appropriate permissions and act on that during the install process, more here:
http://nsis.sourceforge.net/Docs/Chapter4.html
( look for requestExecutionLevel )
Rather than hard coding the values of the user account, why not test to see if the user has permissions on that machine before trying to install. If they do install using na\test otherwise, install using a local account.

How can I test if I have permissions to install a service and have it run as me on the domain?

I'd like to write a service (that starts up and runs whenever the machine is on) that queries Active directory since the user IIS uses does not have permission to query AD. How do I determine if A) my workstation where I have local admin rights, and B) a shared team workstation will allow me to do this?
Anything you can do as an interactive user can be done by a service with appropriate permissions and configuration, so it isn't so much an issue of determining if you can, but rather configuring the service so that it can.
Your installation package should request an appropriate set of credentials (and of course must be run by a user with privileges to install such a service). The service itself should simply catch and log any permission exceptions.
As an example - look at the SQL Server installation process. Early on it requests that you specify accounts with the required privileges.

Resources