![]() |
|
![]() |
The "ServiceControl" Command |
This command is used to stop, start or delete services during install
and uninstall.
It populates the MSI "ServiceControl" table.
The service being controlled is commonly installed by the same package using the "ServiceInstall" command but it could just as easily be a pre-existing service.
You should also have a look at the "service tips" section of this manual.
Main Service Related Options |
Please see the "options for commands" section of the manual.
#define? DEFAULT_SERVICE_CONTROL_INSTALL_EVENTS STOP START #define? DEFAULT_SERVICE_CONTROL_UNINSTALL_EVENTS STOP DELETE #define? DEFAULT_SERVICE_INSTALL_PROCESS OWN #define? DEFAULT_SERVICE_INSTALL_START AUTO #define? DEFAULT_SERVICE_INSTALL_ERRORS NORMAL VITAL
The Parameters |
This command takes these parameters:
If you created the service with the "ServiceInstall" command then use the same value you used for its "name".
If its a pre-existing service then you can get its name out of the registry, or with the "Services Applet" (use the "service name" and not the "display name").
The default for this parameter can be set via the DEFAULT_SERVICE_CONTROL_INSTALL_EVENTS macro. The initial value is "STOP START". This value is only used if the "AtInstall" parameter is not specified.
The default for this parameter can be set via the DEFAULT_SERVICE_CONTROL_UNINSTALL_EVENTS macro. The initial value is "STOP DELETE". This value is only used if the "AtUnInstall" parameter is not specified.
I recommend waiting unless you know of a reson why you can't, that is wait whereever possible.
The WAIT Parameter |
You should wait unless you know of a reason why you can't, you could if required create multiple control entries so that you only don't wait when you absolutely can't. Whatever your options it is a good idea to test this well to confirm it reacts as you'd expect.
If you have a service which relies on hardware and you want this to install whether or not the hardware is attached at MSI install time then you should not wait for the service to start.
If you are simply controlling a service (stopping and starting) where it always exists (perhaps your MSI validates as separate step) then you should wait otherwise you may be performing an action thinking that the service is stopped but it isn't (its "stopping"). I have also seen Windows Installer fail to start a service, probably because it was still stopping while it tried to start it again.
If you are not waiting and during uninstall have "stop" and "delete" then you may or may not see the service listed after uninstall in a "disabled" state, this will disappear after a reboot, however a subsequent reinstall sometimes fails (prior to this reboot).
EXAMPLE - Isolated |
<$ServiceControl Name="SomeService" AtInstall="start" AtUninstall="">
In the above "AtUninstall" was given a blank value, if you had not specified it then the default would have been used which may be undesirable.
EXAMPLE - Service Installation |
;---------------------------------------------------------------------------- ;--- Some service constants ------------------------------------------------- ;---------------------------------------------------------------------------- #define MyServiceAlias MyService #define MyServiceDesc My Test Service (<$MSI_MSIBASENAME>) #define RecoveryResetInSeconds <?=6*60*60> ;;6 hours #( '/' #define RecoveryActions restart/5000 ;;1. Restart after 5 seconds restart/60000 ;;2. Restart after 1 minute restart/600000 ;;3+. Restart after 10 minutes #) ;---------------------------------------------------------------------------- ;--- Add service ------------------------------------------------------------ ;---------------------------------------------------------------------------- <$DirectoryTree Key="INSTALLDIR" Dir="[ProgramFilesFolder]\MyServiceDirectory" CHANGE="\"> <$Component "<$MyServiceAlias>" Create="Y" Directory_="INSTALLDIR"> ;--- The service EXE MUST be the keypath of the component ---------------- <$Files ".\MyService.EXE" KeyFile="*"> ;--- Create the service (service EXE is "KeyPath" of component) ---------- #( <$ServiceInstall Name="<$MyServiceAlias>" DisplayName="<$MyServiceDesc>" Description="<$MyServiceDesc>" Process="Own Interactive" > #) ;--- Control the service ------------------------------------------------- <$ServiceControl Name="<$MyServiceAlias>" AtInstall="start stop" AtUninstall="stop delete"> <$/Component> ;---------------------------------------------------------------------------- ;--- Need sc.exe available at install time (the CA below uses it) ----------- ;---------------------------------------------------------------------------- <$Component "ServiceTool" Create="Y" Directory_="INSTALLDIR"> <$Files ".\sc.exe" Comment=^This tool is used to set the services recovery options.^> <$/Component> ;---------------------------------------------------------------------------- ;--- Create script to execute "sc.exe" to set recovery options -------------- ;---------------------------------------------------------------------------- #data "CaData" "INSTALLDIR" '[INSTALLDIR]' #data <$VbsCa Binary="SetServiceRecovery.vbs" DATA=^CaData^> ;--- INSTALL ------------------------------------------------------------- <$VbsCaEntry "JustBeforeStartServices"> ;--- Call generic set recovery routine ------------------------------ SetRecovery "<$MyServiceAlias>", <$RecoveryResetInSeconds>, "<$RecoveryActions>" <$/VbsCaEntry> <?NewLine><?NewLine> '========================================= sub SetRecovery(ByVal ServiceAlias, ByVal RecoveryResetInSeconds, ByVal RecoveryActions) '========================================= ;--- Initialization -------------------------------------------------- CaDebug 1, "Set service recovery for """ & ServiceAlias & """" VbsCaLogInc 1 dim ScExe : ScExe = VbsCaCadGet("INSTALLDIR") & "sc.exe" dim ScArgs : ScArgs = "failure """ & ServiceAlias & """ reset= " & RecoveryResetInSeconds & " actions= " & RecoveryActions dim ScArgsQ : ScArgsQ = "qfailure """ & ServiceAlias & """" ;--- Set the recovery information ------------------------------------ CaDebug 2, "Setting up the services recovery options" VbsCaRunSync """" & ScExe & """ " & ScArgs, 0, "" ;;Ignore RC (can't be trusted) ;--- Log the current state of the recovery options ------------------- CaDebug 2, "Logging the services recovery options" VbsCaRunSync """" & ScExe & """ " & ScArgsQ, 0, "" ;--- Finished this service ------------------------------------------- VbsCaLogInc -1 end sub <$/VbsCa> ;---------------------------------------------------------------------------- ;--- Call the above script during install and uninstall (schedule them) ----- ;---------------------------------------------------------------------------- <$VbsCaSetup Binary="SetServiceRecovery.vbs" Entry="JustBeforeStartServices" Seq="InstallServices-" CONDITION=^<$CONDITION_INSTALL_ONLY>^ DATA=^CaData^>
![]() ![]() |
| ![]() ![]() |