Windows Server 2016 and 1709+ cluster resource groups discovery probe

Microsoft.Windows.10.0.Cluster.ResourceGroups.Discovery.ScriptProbe (ProbeActionModuleType)

Discovers properties specific to a Windows Server 2016 and 1709+ Cluster Resource Group.

Element properties:

TypeProbeActionModuleType
IsolationAny
AccessibilityPublic
RunAsMicrosoft.Windows.Cluster.PrivilegedAccount
InputTypeSystem.BaseData
OutputTypeSystem.Discovery.Data

Member Modules:

ID Module Type TypeId RunAs 
Script ProbeAction Microsoft.Windows.Cluster.CommandExecuterProbeDiscoveryBase Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
Timeoutint$Config/Timeout$Timeout(sec)

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.10.0.Cluster.ResourceGroups.Discovery.ScriptProbe" Accessibility="Public" RunAs="Cluster!Microsoft.Windows.Cluster.PrivilegedAccount" Batching="false" PassThrough="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="DiscoverySourceId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="ClusterName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Timeout" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="Timeout" Selector="$Config/Timeout$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<ProbeAction ID="Script" TypeID="ClusLibrary!Microsoft.Windows.Cluster.CommandExecuterProbeDiscoveryBase">
<ApplicationName>%SystemRoot%\system32\cmd.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>/c $file/Main.cmd$</CommandLine>
<TimeoutSeconds>$Config/Timeout$</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>Main.cmd</Name>
<Contents><Script>

@echo off
set psscript=DiscoverWindows2016ResourceGroups.ps1
set vbscript=DiscoverWindows2016ResourceGroups.vbs
set cscript=%windir%\system32\cscript.exe
set ps=%windir%\system32\WindowsPowerShell\v1.0\powershell.exe
set params=
if Exist "%cscript%" goto vb
if Exist "%ps%" goto pshell
goto end
:vb
if not exist "%~dp0%vbscript%" goto end

if exist "%~dp0vbparams.txt" (
set /p params=&lt;"%~dp0vbparams.txt"
)

"%cscript%" /nologo "%~dp0%vbscript%" %params%
goto end
:pshell
if not exist "%~dp0%psscript%" goto end

if exist "%~dp0psparams.txt" (
set /p params=&lt;"%~dp0psparams.txt"
)
"%ps%" -nologo -EP bypass -command "&amp; '%~dp0%psscript%'" %params%
goto end

:end



</Script></Contents>
<Unicode>false</Unicode>
</File>
<File>
<Name>DiscoverWindows2016ResourceGroups.ps1</Name>
<Contents><Script>

param($healthServiceName, $clusterName, $sourceId, $managedEntityId)

