Módulo de acción de prueba de detección del agente de ejecución de comandos

Microsoft.Windows.Cluster.Monitoring.Discovery.ScriptProbe.Mapper (ProbeActionModuleType)

Ejecuta cualquier archivo ejecutable de Windows y devuelve datos de detección.

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
TimeoutSecondsint$Config/TimeoutSeconds$Tiempo de espera en segundos

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.Cluster.Monitoring.Discovery.ScriptProbe.Mapper" 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="TimeoutSeconds" type="xsd:integer"/>
<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="TargetSourceId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="ClassId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="PropertyId" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="PropertyValue" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="PropertyId2" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="PropertyValue2" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="0" name="OSVersion" type="xsd:string"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<ProbeAction ID="Script" TypeID="Microsoft.Windows.Cluster.CommandExecuterProbeDiscoveryBase">
<ApplicationName>%SystemRoot%\system32\cmd.exe</ApplicationName>
<WorkingDirectory/>
<CommandLine>/c $file/Main.cmd$</CommandLine>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<RequireOutput>true</RequireOutput>
<Files>
<File>
<Name>Main.cmd</Name>
<Contents><Script>

@echo off


set psscript=DiscoverOsBased.ps1
set vbscript=DiscoverOsBased.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
If %ERRORLEVEL% NEQ 0 (
exit %ERRORLEVEL%
)



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

param
(
$SourceId
,$ManagedEntityId
,$ClassId
,$PropertyId
,$PropertyValue
,$OSVersion
,$PropertyId2
,$PropertyValue2

)


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
}
#=================================
#Global Variables
##################################
$oAPI = $null
#====================================
# Log Constants
#=====================================
$DBG_NONE = 0
$DBG_ERROR = 1
$DBG_WARNING = 2
$DBG_TRACE = 4
$EventId = 7033
$Start_SnapShotDiscovery = 0
$Exit_SnapShotDiscovery = 1
$Exit_IncrementalDiscovery = 2



#=====================================
# String Constants
#=====================================
$ScriptName = "ScriptProbeMapper.ps1"

$StartParametersMsg = @"

Windows Cluster Os Based Discovery
SourceId: {0} ManagedEntityId : {1} ClassId : {2} PropertyId : {3} PropertyValue : {4}
OsVersion : {5} PropertyId2 : {6} PropertyValue2 : {7}
"@
$StartDiscoveryMsg = "Started cluster Os Based discovery at machine local time:"
$FinishDiscoveryMsg = "Finished dicovery at machine local time: "
$CreateDiscoveryDataErrorMsg = "Failed to get Discovery Data Object. MOM v3 must be installed to execute this script."
$InitApiErrorMsg = "Failed to get Discovery API. MOM v3 must be installed to execute this script. Error:{0}"
$InitScomSerApiErrorMsg = "Failed to Initialize SCOM Discovery Serialization API. MOM v3 must be installed to execute this script."

$ErrorStartParametersMsg = "Minimal list of parameters is empty. Exiting discovery. SourceId: {0} ManagedEntityId : {1} ClassId : {2} PropertyId : {3} "


#==========================================================================
# FUNCTIONS
#==========================================================================

Function DiscoverInstances
(
$SourceId
,$ManagedEntityId
,$ClassId
,$PropertyId
,$PropertyValue
,$OSVersion
,$PropertyId2
,$PropertyValue2

)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
Log-DiscoveryMessage -message $StartDiscoveryMsg
$error.Clear()
$oDiscoveryData = $oAPI.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)

If(0 -ne $error.Count -or [string]::IsNullOrEmpty($oDiscoveryData))
{
$message = $CreateDiscoveryDataErrorMsg + "OsVersion: [$OSVersion ] Error: " + $error[0].Exception.Message
LogMessage $DBG_ERROR $message

return $null
}

$result = Get-SnapshotDiscovery -OsVersion $OsVersion

