NiCE Library: Restart Health Service

NiCE.Library.W.RestartHealthService.WA (WriteActionModuleType)

WriteAction to restart the Health Service.

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityPublic
RunAsSystem.PrivilegedMonitoringAccount
InputTypeSystem.BaseData
OutputTypeSystem.BaseData

Member Modules:

ID Module Type TypeId RunAs 
WriteEvent WriteAction Microsoft.Windows.ScriptWriteAction Default

Source Code:

<WriteActionModuleType ID="NiCE.Library.W.RestartHealthService.WA" Accessibility="Public" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
<Configuration/>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="WriteEvent" TypeID="Windows!Microsoft.Windows.ScriptWriteAction">
<ScriptName>RestartHealthService.js</ScriptName>
<Arguments/>
<ScriptBody><Script>var oAPI = new ActiveXObject("MOM.ScriptAPI");
var oShell = new ActiveXObject("WScript.Shell");
var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");

var SCRIPT_NAME = "RestartHealthService.js";
var SERVICE_NAME = "HealthService";

var SW_HIDE = 0;
var CREATE_BREAKAWAY_FROM_JOB = 0x1000000;

var ENU_MESSAGE_BASE = "Restarting Health Service. ";

var EVENTLOG_SUCCESS = 0x0000; // Information event
var EVENTLOG_ERROR_TYPE = 0x0001; // Error event
var EVENTLOG_WARNING_TYPE = 0x0002; // Warning event

var eventIdWarning = 6060;
var eventIdError = 6061;
var eventIdSuccess = 6062;

var ServiceScript = "SELECT ProcessId, State FROM Win32_Service WHERE name = 'HealthService'";
var successul = false;

var Debug = true;

function CopyScriptAndRun() {
oShell.Run("%ComSpec% /c copy \"" + WScript.ScriptFullName + "\" %Temp%\\" + SCRIPT_NAME);
var strCommand = oShell.ExpandEnvironmentStrings("%ComSpec% /c cscript.exe //nologo %Temp%\\" + SCRIPT_NAME + " RESTART");
var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");

// 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 &lt; 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 &lt; 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 &amp;&amp; counter &lt; 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 &lt; 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;
}

if (WScript.Arguments.Length &gt; 0) {
RestartService();
}
else {
CopyScriptAndRun();
}</Script></ScriptBody>
<TimeoutSeconds>300</TimeoutSeconds>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="WriteEvent"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.BaseData</OutputType>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>