Function Init-ScomHelper
{
$DiscHelper = @'
namespace SCOM.Helper
{
using System;
using System.Runtime.InteropServices;
public class ConvertData
{

public static string GetDataItemFromOutput(
Object oData)
{
NativeMethods.ISerialize discoverySerializer = null;
discoverySerializer = oData as NativeMethods.ISerialize;
string xmlString = null;
if (null != discoverySerializer)
{
int hr = discoverySerializer.SaveToString(out xmlString);
Marshal.ThrowExceptionForHR(hr);
}

return xmlString;
}

public static class NativeMethods
{
[Guid("A4E79E8A-9494-47A4-A280-8C7D35C88A2F"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ISerialize
{
int SaveToString([MarshalAs(UnmanagedType.BStr)] out string output);
int LoadFromString([MarshalAs(UnmanagedType.BStr)] string input);
}
}
}
}

'@

$ErrorActionPreference = "SilentlyContinue"
$Error.Clear()
Add-Type $DiscHelper

$result = 0 -eq $Error.Count

return $result
}

#param($healthServiceName, $clusterName, $sourceId, $managedEntityId)
#Copyright (c) Microsoft Corporation. All rights reserved.

$Start_SnapShotDiscovery = 0
$Exit_SnapShotDiscovery = 1
$Exit_IncrementalDiscovery = 2

$OsVersion = "10."


Function Main()
{
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()

if ([string]::IsNullOrEmpty($clusterName) -or [string]::IsNullOrEmpty($healthServiceName) -or [string]::IsNullOrEmpty($sourceId) -or [string]::IsNullOrEmpty($managedEntityId) )
{
exit -1
}

$oAPI = new-object -comobject MOM.ScriptAPI
if (0 -ne $error.Count)
{
exit -1
}

$result = Init-ScomHelper
if ($false -eq $result)
{
exit -1
}

$oDiscoveryData = $oAPI.CreateDiscoveryData(0, $sourceId, $managedEntityId)
if (0 -ne $error.Count -or $null -eq $oDiscoveryData)
{
exit -1
}

$result = Get-SnapshotDiscovery -OsVersion $OsVersion

if ($Exit_IncrementalDiscovery -eq $result)
{
$oDiscoveryData.IsSnapshot = $false
}

if ($Start_SnapShotDiscovery -ne $result)
{
$SerializeDiscoveryData = [Scom.Helper.ConvertData]::GetDataItemFromOutput($oDiscoveryData)
Write-Host "$SerializeDiscoveryData"
return
}

$result = DiscoverGroups -ClusterName $ClusterName -oDiscoveryData $oDiscoveryData

if ($false -eq $result)
{
$error.Clear()
$oDiscoveryData = $oAPI.CreateDiscoveryData(0, $sourceId, $managedEntityId)
$oDiscoveryData.IsSnapshot = $false
}

if ($null -ne $oDiscoveryData)
{
$SerializeDiscoveryData = [Scom.Helper.ConvertData]::GetDataItemFromOutput($oDiscoveryData)
Write-Host "$SerializeDiscoveryData"
}

}

Function DiscoverGroups($ClusterName,$oDiscoveryData)
{
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$result = Load-Module -ModuleName "cimcmdlets"
$error.Clear()

if ($false -eq $result)
{
$groups = Get-WmiObject -NameSpace "root\mscluster" -ClassName "MSCluster_ResourceGroup" -Property ("Name","GroupType") -Filter "GroupType=1 or GroupType =2"
}
else
{
Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$groups = Get-CimInstance -CimSession $cimsession -NameSpace 'root\mscluster' -Class "MSCluster_ResourceGroup" -Property ("Name","GroupType") -Filter "GroupType=1 or GroupType =2"
}
catch
{
$groups = Get-WMIObject -NameSpace 'root\mscluster' -Class "MSCluster_ResourceGroup" -Property ("Name","GroupType") -Filter "GroupType=1 or GroupType =2"
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}

$result = 0 -eq $error.Count

if ($false -eq $result)
{
return $result
}

ForEach($group in $groups)
{

$groupType = $group.GroupType

If($groupType -eq 1)
{
$coreClustGroupInst = $oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.10.0.Cluster.CoreClusterGroup']$")
$coreClustGroupInst.AddProperty("$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ClusterName$",$clusterName);
$coreClustGroupInst.AddProperty("$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ObjectName$",$group.Name);
$oDiscoveryData.AddInstance($coreClustGroupInst);
}ElseIf($groupType -eq 2){
$availableStorageGroupInst = $oDiscoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.10.0.Cluster.AvailableStorageGroup']$")
$availableStorageGroupInst.AddProperty("$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ClusterName$", $clusterName);
$availableStorageGroupInst.AddProperty("$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ObjectName$", $group.Name);
$oDiscoveryData.AddInstance($availableStorageGroupInst)
}
}

$result = 0 -eq $error.Count

return $result
}

Function Load-Module ([string] $ModuleName)
{


$ErrorActionPreference="SilentlyContinue"
$error.Clear()

$retval = $false
if ([string]::IsNullOrEmpty($ModuleName) )
{
return $retval
}
$error.Clear()

$cim = Get-Module -Name $ModuleName

########Check for powershell 1.0
if ($error.Count -ne 0)
{
$type = $error[0].Exception.GetType()
if ([System.Management.Automation.CommandNotFoundException] -eq $type)
{
$error.Clear()
return $retval
}

$error.Clear()
}

if ($null -eq $cim)
{
Import-Module $ModuleName
if ($error.Count -eq 0)
{
$retval = $true
}

$error.Clear()
}
else
{
$retval = $true
}

return $retval

}

Function Get-OsFilter([string]$OSVersion,[string]$delimiter=",")
{
$ErrorActionPreference = "SilentlyContinue"
$Error.Clear()

$Filter = "ProductType != 1"

if([string]::IsNullOrEmpty($OsVersion))
{
return $Filter
}
$prefix = " and (Version like '"
$separator = "%' or Version like '"
$EndClause = "%')"

$OsVersions = $OSVersion.Split($delimiter,[StringSplitOptions]::RemoveEmptyEntries)
if ($OsVersions.Count -eq 0 -or $null -eq $OsVersions )
{
return $Filter
}

$SubFilter = [string]::Join($separator,$OsVersions)
$Filter = $Filter + $prefix + $SubFilter + $EndClause

return $Filter
}

Function Get-SnapshotDiscovery($OsVersion)
{
$ErrorActionPreference = "SilentlyContinue"

if([string]::IsNullOrEmpty($OsVersion))
{
return $Start_SnapShotDiscovery
}

$Filter = Get-OsFilter -OSVersion $OsVersion
$Error.Clear()
$result = Get-WmiObject -Class "Win32_OperatingSystem" -Property ("Version") -Filter $Filter
if(0 -ne $Error.Count)
{
$Error.Clear()
$result = Load-Module "cimcmdlets"
if ($false -eq $result)
{
$Error.Clear()
return $Exit_IncrementalDiscovery
}

Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$result = Get-CimInstance -CimSession $cimsession -ClassName "Win32_OperatingSystem" -Property ("Version") -Filter $Filter
}
catch
{
$result = Get-WMIObject -ClassName "Win32_OperatingSystem" -Property ("Version") -Filter $Filter
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}

if (0 -ne $Error.Count)
{
return $Exit_IncrementalDiscovery
}

}

if ($null -eq $result)
{
$result = $Exit_SnapShotDiscovery
}
else
{
$result = $Start_SnapShotDiscovery
}

return $result
}

Function Load-CimModules
{
$ErrorActionPreference = 'SilentlyContinue'
$error.Clear()

$CimModule = Get-Module CimCmdlets

if ($null -eq $CimModule)
{
Import-Module CimCmdlets
$error.Clear()

}
}


Main

</Script></Contents>
<Unicode>true</Unicode>
</File>
<File>
<Name>DiscoverWindows2016ResourceGroups.vbs</Name>
<Contents><Script>

'Copyright (c) Microsoft Corporation. All rights reserved.
Option Explicit
SetLocale("en-us")

Const DiscoveryScriptName = "DiscoverWindows2016ResourceGroups.vbs"
Const ScriptEventId = 7016
Const ClusterCoreGroupId = "$MPElement[Name='Microsoft.Windows.10.0.Cluster.CoreClusterGroup']$"
Const AvailableStorageGroupId = "$MPElement[Name='Microsoft.Windows.10.0.Cluster.AvailableStorageGroup']$"
Const ClusterNamePropId = "$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ClusterName$"
Const ObjectNamePropId = "$MPElement[Name='ClusLibrary!Microsoft.Windows.Cluster.Component']/ObjectName$"
Const OSversionNumber = "10."


Const EventTypeError = 1
Const EventTypeWarning = 2
Const EventTypeInformation = 3
Const Start_SnapShotDiscovery = 0
Const Exit_SnapShotDiscovery = 1
Const Exit_IncrementalDiscovery = 2

Call Main

Sub Main

On Error Resume Next

Dim healthServiceName
Dim clusterName
Dim sourceId
Dim managedEntityId
Dim message

Dim oAPI, oDiscoveryData
Dim groups
Dim result
Dim DiscoveryType

result = InitMomAPi(oAPI)

If (False = result) Then
Exit Sub
End If

result = CheckInitialization(healthServiceName,clusterName,sourceId,managedEntityId,oAPI,oDiscoveryData)

If (False = result) Then
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If

DiscoveryType = GetSnapshotDiscovery(OSversionNumber,oAPI)

If (Exit_IncrementalDiscovery = DiscoveryType) Then
oDiscoveryData.IsSnapshot = False
End If

If (Start_SnapShotDiscovery &lt;&gt; DiscoveryType) Then
oAPI.Return(oDiscoveryData)
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If


result = GetWmiGroups(groups,healthServiceName)
If (False = result) Then
oDiscoveryData.IsSnapshot = False
oAPI.Return(oDiscoveryData)
message = "Cannot get data from Wmi."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Set groups = Nothing
Set oAPI = Nothing
Set oDiscoveryData = Nothing
Exit Sub
End If

result = DoDiscovery(groups,clusterName,oDiscoveryData)

If (False = result) Then
message = "Discovery failled."
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Set oDiscoveryData = Nothing
result = InitDiscoveryData(oAPI,oDiscoveryData,sourceId, managedEntityId,False)

End If

oAPI.Return(oDiscoveryData)

Set groups = Nothing
Set oDiscoveryData = Nothing
Set oAPI = Nothing

On Error Goto 0
End Sub

Function HasValue(Value)

Dim bNothing

bNothing = false

IF ( IsObject(Value) ) THEN
IF (Nothing is Value) THEN
bNothing = true
END IF
END IF

HasValue = Not ( IsEmpty(Value) or bNothing or IsNull(Value) )
End Function

Function CheckInitialization(ByRef healthServiceName,ByRef clusterName,ByRef sourceId,ByRef managedEntityId,oAPI,ByRef oDiscoveryData )
On Error Resume Next

Dim message
Dim result

Err.Clear
result = False
CheckInitialization = False

result = GetScriptParameters(healthServiceName,clusterName,sourceId,managedEntityId)

If (False = result) Then
message = "Cannot initialize script parameters. healthServiceName :" &amp; healthServiceName &amp; " clusterName : " &amp; clusterName &amp; " sourceId: " &amp; sourceId &amp; " managedEntityId:" &amp; managedEntityId
message = GetErrorMessage(message)
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Exit Function
End If

result = InitDiscoveryData(oAPI,oDiscoveryData,sourceId, managedEntityId,True)
If (False = result) Then
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeWarning,message,oAPI)
Set oAPI = Nothing
Set oDiscoveryData = Nothing
End If