if ($Exit_IncrementalDiscovery -eq $result)
{
$oDiscoveryData.IsSnapshot = $false
}
elseif($Start_SnapShotDiscovery -eq $result)
{
$emptyDiscoveryData = Get-EmptyDiscoveryData -SourceId $SourceId -ManagedEntityId $ManagedEntityId -IsSnapshot $false
$oClassInstance = $oDiscoveryData.CreateClassInstance($ClassId)
if ($null -eq $oClassInstance -or 0 -ne $error.Count)
{
$oDiscoveryData = $emptyDiscoveryData
}
else
{
$oClassInstance.AddProperty($PropertyId,$PropertyValue)
if (-Not [string]::IsNullOrEmpty($PropertyId2))
{
$oClassInstance.AddProperty($PropertyId2,$PropertyValue2)
}

if (0 -ne $error.Count)
{
$oDiscoveryData = $emptyDiscoveryData
}
else
{
$oDiscoveryData.AddInstance($oClassInstance)
if (0 -ne $error.Count)
{
$oDiscoveryData = $emptyDiscoveryData
}

}

}
}

Log-DiscoveryMessage -message $FinishDiscoveryMsg
return $oDiscoveryData
}

function Get-EmptyDiscoveryData($SourceId, $ManagedEntityId,$IsSnapshot)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$Error.Clear()

if ($null -eq $oAPI)
{
$oAPI = New-Object -ComObject "MOM.ScriptAPI"
if ($null -eq $oAPI)
{
return $null
}
}

$Error.Clear()

$oDiscoveryDataTmp= $oAPI.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)
If (0 -ne $Error.Count -or $null -eq $oDiscoveryDataTmp)
{
$mes = "Cannot create empty discovery data. OsVersion: [$OSVersion ] Error:" + $error[0].Exception.Message
LogMessage -nLevel $DBG_ERROR -strMessage $mes -LogId $EventId
return $null
}

$oDiscoveryDataTmp.IsSnapshot = $IsSnapshot
$Error.Clear()

return $oDiscoveryDataTmp
}

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 Log-DiscoveryMessage([string]$message)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$timex=get-date -displayhint time
$message = $message +" " + $timex
LogMessage $DBG_TRACE $message

}


#======================================================================
# Method: LogMessage
# Description: Log a debug message to ScriptContext
# Parameters:
# nLevel - Debug level for the message that
# we're logging.
# strMessage - The message to write to the trace.
#======================================================================
Function LogMessage($nLevel, $strMessage,$LogId = $EventId)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function

if($nLevel -eq $DBG_ERROR)
{
Write-Host "[Error]: " $strMessage;
}elseif ($nLevel -eq $DBG_WARNING)
{
Write-Host "[Warning]: " $strMessage;
} elseif ($nLevel -eq $DBG_TRACE)
{
Write-Host "[Trace]: " $strMessage;
}
else
{
Write-Host $strMessage
}
$Error.Clear()

if ($null -eq $oAPI)
{
$oAPI = New-Object -ComObject "MOM.ScriptAPI"
if ($null -eq $oAPI)
{
return $null
}
}

if ($null -eq $LogId)
{
$LogId = 7033
}

$oAPI.LogScriptEvent($ScriptName,$LogId,$nLevel,$strMessage)
}


#==========================================================================
# Initialize the arguments in Script
#==========================================================================
Function Initialize-DiscoveryScript
(
[ref]$oAPI
)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

if ($null -eq $oAPI)
{
exit -1

}

$oAPI.Value = New-object -ComObject "MOM.ScriptAPI"
if ($true -eq [string]::IsNullOrEmpty($oAPI.Value) -or 0 -ne $error.Count)
{
exit -1
}

