Testovací akce detekce stavu objektu úložiště na vyžádání

Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.StorageObjectHealthStateProbe (ProbeActionModuleType)

Typ testovací akce, která aktivuje dotaz na stav objektu úložiště během inicializace monitorování a detekce na vyžádání.

Element properties:

TypeProbeActionModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
OutputTypeSystem.PropertyBagData

Member Modules:

ID Module Type TypeId RunAs 
PassThrough ProbeAction System.PassThroughProbe Default
Script ProbeAction Microsoft.Windows.PowerShellPropertyBagProbe Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
TimeoutSecondsint$Config/TimeoutSeconds$Časový limit (s)

Source Code:

<ProbeActionModuleType ID="Microsoft.Windows.Server.10.0.Storage.StorageSpacesDirect.StorageObjectHealthStateProbe" Accessibility="Public" Batching="false" PassThrough="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TargetInstanceUniqueID" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TargetInstanceObjectID" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="StorageClassName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ComputerName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" maxOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<ProbeAction ID="PassThrough" TypeID="System!System.PassThroughProbe"/>
<ProbeAction ID="Script" TypeID="Windows!Microsoft.Windows.PowerShellPropertyBagProbe">
<ScriptName>StorageObjectHealthStateProbeScript.ps1</ScriptName>
<ScriptBody><Script>param([string] $targetInstanceUniqueID, [string] $targetInstanceObjectID, [string] $storageClassName)

$errorActionPreference = 'Stop'

$momAPI = New-Object -comObject 'MOM.ScriptAPI'

$errEvent = [System.Diagnostics.EventLogEntryType]::Error;
$infoEvent = [System.Diagnostics.EventLogEntryType]::Information;

#Storage Monitoring Event Ids
$GenericInformationEvent = 8671;
$GenericFailureEvent = 8672;

$script:traceMsg = "";
$scriptName = "StorageObjectHealthStateProbeScript.ps1"
#Create Storage CurrentHealthStatus property bag data
$propertyBag = $momAPI.CreatePropertyBag()

$PropertyBagProperty_CurrentHealthStatus = "CurrentHealthStatus"

# MSFT_StorageObject HealthStatus values
$MSFT_StorageObject_HealthStatus_HEALTHY = "Healthy"
$MSFT_StorageObject_HealthStatus_WARNING = "Warning"
$MSFT_StorageObject_HealthStatus_UNHEALTHY = "Unhealthy"

# StorageFaultEvent CurrentHealthStatusValues; that maps to MSFT_StorageObject HealthStatus values
$CurrentHealthStatus_HEALTHY = 0
$CurrentHealthStatus_WARNING = 1
$CurrentHealthStatus_UNHEALTHY = 2

# Property Bag property value
$currentHealthStatus = 0; #default health status

#Adds tracemessage to $Script
Function AddTraceMessage
{
param($message)
$timeStamp = (get-date -format "HH:mm:ss:fff");
$script:traceMsg = $script:traceMsg + "`n[" + $timeStamp + "] " + $message;
}

Try
{
$error.Clear();

AddTraceMessage -message -join ("Storage monitoring script ", $scriptName," started.")

AddTraceMessage -message "Storage class = $storageClassName `nstorage unique id = $targetInstanceUniqueID `nobject id = $targetInstanceObjectID"
$importLog = "";
$storageModule = get-module -name "Storage"
if ($storageModule -eq $null)
{
$importLog = Import-Module Storage
}

$propertyBag.AddValue("SourceUniqueId", $targetInstanceUniqueID);
$propertyBag.AddValue("SourceObjectId", $targetInstanceObjectID);
$storageObject = $null
AddTraceMessage -message "Start finding the object."
if($storageClassName -eq "MSFT_StorageSubSystem")
{
$storageObject = Get-StorageSubsystem -UniqueId $targetInstanceUniqueID
#$storageObject = Get-StorageSubsystem -ObjectId $targetInstanceObjectID
}
elseif($storageClassName -eq "MSFT_Volume")
{
$storageObject = Get-Volume -UniqueId $targetInstanceUniqueID
#$storageObject = Get-StorageSubsystem -ObjectId $targetInstanceObjectID
}
elseif($storageClassName -eq "MSFT_FileShare")
{
$storageObject = Get-FileShare -UniqueId $targetInstanceUniqueID
#$storageObject = Get-StorageSubsystem -ObjectId $targetInstanceObjectID
}

if ($storageObject -eq $null)
{
#Throw [System.NullReferenceException] -join("Can't find Storage Object with UniqueID = ", $targetInstanceUniqueID);
#Throw [System.NullReferenceException] -join("Can't find Storage Object with ObjectID = ", $targetInstanceObjectID);
return
}

if($storageObject.HealthStatus -eq $MSFT_StorageObject_HealthStatus_HEALTHY)
{
$currentHealthStatus = $CurrentHealthStatus_HEALTHY; # i.e. 0
}
elseif($storageObject.HealthStatus -eq $MSFT_StorageObject_HealthStatus_WARNING)
{
$currentHealthStatus = $CurrentHealthStatus_WARNING; # i.e. 1
}
elseif($storageObject.HealthStatus -eq $MSFT_StorageObject_HealthStatus_UNHEALTHY)
{
$currentHealthStatus = $CurrentHealthStatus_UNHEALTHY; # i.e. 2
}

$hs = ($storageObject.HealthStatus);

AddTraceMessage -message "HealthStatus of storage object = $hs`n CurrentHealthStatus property bag value = $currentHealthStatus"

$propertyBag.AddValue("CurrentHealthStatus", $currentHealthStatus);

$propertyBag

AddTraceMessage -message -join ("Storage monitoring script ", $scriptName, " completed.");
}
Catch
{
AddTraceMessage -message $_.Exception.Message
}
Finally
{
if ($error -ne $null -and $error.Count -gt 0 -and $error[0] -ne $null)
{
$momAPI.LogScriptEvent($scriptName, $GenericFailureEvent, 1, $error[0].ToString());
}

if ($script:traceMsg -ne $null)
{
#Debug
AddTraceMessage -message "ImortResult = $importLog"
$momAPI.LogScriptEvent($scriptName, $GenericInformationEvent, 0, $script:traceMsg);
}
}</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>targetInstanceUniqueID</Name>
<Value>$Config/TargetInstanceUniqueID$</Value>
</Parameter>
<Parameter>
<Name>targetInstanceObjectID</Name>
<Value>$Config/TargetInstanceObjectID$</Value>
</Parameter>
<Parameter>
<Name>storageClassName</Name>
<Value>$Config/StorageClassName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</ProbeAction>
</MemberModules>
<Composition>
<Node ID="Script">
<Node ID="PassThrough"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>System!System.PropertyBagData</OutputType>
<TriggerOnly>true</TriggerOnly>
</ProbeActionModuleType>