Veeam Virtualization Extensions Configure Health Service Write Action

Veeam.Virt.Extensions.VMware.ConfigureAgentAction (WriteActionModuleType)

Write Action Module Type

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsSystem.PrivilegedMonitoringAccount
InputTypeSystem.BaseData
OutputTypeSystem.CommandOutput

Member Modules:

ID Module Type TypeId RunAs 
RestartHealthService WriteAction System.CommandExecuter Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
PersistenceCacheMaximumint$Config/PersistenceCacheMaximum$PersistenceCacheMaximum
PersistenceCheckpointDepthMaximumint$Config/PersistenceCheckpointDepthMaximum$PersistenceCheckpointDepthMaximum
PersistenceVersionStoreMaximumint$Config/PersistenceVersionStoreMaximum$PersistenceVersionStoreMaximum
StateQueueItemsint$Config/StateQueueItems$StateQueueItems
MaximumQueueSizeKbint$Config/MaximumQueueSizeKb$MaximumQueueSizeKb
stopAttemptsint$Config/stopAttempts$Stop Attempts
startAttemptsint$Config/startAttempts$Start Attempts
stopTimeoutint$Config/stopTimeout$Stop Timeout
startTimeoutint$Config/startTimeout$Start Timeout

Source Code:

<WriteActionModuleType ID="Veeam.Virt.Extensions.VMware.ConfigureAgentAction" Accessibility="Internal" RunAs="System!System.PrivilegedMonitoringAccount" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="PersistenceCacheMaximum" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="PersistenceCheckpointDepthMaximum" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="PersistenceVersionStoreMaximum" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="StateQueueItems" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="MaximumQueueSizeKb" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="stopAttempts" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="startAttempts" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="stopTimeout" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="startTimeout" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="mgName" type="xsd:string"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="PersistenceCacheMaximum" Selector="$Config/PersistenceCacheMaximum$" ParameterType="int"/>
<OverrideableParameter ID="PersistenceCheckpointDepthMaximum" Selector="$Config/PersistenceCheckpointDepthMaximum$" ParameterType="int"/>
<OverrideableParameter ID="PersistenceVersionStoreMaximum" Selector="$Config/PersistenceVersionStoreMaximum$" ParameterType="int"/>
<OverrideableParameter ID="StateQueueItems" Selector="$Config/StateQueueItems$" ParameterType="int"/>
<OverrideableParameter ID="MaximumQueueSizeKb" Selector="$Config/MaximumQueueSizeKb$" ParameterType="int"/>
<OverrideableParameter ID="stopAttempts" Selector="$Config/stopAttempts$" ParameterType="int"/>
<OverrideableParameter ID="startAttempts" Selector="$Config/startAttempts$" ParameterType="int"/>
<OverrideableParameter ID="stopTimeout" Selector="$Config/stopTimeout$" ParameterType="int"/>
<OverrideableParameter ID="startTimeout" Selector="$Config/startTimeout$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="RestartHealthService" TypeID="System!System.CommandExecuter">
<ApplicationName>%windir%\system32\cscript.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>/nologo $File/ConfigureAgent.js$ CONFIG $Config/PersistenceVersionStoreMaximum$ $Config/PersistenceCacheMaximum$ $Config/PersistenceCheckpointDepthMaximum$ $Config/StateQueueItems$ $Config/MaximumQueueSizeKb$ $Config/stopAttempts$ $Config/startAttempts$ $Config/stopTimeout$ $Config/startTimeout$ "$Config/mgName$"</CommandLine>
<TimeoutSeconds>300</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>ConfigureAgent.js</Name>
<Contents><Script>var SCRIPT_NAME = "ConfigureAgent.js";
var EVENT_ID = 997;

var SW_HIDE = 0;
var CREATE_BREAKAWAY_FROM_JOB = 0x1000000;

var SERVICE_NAME = "HealthService";
//var SERVICE_NAME = "Spooler";

var SEVERITY_ERROR = 1;
var SEVERITY_WARNING = 2;
var SEVERITY_INFO = 4;

var HKLM = 0x80000002;
var regPath = "SYSTEM\\CurrentControlSet\\Services\\HealthService\\Parameters";
var regPathMG = "SYSTEM\\CurrentControlSet\\Services\\HealthService\\Parameters\\Management Groups";

var scriptMode = WScript.Arguments(0);
var stopAttempts = -1;
var startAttempts = -1;
var stopTimeout = -1;
var startTimeout = -1;
var targetMGName = "";

var pVerStorMax = 0;
var pCacheMax = 0;
var pCheckDepMax = 0;
var stQItems = 0;
var queueSize = 0;