$result = Init-ScomHelper
if ($false -eq $result)
{
LogMessage -nLevel $DBG_ERROR -strMessage "Cannot create discovery serialization object." -LogId $EventId
exit -1
}

}

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)
{
if ($null -eq $error[0].Exception)
{
$error.Clear()
return $retval

}

$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 Log-StartParameters
{
$message = $StartParametersMsg -f ($SourceId,$ManagedEntityId,$ClassId,$PropertyId,$PropertyValue,$OSVersion,$PropertyId2,$PropertyValue2)
LogMessage $DBG_TRACE $message

If ([string]::IsNullOrEmpty($SourceId) -or [string]::IsNullOrEmpty($ManagedEntityId) -or [string]::IsNullOrEmpty($ClassId) -or [string]::IsNullOrEmpty($PropertyId))
{
$message = $ErrorStartParametersMsg -f ($SourceId,$ManagedEntityId,$ClassId,$PropertyId)
LogMessage $DBG_ERROR $message
}
}


#==========================================================================
# Main
#==========================================================================
$ErrorActionPreference = "SilentlyContinue"

Initialize-DiscoveryScript -oAPI ([ref] $oAPI)
Log-StartParameters

$discoveryData = DiscoverInstances -SourceId $SourceId -ClassId $ClassId -ManagedEntityId $ManagedEntityId -PropertyValue $PropertyValue -PropertyId $PropertyId -OSVersion $OsVersion -PropertyId2 $PropertyId2 -PropertyValue2 $PropertyValue2

if ($null -ne $discoveryData)
{
$SerializeDiscoveryData = [Scom.Helper.ConvertData]::GetDataItemFromOutput($discoveryData)
Write-Host "$SerializeDiscoveryData"
}
else
{
$e = ""
if (0 -ne $error.Count)
{
$e = $error[0].Exception.Message
}

$mes = "Discovery return nullalble discovery data. OsVersion: [$OSVersion ] . Details: $e"
LogMessage -nLevel $DBG_ERROR -strMessage $mes -LogId $EventId
exit 4
}

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

$CimModule = Get-Module CimCmdlets

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

}
}</Script></Contents>
<Unicode>true</Unicode>
</File>
<File>
<Name>DiscoverOsBased.vbs</Name>
<Contents><Script>

Option Explicit
SetLocale("en-us")

Const Start_SnapShotDiscovery = 0
Const Exit_SnapShotDiscovery = 1
Const Exit_IncrementalDiscovery = 2

Const EventTypeError = 1
Const EventTypeWarning = 2
Const EventTypeInformation = 0
Const ScriptEventId = 7031
Const ScriptName = "ScriptprobeMapper.vbs"

Call Main

Sub Main()
On Error Resume Next

Dim oAPI, oDiscoveryData
Dim SourceId,ManagedEntityId,ClassId,PropertyId,PropertyValue
Dim OSVersion,PropertyId2,PropertyValue2
Dim result
Dim message
Dim IsArgs

result = False
Set oAPI = CreateObject("MOM.ScriptAPI")
If(0 &lt;&gt; Err.number or (False = HasValue(oAPI)) ) Then
WScript.Quit(-1)
End If

result = GetArguments(SourceId,ManagedEntityId,ClassId,PropertyId,PropertyValue,OSVersion,PropertyId2,PropertyValue2,IsArgs)

message = "SourceId: " &amp; SourceId &amp; " ManagedEntityId: " &amp; ManagedEntityId &amp; " ClassId: " &amp; ClassId &amp; " " &amp; vbCrLf
message = message &amp; "OSVersion : " &amp; OSVersion &amp; " PropertyId: " &amp; PropertyId &amp; " PropertyValue: " &amp; PropertyValue &amp; " " &amp; vbCrLf
message = message &amp; "PropertyId2: " &amp; PropertyId2 &amp; " PropertyValue2: " &amp; PropertyValue2 &amp; " " &amp; vbCrLf

If(False = result) Then
Call oAPI.LogScriptEvent(ScriptName,ScriptEventId, EventTypeWarning, "Wrong Number of arguments." &amp; vbCrLf &amp; message)
Set oAPI = Nothing
WScript.Quit(-2)
End If

Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
If(0 &lt;&gt; Err.number or (False = HasValue(oDiscoveryData)) ) Then
message = "Cannot create Discovery Data. Error: " &amp; Err.Description &amp; vbCrLf &amp; message
Call oAPI.LogScriptEvent(ScriptName,ScriptEventId, EventTypeError, message)
Set oAPI = Nothing
WScript.Quit(-3)
End If

If (False = IsArgs) Then
oDiscoveryData.IsSnapShot = False
Call oAPI.Return(oDiscoveryData)
Set oAPI = Nothing
Exit Sub
End If

result = DiscoverInstances(SourceId,ManagedEntityId,ClassId,PropertyId,PropertyValue,OSVersion,PropertyId2,PropertyValue2,oDiscoveryData)
If(False = result) Then
Set oDiscoveryData = oAPI.CreateDiscoveryData(0, SourceId, ManagedEntityId)
If(0 &lt;&gt; Err.number or (False = HasValue(oDiscoveryData)) ) Then
message = "Cannot create empty Discovery Data. Error: " &amp; Err.Description &amp; vbCrLf &amp; message
Call oAPI.LogScriptEvent(ScriptName,ScriptEventId, EventTypeError, message)
WScript.Quit(-4)
End If