CheckInitialization = result

End Function

Function GetScriptParameters(ByRef healthServiceName,ByRef clusterName,ByRef sourceId,ByRef managedEntityId)
On Error Resume Next

GetScriptParameters = False
Err.Clear

Dim oArgs
Dim Count

Set oArgs = WScript.Arguments

If (0 &lt;&gt; Err.number) Then
Exit Function
End If

Count = oArgs.Count
If (Count &lt; 4) Then
Exit Function
End If

healthServiceName = ""
clusterName = ""
sourceId = ""
managedEntityId = ""

healthServiceName = oArgs(0)
clusterName = oArgs(1)
sourceId = oArgs(2)
managedEntityId = oArgs(3)

If ((False = HasValue(healthServiceName)) Or (False = HasValue(clusterName )) Or (False = HasValue(sourceId)) Or (False = HasValue(managedEntityId)) ) Then
Exit Function
End If

If (0 = Len(healthServiceName)) Then
healthServiceName = "."
End If

GetScriptParameters = True

On Error Goto 0
End Function

Function GetWmiGroups(ByRef groups, ByVal healthServiceName)
On Error Resume Next

Dim Namespace,LocalNamespace,Count
Dim wmi

GetWmiGroups = False
Namespace = "winmgmts:\\" + healthServiceName &amp; "\root\mscluster"
LocalNamespace = "winmgmts:\\.\root\mscluster"