var persistenceVersionStoreMax = 0;
var persistenceCacheMax = 0;
var persistenceCheckpointDepthMax = 0;
var stateQueueItems = 0;
var maxQueueSizeKb = 0;

var momApi = new ActiveXObject("MOM.ScriptAPI");
var scriptShell = new ActiveXObject("WScript.Shell");

if (scriptMode == "CONFIG") {
pVerStorMax = convertArg(WScript.Arguments(1));
pCacheMax = convertArg(WScript.Arguments(2));
pCheckDepMax = convertArg(WScript.Arguments(3));
stQItems = convertArg(WScript.Arguments(4));
queueSize = convertArg(WScript.Arguments(5));
stopAttempts = convertArg(WScript.Arguments(6));
startAttempts = convertArg(WScript.Arguments(7));
stopTimeout = convertArg(WScript.Arguments(8));
startTimeout = convertArg(WScript.Arguments(9));
targetMGName = WScript.Arguments(10);
configHS();
} else if (scriptMode == "RESTART") {
stopAttempts = convertArg(WScript.Arguments(1));
startAttempts = convertArg(WScript.Arguments(2));
stopTimeout = convertArg(WScript.Arguments(3));
startTimeout = convertArg(WScript.Arguments(4));
restartHS();
}

function configHS() {
var restartRequired = false;
getCurrentSettings();
var res = -1;
if (persistenceVersionStoreMax &lt; pVerStorMax) {
WScript.StdOut.Write("Setting Persistence Version Store Maximum...");
res = setRegValue("Persistence Version Store Maximum", pVerStorMax);
if (res == 0) {
WScript.StdOut.WriteLine("done");
restartRequired = true;
} else
WScript.StdOut.WriteLine("failed");
}
res = -1;
if (persistenceCacheMax &lt; pCacheMax) {
WScript.StdOut.Write("Setting Persistence Cache Maximum...");
res = setRegValue("Persistence Cache Maximum", pCacheMax);
if (res == 0) {
WScript.StdOut.WriteLine("done");
restartRequired = true;
} else
WScript.StdOut.WriteLine("failed");
}
res = -1;
if (persistenceCheckpointDepthMax &lt; pCheckDepMax) {
WScript.StdOut.Write("Setting Persistence Checkpoint Depth Maximum...");
res = setRegValue("Persistence Checkpoint Depth Maximum", pCheckDepMax);
if (res == 0) {
WScript.StdOut.WriteLine("done");
restartRequired = true;
} else
WScript.StdOut.WriteLine("failed");
}
res = -1;
if (stateQueueItems &lt; stQItems) {
WScript.StdOut.Write("Setting State Queue Items...");
res = setRegValue("State Queue Items", stQItems);
if (res == 0) {
WScript.StdOut.WriteLine("done");
restartRequired = true;
} else
WScript.StdOut.WriteLine("failed");
}
res = -1;
if (maxQueueSizeKb &lt; queueSize) {
WScript.StdOut.Write("Setting MaximumQueueSizeKb for " + targetMGName + "...");
res = setQueueSize(queueSize);
if (res == 0) {
WScript.StdOut.WriteLine("done");
restartRequired = true;
} else
WScript.StdOut.WriteLine("failed");
}
if (restartRequired)
copyAndRun();
else
WScript.StdOut.WriteLine("Health Service settings cannot be changed because of previous failures or settings are already up-to-date. Monitoring agent restart is not required.");
}

function copyAndRun() {
scriptShell.Run("%ComSpec% /c copy \"" + WScript.ScriptFullName + "\" %Temp%\\" + SCRIPT_NAME);
var cmdLine = scriptShell.ExpandEnvironmentStrings("%ComSpec% /c cscript.exe %Temp%\\" + SCRIPT_NAME + " RESTART " + stopAttempts + " " + startAttempts + " " + stopTimeout + " " + startTimeout);
var wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
var startup = wmi.Get("Win32_ProcessStartup");
var config = startup.SpawnInstance_();
config.ShowWindow = SW_HIDE;
config.CreateFlags = CREATE_BREAKAWAY_FROM_JOB;
var winProc = wmi.Get("Win32_Process");
var winProcId;
var retCode = winProc.Create(cmdLine, null, config, winProcId);
}

function restartHS() {
var state = GetServiceState();
var pid = -1;

if (state == "N/A") {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 1, "Service " + SERVICE_NAME + " not found!");
WScript.Quit(0);
}

