クラスター リソース グループ メソッドの実行

Microsoft.Windows.Cluster.Group.Action (WriteActionModuleType)

この書き込みアクションは、Windows クラスター グループで操作を実行します。

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.Windows.Cluster.PrivilegedAccount
InputTypeSystem.BaseData

Member Modules:

ID Module Type TypeId RunAs 
WA WriteAction Microsoft.Windows.PowerShellWriteAction Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
TimeoutSecondsint$Config/TimeoutSeconds$タイムアウト (秒)

Source Code:

<WriteActionModuleType ID="Microsoft.Windows.Cluster.Group.Action" Accessibility="Internal" RunAs="Cluster!Microsoft.Windows.Cluster.PrivilegedAccount" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="NodeName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="GroupName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="MethodName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<WriteAction ID="WA" TypeID="Windows!Microsoft.Windows.PowerShellWriteAction">
<ScriptName>ClusterGroupMethod.ps1</ScriptName>
<ScriptBody><Script>param($NodeName, $GroupName, $MethodName, $timeoutInSeconds)
#==========================================================================
# FUNCTIONS
#==========================================================================

function MainFun()
{
write-host "[Trace]: " + "Started at machine local time: " + (get-date).ToString()

$e = $null
$Service = $null
try{
if($Is_OS_More_Than_2012)
{
try{
$Service = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_ResourceGroup" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
$Service = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_ResourceGroup" -ErrorVariable ProcessError -ErrorAction Stop
}
}else{
$Service = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_ResourceGroup" -ErrorVariable ProcessError -ErrorAction Stop
}
}catch{
$e = $_.Exception.Message
}

If(($Service -eq $null) -or ($ProcessError -ne $null))
{
ThrowScriptError "Unable to connect." $e
}
$oGroup = $null
try{
if($Is_OS_More_Than_2012)
{
try{
$oGroup = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
$oGroup = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else{
$oGroup = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}
}catch{
$e = $_.Exception.Message
}

If(($oGroup -eq $null) -or ($ProcessError -ne $null))
{
ThrowScriptError "The Query returned an invalid result set. Please check to see if this is a valid WMI Query." $e
}


ForEach($oRealGroup in $oGroup)
{
switch($MethodName)
{

"Delete"{
DeleteGroup($oRealGroup)
break;
}
"Move"{
MoveToNextNode($oRealGroup)
break;
}
"Online" {
$ResourceGroupState = ConvertNumericResourceGroupStateToString $oRealGroup.State
Write-Host "The state of the " $oRealGroup.Name " resource group is " $ResourceGroupState
Write-Host "Attempting to bring the resource group online"
if($Is_OS_More_Than_2012)
{
try{
invoke-CimMethod -InputObject $oRealGroup -MethodName BringOnline &#x2013;Arguments @{ TimeOut = $timeoutInSeconds }
$oGroup = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
invoke-CimMethod -InputObject $oRealGroup -MethodName BringOnline &#x2013;Arguments @{ TimeOut = $timeoutInSeconds }
$oGroup = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else
{
$oRealGroup.BringOnline($timeoutInSeconds)
$oGroup = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}
$ResourceGroupState = ConvertNumericResourceGroupStateToString $oGroup.State
Write-Host "The state of the " $oRealGroup.Name " resource group is " $ResourceGroupState
break;
}
"Offline"{
$ResourceGroupState = ConvertNumericResourceGroupStateToString $oRealGroup.State
Write-Host "The state of the " $oRealGroup.Name " resource group is " $ResourceGroupState
Write-Host "Attempting to take the resource group offline"
if($Is_OS_More_Than_2012)
{
try{
invoke-CimMethod -InputObject $oRealGroup -MethodName TakeOffline &#x2013;Arguments @{ TimeOut = $timeoutInSeconds }
$oGroup = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
invoke-CimMethod -InputObject $oRealGroup -MethodName TakeOffline &#x2013;Arguments @{ TimeOut = $timeoutInSeconds }
$oGroup = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else
{
$oRealGroup.TakeOffline($timeoutInSeconds)
$oGroup = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_ResourceGroup where Name = ""$GroupName""" -ErrorVariable ProcessError -ErrorAction Stop
}
$ResourceGroupState = ConvertNumericResourceGroupStateToString $oGroup.State
Write-Host "The state of the " $oRealGroup.Name " resource group is " $ResourceGroupState
break;
}default{
write-host "[Error]: " "Unrecognized method " $MethodName " used"
}

}

}

write-host "`n[Trace]: " "Finished at machine local time: " (get-date).ToString()
}

Function ConvertNumericResourceGroupStateToString($state)
{
$textualState

switch($state){
0{
$textualState = "Online"
break;
}
1{
$textualState = "Offline"
break;
}
2 {
$textualState = "Failed"
break;
}3{
$textualState = "Partial Online"
break;
}4{
$textualState = "Pending"
break;
default{
$textualState = "Unknown"
}
}
}
return $textualState;
}


function DeleteGroup (
$oGroup
){
$oGroupName = $oGroup.Name
$e = $null

$DoLoop = $true

While($DoLoop)
{
$oResources = $null
try
{
if($Is_OS_More_Than_2012)
{
try{
$oResources = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select GroupComponent, PartComponent from MSCluster_ResourceGroupToResource where GroupComponent = ""MSCluster_ResourceGroup.Name=\""$oGroupName\""""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
$oResources = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select GroupComponent, PartComponent from MSCluster_ResourceGroupToResource where GroupComponent = ""MSCluster_ResourceGroup.Name=\""$oGroupName\""""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else
{
$oResources = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select GroupComponent, PartComponent from MSCluster_ResourceGroupToResource where GroupComponent = ""MSCluster_ResourceGroup.Name=\""$oGroupName\""""" -ErrorVariable ProcessError -ErrorAction Stop
}
}catch{
$e.Save = $_.Exception.Message
}

If($e -ne $null){
ThrowScriptError "The Query for resources returned an error. Please check to see if this is a valid WMI Query." $e
}


If(($oResources -eq $null) -or ($oResources.Count -eq 0)){

write-host "[Trace]: " "No more resources in group " $oGroupName

$DoLoop = $false
}Else{

write-host "[Trace]: " $oResources.Count " resources in group " $oGroupName

ForEach($oResource in $oResources)
{
write-host $oResource.PartComponent
$oRes = $oResource.PartComponent.ToString()
If($oRes -eq $null){
break;
}
$oRes = $oRes.Substring($oRes.IndexOf("`"")+1)
$oRes = $oRes.Substring(0, $oRes.IndexOf("`""))
$oResName = $oRes
write-host $oRes
$oDepResources = $null
try
{
if($Is_OS_More_Than_2012)
{
try{
$oDepResources = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Antecedent, Dependent from MSCluster_ResourceToDependentResource where Dependent =""MSCluster_Resource.Name=\""$oRes\""""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
$oDepResources = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Antecedent, Dependent from MSCluster_ResourceToDependentResource where Dependent =""MSCluster_Resource.Name=\""$oRes\""""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else
{
$oDepResources = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Antecedent, Dependent from MSCluster_ResourceToDependentResource where Dependent =""MSCluster_Resource.Name=\""$oRes\""""" -ErrorVariable ProcessError -ErrorAction Stop
}
}catch{
$e = $_.Exception.Message
}

If($e -ne $null){
ThrowScriptError "The Query for dependent resources returned an error. Please check to see if this is a valid WMI Query." $e
}


If(($oDepResources -eq $null) -or ($oDepResources -eq "")){
DeleteResource($oResName)
}

}

}

}


try
{
if($Is_OS_More_Than_2012)
{
invoke-CimMethod -InputObject $oGroup -MethodName DeleteGroup -ErrorAction Stop
}else{
$oGroup.DeleteGroup
}
}catch{
$e = $_.Exception.Message
}
If($e -ne $null){
ThrowScriptError "Unable to delete resource group." $e
}
}

function DeleteResource (
$oResName
){

$query = "select * from MSCluster_Resource where Name = ""$oResName"""
$oRes = $null
if($Is_OS_More_Than_2012)
{
try{
$oRes = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query $query -ErrorVariable ProcessError
}catch{
import-module cimcmdlets
$oRes = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query $query -ErrorVariable ProcessError
}
}else
{
$oRes = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select * from MSCluster_Resource where Name = $oResName" -ErrorVariable ProcessError
}
$e = $null

If($oRes.State -ne 4)
{
try
{
if($Is_OS_More_Than_2012)
{
try{
$clusProp = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_Property" -ErrorAction Stop -ErrorVariable ProcessError
}catch{
import-module cimcmdlets
$clusProp = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_Property" -ErrorAction Stop -ErrorVariable ProcessError
}
invoke-CimMethod -InputObject $oRes -MethodName TakeOffline &#x2013;Arguments @{ TimeOut = 32; Parameters = $clusProp}
}else
{
$clusProp = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_Property" -ErrorAction Stop -ErrorVariable ProcessError
$oRes.TakeOffline(32, $clusProp)
}

}catch{
$e = $_.Exception.Message
}
If($e -ne $null)
{
$message = "Unable to take resource " + $oRes.Name + " offline."
ThrowScriptError $message $e
}
}


try
{
$oRes.Delete

}catch{
$e = $_.Exception.message
}
If($e -ne $null)
{
$message = "Unable to delete resource " + $oRes.Name + "."
ThrowScriptError $message $e
}
}

function MoveToNextNode (
$oGroup
){

$e = $null
$oGroupName = $oGroup.Name
$oActiveNode
$oService
if($Is_OS_More_Than_2012)
{
try{
$oService = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_NodeToActiveGroup"
}catch{
import-module cimcmdlets
$oService = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_NodeToActiveGroup"
}
}else
{
$oService = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Class "MSCluster_NodeToActiveGroup"
}
try
{
if($Is_OS_More_Than_2012)
{
try{
$oActiveNode = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select GroupComponent, PartComponent from MSCluster_NodeToActiveGroup where PartComponent = ""MSCluster_ResourceGroup.Name=\""$oGroupName\""""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
$oActiveNode = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select GroupComponent, PartComponent from MSCluster_NodeToActiveGroup where PartComponent = ""MSCluster_ResourceGroup.Name=\""$oGroupName\""""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else
{
$oActiveNode = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select GroupComponent, PartComponent from MSCluster_NodeToActiveGroup where PartComponent = ""MSCluster_ResourceGroup.Name=\""$oGroupName\""""" -ErrorVariable ProcessError -ErrorAction Stop
}

}catch{
$e = $_.Exception.Message
}
If(($oActiveNode -eq $null) -or ($e -ne $null)){
ThrowScriptError "The Query for active node returned an invalid result set. Please check to see if this is a valid WMI Query." $e
}

$newNodeName = $NodeName

If($oActiveNode -ne $null)
{
ForEach($oNode in $oActiveNode)
{
$oActive = ""
try
{
$oActive = $oNode.GroupComponent.ToString()
$oActive = $oActive.Substring($oActive.IndexOf("`"")).Replace("`"","").Replace(")", "")
}catch{
$e = $_.Exception.Message
}

If(($oActive -eq $null) -or ($oActive -eq ""))
{
break
}
If($e -ne $null){
ThrowScriptError "Did not get a Node. Please check to see if this is a valid WMI Query." $e
}

$oNodes = $null
try
{
if($Is_OS_More_Than_2012)
{
try{
$oNodes = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_Node where Name != ""$oActive""" -ErrorVariable ProcessError -ErrorAction Stop
}catch{
import-module cimcmdlets
$oNodes = Get-CimInstance -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_Node where Name != ""$oActive""" -ErrorVariable ProcessError -ErrorAction Stop
}
}else
{
$oNodes = Get-WmiObject -Computer $NodeName -NameSpace 'root\mscluster' -Query "select Name, State from MSCluster_Node where Name != ""$oActive""" -ErrorVariable ProcessError -ErrorAction Stop
}
}catch{
$e = $_.Exception.Message
}

If(($oNodes -eq $null) -or ($e -ne $null)){
ThrowScriptError "The Query for nodes returned an invalid result set. Please check to see if this is a valid WMI Query." $e
}


ForEach($oNextNode in $oNodes)
{

# only move when node is online
If($oNextNode.State -eq 0)
{
$newNodeName = $oNextNode.Name

write-host "[Trace]: " "Trying to move group " $oGroupName " to node " $newNodeName
try
{
if($Is_OS_More_Than_2012)
{
invoke-CimMethod -InputObject $oGroup -MethodName MoveToNewNode &#x2013;Arguments @{ NodeName = $newNodeName;TimeOut=767 }
}else
{
$oGroup.value.MoveToNewNode($newNodeName, 767)
}
}catch{
$e = $_.Exception.Message
}
If(($oNodes -eq $null) -or ($e -ne $null))
{
ThrowScriptError "Move to new node failed." $e
}

return
}
}

break
}
}

$message = "Unable to move group " +$oGroupName + " as there are no online nodes."
ThrowScriptError $message -1
}

function ThrowScriptErrorNoAbort($sMessage, $oErrDes)
{
$message = $sMessage + "`n" + $oErrDes
LogMessage $DBG_ERROR $message
}

function ThrowScriptError($sMessage, $oErrDes)
{
ThrowScriptErrorNoAbort $sMessage $oErrDes
Quit
}

function Quit()
{
LogMessage $DBG_ERROR "Terminated on error!"
Exit -1
}

$DBG_NONE = 1
$DBG_ERROR = 2
$DBG_WARNING = 3
$DBG_TRACE = 4
$m_nDebugLevel = $DBG_ERROR

#======================================================================
# 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)
{
if($nLevel -ge $m_nDebugLevel)
{
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;
}
}
}

function CheckByOSCurrentVersion() #As Boolean
{
$strCurrentOSVer = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
$strCurrentOSVer = $strCurrentOSVer.CurrentVersion
if($strCurrentOSVer -ge $WIN_OS_2012_Ver)
{
return $true;
}
return $false;
}

#Copyright (c) Microsoft Corporation. All rights reserved.
$m_nDebugLevel = $DBG_NONE


$WIN_OS_2012_Ver = "6.2"
$Is_OS_More_Than_2012 = CheckByOSCurrentVersion

#==========================================================================
# Main
#==========================================================================

MainFun
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>NodeName</Name>
<Value>$Config/NodeName$</Value>
</Parameter>
<Parameter>
<Name>GroupName</Name>
<Value>$Config/GroupName$</Value>
</Parameter>
<Parameter>
<Name>MethodName</Name>
<Value>$Config/MethodName$</Value>
</Parameter>
<Parameter>
<Name>timeoutInSeconds</Name>
<Value>$Config/TimeoutSeconds$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<StrictErrorHandling>true</StrictErrorHandling>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="WA"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>