Veeam Hyper-V VM Integration Services Datasource module

Veeam.Virt.Extensions.HyperV.Module.VM.IntegrationServices.Datasource (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedScript.PropertyBagProvider Default

Overrideable Parameters:

IDParameterTypeSelector
IntervalSecondsint$Config/IntervalSeconds$
SyncTimestring$Config/SyncTime$
TimeoutSecondsint$Config/TimeoutSeconds$

Source Code:

<DataSourceModuleType ID="Veeam.Virt.Extensions.HyperV.Module.VM.IntegrationServices.Datasource" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:int"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SyncTime" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="SyncTime" Selector="$Config/SyncTime$" ParameterType="string"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.PropertyBagProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime>$Config/SyncTime$</SyncTime>
<ScriptName>VMIntegrationServices.js</ScriptName>
<Arguments/>
<ScriptBody><Script>//VMIntegrationServices.js
var SCRIPT_NAME = "VMIntegrationServices.js";
var SEVERITY_ERROR = 1;
var momApi = new ActiveXObject("MOM.ScriptAPI");
var pBag = momApi.CreatePropertyBag();
var EVENT_ID = 3702;
var wbLoc = new ActiveXObject("WbemScripting.SWbemLocator");
var vmname = "";
var vmid = "";
var DataExchange = 0;
var GuestShutdown = 0;
var Heartbeat = 0;
//var RemoteDesktop = 0;
var TimeSync = 0;
var VSS = 0;
var status = "";
var errorstr = "";

Main();

function Main() {
try {
var wmi = wbLoc.ConnectServer(".", "root\\virtualization\\v2");
var results = wmi.ExecQuery("select * from Msvm_ComputerSystem where caption = 'Virtual Machine' and enabledstate = 2");
if (results.Count &gt; 0) {
for (var i = 0; i &lt; results.Count; i++) {
vmid = "";
DataExchange = 0;
GuestShutdown = 0;
Heartbeat = 0;
//RemoteDesktop = 0;
TimeSync = 0;
VSS = 0;
status = "";
errorstr = "";
var item = results.ItemIndex(i);
var colProps = new Enumerator(item.Properties_);
for (; !colProps.atEnd(); colProps.moveNext()) {
var p = colProps.item();
if (p.Name == "Name")
vmid = p.Value;
}
var dataexchangeres = wmi.ExecQuery("select * from Msvm_KvpExchangeComponent where systemname='" + vmid + "'");
if (dataexchangeres.Count == 1) {
var item = dataexchangeres.ItemIndex(0);
var p = item.Properties_.Item("EnabledState");
if (p != null) {
if (p.Value != null) {
if (p.Value == 3) {
DataExchange = 2;
}
else {
var p = item.Properties_.Item("OperationalStatus");
if (p != null) {
if (p.Value != null) {
DataExchange = p.Value(0);
}
}
}
}
}
}
var shutdownres = wmi.ExecQuery("select * from Msvm_ShutdownComponent where systemname='" + vmid + "'");
if (shutdownres.Count == 1) {
var item = shutdownres.ItemIndex(0);
var p = item.Properties_.Item("EnabledState");
if (p != null) {
if (p.Value != null) {
if (p.Value == 3) {
GuestShutdown = 2;
}
else {
var p = item.Properties_.Item("OperationalStatus");
if (p != null) {
if (p.Value != null) {
GuestShutdown = p.Value(0);
}
}
}
}
}
}
var heartbeatres = wmi.ExecQuery("select * from Msvm_HeartbeatComponent where systemname='" + vmid + "'");
if (heartbeatres.Count == 1) {
var item = heartbeatres.ItemIndex(0);
var p = item.Properties_.Item("EnabledState");
if (p != null) {
if (p.Value != null) {
if (p.Value == 3) {
Heartbeat = 2;
}
else {
var p = item.Properties_.Item("OperationalStatus");
if (p != null) {
if (p.Value != null) {
Heartbeat = p.Value(0);
}
}
}
}
}
}
var timesyncres = wmi.ExecQuery("select * from Msvm_TimeSyncComponent where systemname='" + vmid + "'");
if (timesyncres.Count == 1) {
var item = timesyncres.ItemIndex(0);
var p = item.Properties_.Item("EnabledState");
if (p != null) {
if (p.Value != null) {
if (p.Value == 3) {
TimeSync = 2;
}
else {
var p = item.Properties_.Item("OperationalStatus");
if (p != null) {
if (p.Value != null) {
TimeSync = p.Value(0);
}
}
}
}
}
}
var vssres = wmi.ExecQuery("select * from Msvm_VssComponent where systemname='" + vmid + "'");
if (vssres.Count == 1) {
var item = vssres.ItemIndex(0);
var p = item.Properties_.Item("EnabledState");
if (p != null) {
if (p.Value != null) {
if (p.Value == 3) {
VSS = 2;
}
else {
var p = item.Properties_.Item("OperationalStatus");
if (p != null) {
if (p.Value != null) {
VSS = p.Value(0);
}
}
}
}
}
}
if (DataExchange===2&amp;&amp;GuestShutdown===2&amp;&amp;Heartbeat===2&amp;&amp;TimeSync===2&amp;&amp;VSS===2) {
status = "OK";
errorstr = "NONE";
}
else {
status = "ERROR";
errorstr = "The following Hyper-V Integration Service(s) are not running or not responding in the guest OS: ";
if (DataExchange!=2) {
errorstr += "\n Data Exchange Service";
}
if (GuestShutdown!=2) {
errorstr += "\n Guest Shutdown Service";
}
if (Heartbeat!=2) {
errorstr += "\n Heartbeat Service";
}
// if (RemoteDesktop!=2) {
// errorstr += "\n Remote Desktop Service";
// }
if (TimeSync!=2) {
errorstr += "\n Time Synchronization Service";
}
if (VSS!=2) {
errorstr += "\n Volume Shadow Copy Requestor Service";
}
}
pBag = momApi.CreatePropertyBag();
pBag.AddValue("VMID", vmid);
pBag.AddValue("DataExchange", DataExchange);
pBag.AddValue("GuestShutdown", GuestShutdown);
pBag.AddValue("Heartbeat", Heartbeat);
//pBag.AddValue("RemoteDesktop", RemoteDesktop);
pBag.AddValue("TimeSync", TimeSync);
pBag.AddValue("VSS", VSS);
momApi.AddItem(pBag);
pBag = momApi.CreatePropertyBag();
pBag.AddValue("VMID", vmid);
pBag.AddValue("Status", status);
pBag.AddValue("ErrorMessage", errorstr);
momApi.AddItem(pBag);
}
}
else {
var pBag = momApi.CreatePropertyBag();
pBag.AddValue("VMID", "00000000-0000-0000-0000-000000000000");
pBag.AddValue("DataExchange", DataExchange);
pBag.AddValue("GuestShutdown", GuestShutdown);
pBag.AddValue("Heartbeat", Heartbeat);
//pBag.AddValue("RemoteDesktop", RemoteDesktop);
pBag.AddValue("TimeSync", TimeSync);
pBag.AddValue("VSS", VSS);
momApi.AddItem(pBag);
pBag = momApi.CreatePropertyBag();
pBag.AddValue("VMID", "00000000-0000-0000-0000-000000000000");
pBag.AddValue("Status", "OK");
pBag.AddValue("ErrorMessage", "NONE");
momApi.AddItem(pBag);
}
}
catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_ERROR, e.message + " error number: " + e.number);
var pBag = momApi.CreatePropertyBag();
pBag.AddValue("VMID", "00000000-0000-0000-0000-000000000000");
pBag.AddValue("DataExchange", DataExchange);
pBag.AddValue("GuestShutdown", GuestShutdown);
pBag.AddValue("Heartbeat", Heartbeat);
//pBag.AddValue("RemoteDesktop", RemoteDesktop);
pBag.AddValue("TimeSync", TimeSync);
pBag.AddValue("VSS", VSS);
momApi.AddItem(pBag);
//momApi.Return(pBag);
pBag = momApi.CreatePropertyBag();
pBag.AddValue("VMID", "00000000-0000-0000-0000-000000000000");
pBag.AddValue("Status", "OK");
pBag.AddValue("ErrorMessage", "NONE");
momApi.AddItem(pBag);
}
finally {
momApi.ReturnItems();
}
}


</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
</DataSourceModuleType>