Const EVENT_ID_SUCCESS = 1000 'Use IDs in the range 1 - 1000
Const EVENT_ID_SCRIPTERROR = 999 'Then you can use eventcreate.exe to test the MP
Call Main
'*********************************************************************************************
' PROCEDURE: Main
' DESCRIPTION: Reads the script parameters, gets the cluster name and
' discovers the containment relationship between a cluster and
' the targeted cluster virtual server.
' PARAMETERS: void
'*********************************************************************************************
Private Sub Main()
' Targeted at Microsoft.Windows.Cluster.VirtualServer (based on Microsoft.Windows.Server.Computer)
Dim strSourceId
Dim strManagedEntityId
Dim objDiscoveryData 'As DiscoveryData
Dim objMomScriptAPI
On Error Resume Next
Err.Clear
Set objMomScriptAPI = CreateObject("MOM.ScriptAPI")
If Err.Number <> 0 Then
Exit Sub
End If
If Not GetScriptParameters(strSourceId, strManagedEntityId) Then
strSourceId = "$MPElement$"
strManagedEntityId = "$Target/Id$"
End If
Err.Clear
'Create new discovery data object
Set objDiscoveryData = objMomScriptAPI.CreateDiscoveryData(0, strSourceId, strManagedEntityId)
If Err.Number <> 0 Then
WScript.Quit(-1)
End If
Call objMomScriptAPI.Return(objDiscoveryData)
On Error Goto 0
End Sub
'******************************************************************************
' FUNCTION: GetScriptParameters
' DESCRIPTION: Reads the script's parameters
' and sets the global variables.
'
' PARAMETERS: OUT String strSourceID: Id of MP element ($MPElement$)
' OUT String strManagedEntityId: Id of targeted entity ($Target/Id$)
' OUT String strTargetComputer: Principal name of executing computer
' ($Target/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$)
' RETURNS: Boolean: True if successful
'******************************************************************************
Private Function GetScriptParameters(ByRef strSourceID, ByRef strManagedEntityId) 'As Boolean
Dim objArguments
On Error Resume Next
Err.Clear
GetScriptParameters = False
'cmdline: <script> True|False <path to debug log> True|False <script id> .MPElement. .Target/Id. .Target/Property[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName.
Set objArguments = WScript.Arguments
If objArguments.Count < 2 Then Exit Function
$EVENT_ID_SUCCESS = 1000 #Use IDs in the range 1 - 1000
$EVENT_ID_SCRIPTERROR = 999 #Then you can use eventcreate.exe to test the MP
$Windows2016VersionPrefix = "10.0"
$WMI_NAMESPACE = "root\cimv2"
$WMI_OsCLASS = "Win32_OperatingSystem"
$SeedClassName = "$MPElement[Name='Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.Cluster.NewOS']$"
#*********************************************************************************************
# PROCEDURE: Main
# DESCRIPTION: Reads the script parameters and creates the cluster seed discovery data for Nano Server.
# PARAMETERS: void
#*********************************************************************************************
Function Main()
{
$ErrorActionPreference = 'SilentlyContinue'
$error.Clear()
$objMomScriptAPI = New-Object -comObject MOM.ScriptAPI -ErrorAction SilentlyContinue
if ($null -eq $objMomScriptAPI)
{
Throw-ScriptError -Message "Cannot Initialize MOM Script API"
}
$result = Init-ScomHelper
if ($false -eq $result)
{
LogScriptEvent -LogType 0 -EventId $EVENT_ID_SCRIPTERROR -EventLevel $EVENT_TYPE_WARNING -Message "`nAn error occurred while running script. Cannot iniatialize Discovery Data Serialization Object" -objMomScriptAPI $objMomScriptAPI
return
}
$mblnLogSuccessEvent = Convert-ToBoolean -sBool $LogSuccessEvent
$useCIM = CheckCmdLets
$error.Clear()
#Create new discovery data object
$objDiscoveryData = $objMomScriptAPI.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)
if ($error.Count -ne 0 -or $null -eq $objDiscoveryData)
{
LogScriptEvent -LogType 0 -EventId $EVENT_ID_SCRIPTERROR -EventLevel $EVENT_TYPE_WARNING -Message "`nAn error occurred while running script. Cannot Creata Discovery Data Object" -objMomScriptAPI $objMomScriptAPI
Throw-ScriptError -Message "An error occurred while running script. Cannot Creata Discovery Data Object."
}
#****************************************************************************************************************
# FUNCTION: DiscoverClusterSharedVolumes
# DESCRIPTION: Discover instances of the class #Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.ClusterSharedVolume# using WMI.
# PARAMETERS: IN String strTargetComputer: principal name of the targeted #Microsoft.Windows.Cluster.VirtualServer# instance.
# IN String strClusterName: the cluster containing the cluster shared volume
# OUT Object objDiscoveryData: initialised DiscoveryData instance
# RETURNS: Integer: 0 if successful and 1 if fails
#****************************************************************************************************************
Function DiscoverClusterName([string]$strTargetComputer, [string]$strClusterName, $objDiscoveryData,$useCIM) #As Integer
{
$iResult = $SCRIPT_SUCCESS
$IsNano = Check-OsVersion -useCim $useCIM
if (-Not $IsNano -or [string]::IsNullOrEmpty($strClusterName) )
{
return $SCRIPT_SUCCESS
}
# RETURNS: Integer: 0 if successful or 1 if Error
#****************************************************************************************************************
Function CreateDiscoveryData($strTargetComputer, $strClusterName, $objDiscoveryData) #As Integer
{
Function Get-ComputerName([string]$strTargetComputer)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()
$strTargetComputerShortName = $strTargetComputer
Function Throw-ScriptError([string]$Message)
{
throw $Message
exit
}
Function Get-CSVResource([string]$VolumeId,[hashtable]$VolumeToResource)
{
if ($null -eq $VolumeToResource -or [string]::IsNullOrEmpty($VolumeId))
{
return $null
}
$CsvResource = $VolumeToResource[$VolumeId]
return $CsvResource
}
Function Get-CSVPartition([string]$VolumeId,[hashtable]$VolumeToPartition)
{
if ($null -eq $VolumeToPartition -or [string]::IsNullOrEmpty($VolumeId))
{
return $null
}
$CsvPartition = $VolumeToPartition[$VolumeId]
return $CsvPartition
}
Function Get-ResourceNameToVolumeTable([bool]$useCim,[hashtable]$ResourceToVolume)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()
if ($null -eq $ResourceToVolume)
{
return $false
}
Function Get-VolumeToPartitionTable([bool]$useCim,[hashtable]$VolumeToPartition)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()
if ($null -eq $VolumeToPartition)
{
return $false
}
foreach ($Partition in $Partitions)
{
$VolumeToPartition[$Partition.Path] = $Partition
}
return $true
}
Function Get-ResourceNameToResourceTable([bool]$useCim,[hashtable]$NameToResource,[string]$Filter)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()