oDiscoveryData.IsSnapShot = False
End If

Call oAPI.Return(oDiscoveryData)

Set oDiscoveryData = Nothing
Set oAPI = Nothing

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 GetArguments(ByRef SourceId,ByRef ManagedEntityId,ByRef ClassId,ByRef PropertyId,ByRef PropertyValue,ByRef OSVersion,ByRef PropertyId2,ByRef PropertyValue2,ByRef IsArgs)
On Error Resume Next

GetArguments = False
IsArgs = False

If (WScript.Arguments.Count &lt; 2) Then
Exit Function
End If

Dim objArguments

Set objArguments = WScript.Arguments
SourceId = Replace(objArguments(0), Chr(34), "")
ManagedEntityId = Replace(objArguments(1), Chr(34), "")

If (WScript.Arguments.Count &lt; 5) Then
GetArguments = True
Exit Function
Else
IsArgs = True
End If

ClassId = Replace(objArguments(2), Chr(34), "")
PropertyId = Replace(objArguments(3), Chr(34), "")
PropertyValue = Replace(objArguments(4), Chr(34), "")
OSVersion = ""
PropertyId2 = ""
PropertyValue2 = ""

If (WScript.Arguments.Count &gt; 5) Then
OSVersion = Replace(objArguments(5), Chr(34), "")
End If

If (WScript.Arguments.Count &gt; 6) Then
PropertyId2 = Replace(objArguments(6), Chr(34), "")
End If

If (WScript.Arguments.Count &gt; 7) Then
PropertyValue2 = Replace(objArguments(7), Chr(34), "")
End If

GetArguments = True

On Error Goto 0
End Function

Function DiscoverInstances(SourceId,ManagedEntityId,ClassId,PropertyId,PropertyValue,OSVersion,PropertyId2,PropertyValue2,oDiscoveryData)

On Error Resume Next

Dim result, oClassInstance

DiscoverInstances = True
result = GetSnapshotDiscovery(OsVersion)

If (Exit_IncrementalDiscovery = result) Then

oDiscoveryData.IsSnapshot = false

ElseIf(Start_SnapShotDiscovery = result) Then
Set oClassInstance = oDiscoveryData.CreateClassInstance(ClassId)
If (0 &lt;&gt; Err.number) Then
DiscoverInstances = False
Exit Function
End If

Call oClassInstance.AddProperty(PropertyId,PropertyValue)

If (HasValue(PropertyId2) and Len(PropertyId2) &gt; 0 ) Then
Call oClassInstance.AddProperty(PropertyId2,PropertyValue2)
End If

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

Call oDiscoveryData.AddInstance(oClassInstance)
DiscoverInstances = 0 = Err.number

End If

On Error Goto 0
End Function

Function WMIExecQueryNoAbort(ByVal sNamespace, ByVal sQuery)
Dim oWMI, oQuery,Count

Set oWMI = GetObject(sNamespace)
Set oQuery = oWMI.ExecQuery(sQuery)
Set WMIExecQueryNoAbort = oQuery
End Function

Function GetOsFilter(OSVersion,delimiter)

On Error Resume Next

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)

On Error Resume Next

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)

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)

Dim bIsOsValid,bIsError,iResult

On Error Resume Next

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

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

</Script></Contents>
<Unicode>false</Unicode>
</File>
<File>
<Name>vbparams.txt</Name>
<Contents><Script>"$Config/DiscoverySourceId$" "$Config/TargetSourceId$" "$Config/ClassId$" "$Config/PropertyId$" "$Config/PropertyValue$" "$Config/OSVersion$" "$Config/PropertyId2$" "$Config/PropertyValue2$"</Script></Contents>
<Unicode>false</Unicode>
</File>
<File>
<Name>psparams.txt</Name>
<Contents><Script>'$Config/DiscoverySourceId$' '$Config/TargetSourceId$' '$Config/ClassId$' '$Config/PropertyId$' '$Config/PropertyValue$' '$Config/OSVersion$' '$Config/PropertyId2$' '$Config/PropertyValue2$'</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>