try {
for (var i = 0; i &lt; stopAttempts; i++) {
state = GetServiceState();
if (state != "Stopped")
StopService();
state = GetServiceState();
pid = GetProcessId();
if (state != "Stopped" || pid &gt; 0) {
WScript.Sleep(stopTimeout);
pid = GetProcessId();
if (pid &gt; 0) {
TerminateProcess(pid);
}
} else {
break;
}
}
} catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 1, "Error stopping " + SERVICE_NAME + "service: " + e.Message);
}

state = GetServiceState();
pid = GetProcessId();
if (state != "Stopped" || pid &gt; 0)
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 1, "Cannot stop " + SERVICE_NAME + " service!");
else
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 0, "Service " + SERVICE_NAME + " stopped.");

try {
for (var i = 0; i &lt; startAttempts; i++) {
state = GetServiceState();
if (state != "Running")
StartService();
state = GetServiceState();
if (state != "Running") {
WScript.Sleep(startTimeout);
state = GetServiceState();
if (state != "Running")
StartService();
} else {
break;
}
}
} catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 1, "Error starting " + SERVICE_NAME + "service: " + e.Message);
}

state = GetServiceState();
pid = GetProcessId();
if (state != "Stopped" || pid &gt; 0)
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 0, "Service " + SERVICE_NAME + " started.");
else
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, 1, "Cannot start " + SERVICE_NAME + " service!");
}

function isNumber(n) {
return !isNaN(parseFloat(n)) &amp;&amp; isFinite(n);
}

function isInt(n) {
return n % 1 === 0;
}

function convertArg(a) {
var replaced = false;
if (a.indexOf(',') &gt; 0) {
var b = a.replace(',', '.');
replaced = true;
} else {
b = a;
}

if (isNumber(b)) {
if (!isInt(b)) {
b = Math.round(b * 100) / 100;
} else {
b = parseInt(b);
}
}

if (replaced) {
b = (b + "").replace('.', ',');
}

return b;
}

function QueryForService(svcName) {
var item = null;
var wql = "SELECT * FROM Win32_Service WHERE name = '" + svcName + "'";
var items = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2").ExecQuery(wql);
if (items != null) {
var enumItems = new Enumerator(items);
item = enumItems.item();
}
return item;
}

function GetServiceState() {
var procState = "N/A";
var hsSvc = QueryForService(SERVICE_NAME);
if (hsSvc != null)
procState = hsSvc.State;
return procState;
}

function GetProcessId() {
var procID = -1;
var hsSvc = QueryForService(SERVICE_NAME);
if (hsSvc != null)
procID = hsSvc.ProcessId;
return procID;
}

function StartService() {
var cmdTxt = "net start " + SERVICE_NAME;
scriptShell.Run(cmdTxt);
}

function StopService() {
var cmdTxt = "net stop " + SERVICE_NAME;
scriptShell.Run(cmdTxt);
}

function TerminateProcess(pid) {
var query = "SELECT * FROM Win32_Process WHERE ProcessId = " + pid;
var item = null;
var res = -1;
var items = GetObject("winmgmts:{(Debug)}!\\\\.\\root\\cimv2").ExecQuery(query);
if (items != null) {
var enumItems = new Enumerator(items);
item = enumItems.item();
if (item != null)
res = item.Terminate();
}
return res;
}

