// Configure the process to break away from the job
var objStartup = objWMIService.Get("Win32_ProcessStartup");
var objConfig = objStartup.SpawnInstance_();
objConfig.ShowWindow = SW_HIDE;
objConfig.CreateFlags = CREATE_BREAKAWAY_FROM_JOB;
// Create the process
var objProcess = objWMIService.Get("Win32_Process");
var intProcessID;
var intReturn = objProcess.Create(strCommand, null, objConfig, intProcessID);
}
function RestartService() {
var RestartAttempts = 3;
var TimeOut = 60 * 1000;
// Stop Service
for (var i = 0; i < RestartAttempts; i++) {
try {
if (GetServiceState() != "Stopped") {
if (Debug) WScript.echo("Stopping Service");
oShell.Run("sc stop HealthService");
WScript.Sleep(TimeOut);
}
else {
break;
}
}
catch (e) {
if (e != 0) {
var errorMessage = ENU_MESSAGE_BASE + "Error: " + e;
if (Debug) WScript.echo(errorMessage);
oAPI.LogScriptEvent(SCRIPT_NAME, eventIdWarning, EVENTLOG_WARNING_TYPE, errorMessage);
}
}
}
// Terminate in case service failed to stop
if (GetServiceState() != "Stopped") {
for (var i = 0; i < RestartAttempts; i++) {
try {
if (Debug) WScript.echo("Terminate Service");
var serviceItems = new Enumerator(objWMIService.ExecQuery(ServiceScript));
var procItems = new Enumerator(objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId = " + serviceItems.item().ProcessId));
var terminated = false;
while (!procItems.atEnd()) {
var successful = 1;
var counter = 0;
while (successful != 0 && counter < RestartAttempts) {
successful = procItems.item().Terminate();
if (successful == 0) {
terminated = true;
break;
}
counter++;
}
procItems.moveNext()
}
if (!terminated) {
throw "Failed to Terminate Health Service";
}
}
catch (e) {
if (e != 0) {
var errorMessage = ENU_MESSAGE_BASE + "Error: " + e;
if (Debug) WScript.echo(errorMessage);
oAPI.LogScriptEvent(SCRIPT_NAME, eventIdWarning, EVENTLOG_WARNING_TYPE, errorMessage);
}
}
}
}
// Start Service
if (GetServiceState() != "Running") {
WScript.Sleep(TimeOut);
for (var i = 0; i < RestartAttempts; i++) {
try {
if (Debug) WScript.echo("Start Service");
oShell.Run("sc start HealthService");
do {
WScript.Sleep(20 * 1000);
}
while (GetServiceState() == "Start Pending");
if (GetServiceState() == "Running") {
break;
}
else {
WScript.Sleep(TimeOut);
}
}
catch (e) {
if (e != 0) {
var errorMessage = ENU_MESSAGE_BASE + "Error: " + e;
if (Debug) WScript.echo(errorMessage);
oAPI.LogScriptEvent(SCRIPT_NAME, eventIdWarning, EVENTLOG_WARNING_TYPE, errorMessage);
}
}
}
if (GetServiceState() == "Running") {
var message = ENU_MESSAGE_BASE + "Service successfully restarted.";
if (Debug) WScript.echo(message);
oAPI.LogScriptEvent(SCRIPT_NAME, eventIdSuccess, EVENTLOG_SUCCESS, message);
}
else {
var errorMessage = ENU_MESSAGE_BASE + "Failed to restart service.";
if (Debug) WScript.echo(errorMessage);
oAPI.LogScriptEvent(SCRIPT_NAME, eventIdError, EVENTLOG_ERROR_TYPE, errorMessage);
}
}
else {
var errorMessage = ENU_MESSAGE_BASE + "Failed to restart service. Failed to stop service.";
if (Debug) WScript.echo(errorMessage);
oAPI.LogScriptEvent(SCRIPT_NAME, eventIdError, EVENTLOG_ERROR_TYPE, errorMessage);
}
}
function GetServiceState() {
var serviceItems = new Enumerator(objWMIService.ExecQuery(ServiceScript));
if (null == serviceItems || null == serviceItems.item()) {
throw "HealthService does not exist!";
}
if (Debug) WScript.echo(serviceItems.item().State);
return serviceItems.item().State;
}