Err.Clear
Set wmi = GetObject(Namespace)

If ( (False = HasValue(wmi)) Or (0 &lt;&gt; Err.Number) ) Then
If (Lcase(LocalNamespace) &lt;&gt; Lcase(Namespace) ) Then
Err.Clear
Set wmi = GetObject(LocalNamespace)
If ( (False = HasValue(wmi)) Or (0 &lt;&gt; Err.Number) ) Then
Set wmi = Nothing
Exit Function
End If
Else
Set wmi = Nothing
Exit Function
End If

End If

Set groups = wmi.ExecQuery("SELECT Name, GroupType FROM MSCluster_ResourceGroup where GroupType=1 or GroupType=2")
If (0 &lt;&gt; Err.Number) Then
Set wmi = Nothing
Set groups = Nothing
Exit Function
End If

Count = groups.Count
Set wmi = Nothing

GetWmiGroups = (0 = Err.Number)

End Function

Sub LogScomEvent(ScriptName,EventId,EventType,message,momAPI)
On Error Resume Next

Err.Clear

If (False = HasValue(momAPI)) Then
Set momAPI = CreateObject("MOM.ScriptAPI")

If ((False = HasValue(momAPI)) Or (0 &lt;&gt; Err.Number)) Then
Err.Clear
Exit SUb
End If
End If