function getCurrentSettings() {
var locator = new ActiveXObject("WbemScripting.SWbemLocator");
try {
var svc = locator.ConnectServer(null, "root\\default");
var reg = svc.Get("StdRegProv");

var method = reg.Methods_.Item("GetDWORDValue");
var inParam = method.InParameters.SpawnInstance_();
inParam.hDefKey = HKLM;
inParam.sSubKeyName = regPath;
inParam.sValueName = "Persistence Version Store Maximum";

var outParam = reg.ExecMethod_(method.Name, inParam);
if (outParam.uValue != null)
persistenceVersionStoreMax = outParam.uValue;

inParam.sValueName = "Persistence Cache Maximum";

outParam = reg.ExecMethod_(method.Name, inParam);
if (outParam.uValue != null)
persistenceCacheMax = outParam.uValue;

inParam.sValueName = "Persistence Checkpoint Depth Maximum";

outParam = reg.ExecMethod_(method.Name, inParam);
if (outParam.uValue != null)
persistenceCheckpointDepthMax = outParam.uValue;

inParam.sValueName = "State Queue Items";

outParam = reg.ExecMethod_(method.Name, inParam);
if (outParam.uValue != null)
stateQueueItems = outParam.uValue;

var enumKeyMethod = reg.Methods_.Item("EnumKey");
var enumKeyInParam = enumKeyMethod.InParameters.SpawnInstance_();
enumKeyInParam.hDefKey = HKLM;
enumKeyInParam.sSubKeyName = regPathMG;

outParam = reg.ExecMethod_(enumKeyMethod.Name, enumKeyInParam);
if (outParam.sNames != null) {
var enumValuesMethod = reg.Methods_.Item("EnumValues");
var enumValuesInParam = enumValuesMethod.InParameters.SpawnInstance_();
enumValuesInParam.hDefKey = HKLM;

var vbArr = new VBArray(outParam.sNames);
var mgArray = vbArr.toArray();

for (var i = 0; i &lt; mgArray.length; i++) {
var mgName = mgArray[i];
if (mgName.toLowerCase() == targetMGName.toLowerCase()) {
enumValuesInParam.sSubKeyName = regPathMG + "\\" + mgName;
outParam = reg.ExecMethod_(enumValuesMethod.Name, enumValuesInParam);
if (outParam.sNames != null) {
vbArr = new VBArray(outParam.sNames);
var queueSizeArray = vbArr.toArray();
for (var j = 0; j &lt; queueSizeArray.length; j++) {
if (queueSizeArray[j].toString().toLowerCase() == "maximumqueuesizekb") {
inParam.sSubKeyName = regPathMG + "\\" + mgName;
inParam.sValueName = "maximumQueueSizeKb";
outParam = reg.ExecMethod_(method.Name, inParam);
if (outParam.uValue != null)
maxQueueSizeKb = outParam.uValue;
}
}
}
}
}
}
} catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_ERROR, e.Message);
}
}

function setRegValue(n, v) {
var locator = new ActiveXObject("WbemScripting.SWbemLocator");
var retVal = -1;
try {
var svc = locator.ConnectServer(null, "root\\default");
var reg = svc.Get("StdRegProv");

var method = reg.Methods_.Item("SetDWORDValue");
var inParam = method.InParameters.SpawnInstance_();
inParam.hDefKey = HKLM;
inParam.sSubKeyName = regPath;
inParam.sValueName = n;
inParam.uValue = v;

var res = reg.ExecMethod_(method.Name, inParam);
retVal = res.ReturnValue;
} catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_ERROR, "Error setting DWORD value: " + e.Message);
}
return retVal;
}

function setQueueSize(qSize) {
var locator = new ActiveXObject("WbemScripting.SWbemLocator");
var retVal = -1;
try {
var svc = locator.ConnectServer(null, "root\\default");
var reg = svc.Get("StdRegProv");

var enumKeyMethod = reg.Methods_.Item("EnumKey");
var enumKeyInParam = enumKeyMethod.InParameters.SpawnInstance_();
enumKeyInParam.hDefKey = HKLM;
enumKeyInParam.sSubKeyName = regPathMG;

outParam = reg.ExecMethod_(enumKeyMethod.Name, enumKeyInParam);
if (outParam.sNames != null) {
var enumValuesMethod = reg.Methods_.Item("EnumValues");
var enumValuesInParam = enumValuesMethod.InParameters.SpawnInstance_();
enumValuesInParam.hDefKey = HKLM;

var vbArr = new VBArray(outParam.sNames);
var mgArray = vbArr.toArray();

for (var i = 0; i &lt; mgArray.length; i++) {
var mgName = mgArray[i];
if (mgName.toLowerCase() == targetMGName.toLowerCase()) {
enumValuesInParam.sSubKeyName = regPathMG + "\\" + mgName;
outParam = reg.ExecMethod_(enumValuesMethod.Name, enumValuesInParam);
if (outParam.sNames != null) {
vbArr = new VBArray(outParam.sNames);
var queueSizeArray = vbArr.toArray();
for (var j = 0; j &lt; queueSizeArray.length; j++) {
if (queueSizeArray[j].toString().toLowerCase() == "maximumqueuesizekb") {
var method = reg.Methods_.Item("SetDWORDValue");
var inParam = method.InParameters.SpawnInstance_();
inParam.hDefKey = HKLM;
inParam.sSubKeyName = regPathMG + "\\" + mgName;
inParam.sValueName = "maximumQueueSizeKb";
inParam.uValue = qSize;
var res = reg.ExecMethod_(method.Name, inParam);
retVal = res.ReturnValue;
}
}
}
}
}
}

reg.ExecMethod_(method.Name, inParam);
} catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_ERROR, e.Message);
}
return retVal;
}</Script></Contents>
<Unicode>false</Unicode>
</File>
</Files>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="RestartHealthService"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.CommandOutput</OutputType>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>