How To Start a Service via JavaScript

// This script demonstrates how to start a service from a Deferred Mode in System Context CA.
// Technically, this can be run in immediate mode as well since it requires no access to the installer
// state to execution, but in practice you must run as Deferred in System Context to have enough
// rights to do so.
var serviceName         = "service_internal_name"
var wmiRepository       = null;
var wmiServices         = null;
var resultEnumerator    = null;
var vsilService         = null;
var returnVal           = 0;

wmiRepository = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
wmiServices = wmiRepository.ExecQuery("Select * from Win32_Service Where Name = \"" +serviceName+ "\"");
if (wmiServices != null)
{
    if (wmiServices.Count > 0)
    {
        resultEnumerator = new Enumerator(wmiServices);
        try
        {
            vsilService = resultEnumerator.item();
            if (vsilService.State == "Stopped")
            {
                LogMessage("Starting "+serviceName+"...");
                returnVal = vsilService.StartService();
                if (returnVal == 0)
                {
                    LogMessage("Started service");
                }
                else
                {
                    if (returnVal == 2)
                        LogMessage("Access denied starting service.");
                    else
                        LogMessage("Error "+returnVal+" starting service.")
                    // Abort uninstall since service could not be stopped
                    throw 3;
                }
            }
            else
            {
                LogMessage("Remote execution service not startable, state "+vsilService.State);
            }
        }
        catch (unexpectedException)
        {
            LogMessage("StopService:  Error " +unexpectedException.number+ ":  " +unexpectedException.message);
            // Rethrow to stop uninstall
            throw unexpectedException;
        }
    }
}


function LogMessage( messageString )
// Writes a line to the MSI log, or the console if running outside MSI.
{
    var     customActionName        = "StartService";
   
    if (DetectRunningInMSI())
    {
        var     msiMessageTypeInfo      = 0x04000000
        var     logRecord               = null;
        var     currTime                = new Date();

        logRecord = Installer.CreateRecord(1);
        logRecord.StringData(0) = currTime.toTimeString() +" "+ customActionName +": [1]";
        logRecord.StringData(1) = messageString;
        Session.Message(msiMessageTypeInfo, logRecord);
        logRecord = null;
    }
    else
    {
        var     currTime                = new Date();

        messageString = currTime.toTimeString() +" "+ customActionName +": "+ messageString;
        WScript.Echo(messageString);
    }
}

function DetectRunningInMSI()
// Returns TRUE if running in MSI, else FALSE
{
    var returnVal       = true;
    var stringVal       = "";

    try
    {
        // Try to reference the Session object, which is only provided by the MSI runtime engine
        stringVal = Session.Property("ProductCode");
    }
    catch (thisException)
    {
        // An exception is only thrown if the runtime couldn't resolve Session, which means
        // this script is not running under MSI
        returnVal = false;
    }

    return returnVal;
}
Comments