Call momAPI.LogScriptEvent (ScriptName, EventId, EventType, message)

On Error Goto 0
End Sub

Function InitMomAPI(ByRef momAPI)
On Error Resume Next

InitMomAPi = False
Err.Clear
Set momAPI = CreateObject("MOM.ScriptAPI")

If ((False = HasValue(momAPI)) Or (0 &lt;&gt; Err.Number )) Then

WScipt.Echo "Failed to get MOM API. MOM v3 must be installed to execute this script."
If ( 0 &lt;&gt; Len(Err.Description)) Then
WScipt.Echo "Error: " &amp; Err.Description
End If
Err.Clear
Else
InitMomAPI = True
End If

On Error Goto 0
End Function

Function InitDiscoveryData(momAPI,ByRef DiscoveryData,sourceId, managedEntityId,IsSnapShot)
On Error Resume Next

InitDiscoveryData = False
Err.Clear

If (False = HasValue(momAPI)) Then
Exit Function
End If

Dim message
Set DiscoveryData = momAPI.CreateDiscoveryData(0, sourceId, managedEntityId)
If ((False = HasValue(DiscoveryData)) Or (0 &lt;&gt; Err.Number)) Then
message = "Failed to get Discovery Data Object."
message = GetErrorMessage(message)

Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,momAPI)
Err.Clear
Else
DiscoveryData.IsSnapshot = IsSnapShot
InitDiscoveryData = (0 = Err.number)
End If

On Error Goto 0
End Function

Function GetErrorMessage(message)

If ( 0 &lt;&gt; Len(Err.Description)) Then
message = message &amp; "Error: Id: " &amp; Err.number &amp; " Description:" &amp; Err.Description
End If

GetErrorMessage = message
End Function

Function DoDiscovery(groups,clusterName,ByRef DiscoveryData)

Dim groupType
Dim coreClustGroupInst
Dim availableStorageGroupInst
Dim result
Dim group

On Error Resume Next

result = False
DoDiscovery = result

result = true

For Each group in groups
groupType = group.GroupType

If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

If groupType = 1 Then

Set coreClustGroupInst = DiscoveryData.CreateClassInstance(ClusterCoreGroupId)

coreClustGroupInst.AddProperty ClusterNamePropId,clusterName
coreClustGroupInst.AddProperty ObjectNamePropId,group.Name
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

DiscoveryData.AddInstance coreClustGroupInst
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

ElseIf groupType = 2 then

Set availableStorageGroupInst = DiscoveryData.CreateClassInstance(AvailableStorageGroupId)

availableStorageGroupInst.AddProperty ClusterNamePropId,clusterName
availableStorageGroupInst.AddProperty ObjectNamePropId,group.Name

If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

DiscoveryData.AddInstance availableStorageGroupInst
If (0 &lt;&gt; Err.number) Then
result = false
Exit For
End If

End If
Next

Set group = Nothing

DoDiscovery = result

End Function

Function GetOsFilter(OSVersion,delimiter)

On Error Resume Next
Err.Clear

Dim Filter,Prefix,Separator,EndClause
Dim OsVersions,SubFilter

Filter = " where ProductType != 1"
GetOSFilter = Filter

If (Not HasValue(OSVersion) or 0 = Len(OSVersion)) Then
Exit Function
End If
If (Not HasValue(delimiter)) Then
delimiter = ","
End If

If (delimiter = OSVersion) Then
Exit Function
End If

Prefix = " and (Version like '"
Separator = "%' or Version like '"
EndClause = "%')"

OsVersions = Split(OSVersion,delimiter)

SubFilter = Join(OsVersions,Separator)
Filter = Filter &amp; Prefix &amp; SubFilter &amp; EndClause

GetOSFilter = Filter

On Error Goto 0
End Function

Function GetServerOsVersionCheck(sComputerName,OsVersion,ByRef IsError,ByVal oAPI)

On Error Resume Next

Err.Clear

Dim strQuery,oWmiSet, sWmiTarget, Count, Filter
IsError = False
GetServerOsVersionCheck = False

If ( IsObject(OsVersion)) Then
Exit Function
End If

sWmiTarget = "."

If ( Not IsObject(sComputerName)) Then
If (HasValue(sComputerName) and Len(sComputerName) &gt; 0 ) Then
sWmiTarget = "" &amp; sComputerName
End If
End If

sWmiTarget = "winmgmts:\\" &amp; sWmiTarget &amp; "\root\cimv2"
Filter = GetOsFilter(OsVersion,",")
StrQuery = "select Version from Win32_OperatingSystem" &amp; Filter
Set oWmiSet = WMIExecQueryNoAbort(sWmiTarget, strQuery,oAPI)

If Err.Number &lt;&gt; 0 Then
IsError = True
Exit Function
End If

Count = oWmiSet.Count
If Err.Number &lt;&gt; 0 Then
IsError = True
Exit Function
End If

GetServerOsVersionCheck = ( Count &gt; 0)

On Error Goto 0
End Function

Function GetSnapshotDiscovery(OsVersion,ByVal oAPI)

Dim bIsOsValid,bIsError,iResult

On Error Resume Next

bIsOsValid = GetServerOsVersionCheck(".",OsVersion,bIsError,oAPI)

If (bIsOsValid) Then
iResult = Start_SnapShotDiscovery
Else
If (bIsError) Then
iResult = Exit_IncrementalDiscovery
Else
iResult = Exit_SnapShotDiscovery
End IF

End If

GetSnapshotDiscovery = iResult
End Function

Function WMIExecQueryNoAbort(ByVal sNamespace, ByVal sQuery, ByVal oAPI)

Dim oWMI, oQuery, nInstanceCount, message

Set WMIExecQueryNoAbort = Nothing

On Error Resume Next
Err.Clear
Set oWMI = GetObject(sNamespace)

If ((False = HasValue(oWMI)) Or (0 &lt;&gt; Err.number)) Then
message = "Unable to open WMI Namespace '" &amp; sNamespace &amp; "'. Check to see if the WMI service is enabled and running, and ensure this WMI namespace exists."
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Set oWMI = Nothing
Exit Function
End If

Set oQuery = oWMI.ExecQuery(sQuery)

If ((False = HasValue(oQuery)) Or (0 &lt;&gt; Err.number)) Then
message = "The Query '" &amp; sQuery &amp; "' returned an invalid result set. Please check to see if this is a valid WMI Query."
Call LogScomEvent(DiscoveryScriptName,ScriptEventId,EventTypeError,message,oAPI)
Exit Function
End If

Set oWMI = Nothing

Set WMIExecQueryNoAbort = oQuery


End Function
</Script></Contents>
<Unicode>false</Unicode>
</File>
<File>
<Name>vbparams.txt</Name>
<Contents><Script>"$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$" "$Config/ClusterName$" "$Config/DiscoverySourceId$" "$Target/Id$"</Script></Contents>
<Unicode>false</Unicode>
</File>
<File>
<Name>psparams.txt</Name>
<Contents><Script>'$Target/Host/Property[Type='Windows!Microsoft.Windows.Computer']/PrincipalName$' '$Config/ClusterName$' '$Config/DiscoverySourceId$' '$Target/Id$'</Script></Contents>
<Unicode>false</Unicode>
</File>
</Files>
<OutputType>System.Discovery.Data</OutputType>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="Script"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.Discovery.Data</OutputType>
<InputType>System!System.BaseData</InputType>
</ProbeActionModuleType>