Execute Cluster Node Method

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

This Write Action executes actions in cluster nodes.

Element properties:

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

Member Modules:

ID Module Type TypeId RunAs 
WA WriteAction System.CommandExecuter Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
TimeoutSecondsint$Config/TimeoutSeconds$Timeout(sec)

Source Code:

<WriteActionModuleType ID="Microsoft.Windows.Cluster.Node.Action" Accessibility="Internal" RunAs="Cluster!Microsoft.Windows.Cluster.PrivilegedAccount" Batching="false">
<Configuration>
<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="System!System.CommandExecuter">
<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=ClusterNodeExecuteMethod.ps1
set vbscript=ClusterNodeExecuteMethod.js


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

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

"%ps%" -nologo -EP bypass -command "&amp; '%~dp0%psscript%'"
goto end

:end



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

function Check-CmdParams
{
if ([string]::IsNullOrEmpty($strComputer))
{
Write-Host "Node name is empty."
exit
}

if ([string] -ne $strComputer.getType())
{
Write-Host "Node name is empty."
exit

}

if ([string]::IsNullOrEmpty($MethodName))
{
Write-Host "Method name is empty."
exit
}

if ([string] -ne $MethodName.getType())
{
Write-Host "Method name is empty."
exit

}

if ("pause" -ne $MethodName -and "resume" -ne $MethodName)
{
Write-Host "[Error]: Unrecognized method $MethodName used"
exit
}

}


function Main()
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

Check-CmdParams
$useCim = CheckCmdLets

if ($null -eq $useCim)
{
Write-Host "Cannot get wmi cmdlets version."
return
}

$Node = Get-FcsNode -NodeName $strComputer -useCim $useCim

if ([string]::IsNullOrEmpty($Node))
{
if (0 -ne $error.Count)
{
$e = $error[0].Exception.Message
$e = "Details: $e"
}

Write-Host "Node name is empty. $e"
return
}

if ("pause" -eq $MethodName)
{
Pause-Node -Node $Node -useCim $useCim
return
}
elseif("resume" -eq $MethodName)
{
Resume-Node -Node $Node -useCim $useCim
return
}
}

function Get-FcsNode([string]$NodeName,$useCim)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$NodeName = Get-WmiEscapedName -Name $NodeName
$Filter = "Name ='$NodeName'"
$NameSpace = "root\mscluster"
$ClassName = "MSCluster_Node"
$Node = $null

if ([string]::IsNullOrEmpty($NodeName))
{
return $Node
}

$Node = WMIGetInstanceNoAbort -sNamespace $NameSpace -sClassName $ClassName -sFilter $Filter -useCim $useCim

if ($null -ne $Node -and $Node.Count -gt 1)
{
$Node = $Node[0]
}

return $Node
}

function Get-MsCsNode([string]$NodeName,$useCim)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$NodeName = Get-WmiEscapedName -Name $NodeName
$Filter = "SystemName ='$NodeName' and Name = 'Cluster Service'"
$NameSpace = "root\mscluster"
$ClassName = "MSCluster_Service"
$Node = $null

if ([string]::IsNullOrEmpty($NodeName))
{
return $Node
}

$Node = WMIGetInstanceNoAbort -sNamespace $NameSpace -sClassName $ClassName -sFilter $Filter -useCim $useCim

if ($null -ne $Node -and $Node.Count -gt 1)
{
$Node = $Node[0]
}

return $Node
}


function Pause-Node($Node,$useCim)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

if ($null -eq $Node)
{
return;
}

if (0 -ne $Node.State)
{
Write-Host "Node is not online."
return;
}

$flag = Check-WmiMethod -oObject $Node -MethodName "Pause" -useCim $useCim
$error.Clear()

if ($true -eq $flag)
{
if ($true -and $useCim)
{
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$result = invoke-CimMethod -CimSession $cimsession -InputObject $Node -MethodName "Pause"
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}
else
{
$Node.Pause();
}
}
else
{
$NodeLegacy = Get-MsCsNode -NodeName $Node.Name -useCim $useCim
If ($null -ne $NodeLegacy)
{
if ($true -and $useCim)
{
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$result = invoke-CimMethod -CimSession $cimsession -InputObject $NodeLegacy -MethodName "Pause"
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}
else
{
$NodeLegacy.Pause();
}
}
}

if (0 -ne $error.Count)
{
$mes = "Cannot pause Node. Error: " + $error[0].Exception.Message
}
else
{
$mes = "Node paused successfully."

}
Write-Host $mes

return
}

function Resume-Node($Node,$useCim)
{
if ($null -eq $Node)
{
return;
}

if (2 -ne $Node.State)
{
Write-Host "Node is not paused."
return;
}

if ($null -eq $Node)
{
return
}


$flag = Check-WmiMethod -oObject $Node -MethodName "Resume" -useCim $useCim
if ($true -eq $flag)
{
if ($true -and $useCim)
{
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$result = invoke-CimMethod -CimSession $cimsession -InputObject $Node -MethodName "Resume"
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}
else
{
$Node.Resume();
}
}
else
{
$NodeLegacy = Get-MsCsNode -NodeName $Node.Name -useCim $useCim
If ($null -ne $NodeLegacy)
{
if ($true -and $useCim)
{
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$result = invoke-CimMethod -CimSession $cimsession -InputObject $NodeLegacy -MethodName "Resume"
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}
else
{
$NodeLegacy.Resume();
}
}

}



if (0 -ne $error.Count)
{
$mes = "Cannot resume Node. Error: " + $error[0].Exception.Message
}
else
{
$mes = "Node resumed successfully."

}
Write-Host $mes

return

}

Function Get-WmiEscapedName([string]$Name)
{
$Name = ($Name -replace "\\", "\\") -replace "'","\'"

return $Name
}

function Check-WmiMethod($oObject,[string]$MethodName,$useCim) #As Boolean
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$method = $null

if ($null -eq $oObject)
{
return $method
}

if($false -eq $useCim)
{
$method = $oObject | Get-Member -Name $MethodName -MemberType Method
}
else
{
$methods = $oObject.CimClass.CimClassMethods
if($null -ne $methods)
{
$method = $methods[$MethodName]
}
}

$result = ($null -ne $method -and 0 -eq $error.Count )

return $result;
}

Function CheckCimModule()
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$retval = $false
$cim = Get-Module -Name CimCmdlets

########Check for powershell 1.0
if ($error.Count -ne 0)
{
if ($null -eq $error[0].Exception)
{
return $retval
}

$type = $error[0].Exception.GetType()
if ([System.Management.Automation.CommandNotFoundException] -eq $type)
{
return $retval
}

$error.Clear()
}

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

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

return $retval
}

function CheckCmdLets()
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$retval = $false
$objSWbemObjectSet =$null

if (CheckCimModule)
{
Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$objSWbemObjectSet = Get-CimInstance -CimSession $cimsession -Class Win32_OperatingSystem
}
catch
{
$objSWbemObjectSet = Get-WMIObject -Class Win32_OperatingSystem
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
if ($error.Count -eq 0)
{
$retval = $true
}
}

$error.Clear()
return $retval;
}

Function WMIGetInstanceNoAbort
{
param (
[string]$ComputerName,
[string]$sNamespace,
[string]$sClassName,
[string]$sFilter,
[bool] $useCim
)

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

$KerberosErrorCode = 2147943712
$ConnectionErrorCode = 2147942453
$WmiConnectErrorCode = -2147023174

if ([string]::IsNullOrEmpty($ComputerName))
{
$ComputerName = "."
}

if ([string]::IsNullOrEmpty($sNamespace))
{
$sNamespace = "root\cimv2"
}

if ($true -eq $useCim)
{
$oInstance = $null
if ([string]::IsNullOrEmpty($sFilter))
{
Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -ComputerName $ComputerName -SessionOption $cimSessionOption
$oInstance = Get-CimInstance -CimSession $cimsession -Namespace $sNamespace -ClassName $sClassName
}
catch
{
$oInstance = Get-WMIObject -Namespace $sNamespace -ClassName $sClassName -ComputerName $ComputerName
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
if ($error.Count -ne 0)
{
$ErrorCode = $error[0].Exception.ErrorData.Error_code
If ($KerberosErrorCode -eq $ErrorCode -or $ConnectionErrorCode -eq $ErrorCode)
{
$error.Clear()
Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$oInstance = Get-CimInstance -CimSession $cimsession -Namespace $sNamespace -ClassName $sClassName
}
catch
{
$oInstance = Get-WMIObject -Namespace $sNamespace -ClassName $sClassName
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}
}
}
else
{

Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -ComputerName $ComputerName -SessionOption $cimSessionOption
$oInstance = Get-CimInstance -CimSession $cimsession -Namespace $sNamespace -ClassName $sClassName -Filter $sFilter
}
catch
{
$oInstance = Get-WMIObject -Namespace $sNamespace -ClassName $sClassName -ComputerName $ComputerName -Filter $sFilter
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}

if ($error.Count -ne 0)
{
$ErrorCode = $error[0].Exception.ErrorData.Error_code
If ($KerberosErrorCode -eq $ErrorCode -or $ConnectionErrorCode -eq $ErrorCode)
{
$error.Clear()
Load-CimModules
try
{
$cimSessionOption = New-CimSessionOption -Protocol DCOM
$cimsession = New-CimSession -SessionOption $cimSessionOption
$oInstance = Get-CimInstance -CimSession $cimsession -Namespace $sNamespace -ClassName $sClassName -Filter $sFilter
}
catch
{
$oInstance = Get-WMIObject -Namespace $sNamespace -ClassName $sClassName -Filter $sFilter
}
Finally
{
Get-CimSession | Remove-CimSession
$cimsession =$null
$cimSessionOption = $null
}
}
}

}
}
else
{
$oInstance = $null
if ([string]::IsNullOrEmpty($sFilter))
{
$oInstance = Get-WmiObject -Class $sClassName -Namespace $sNamespace -ComputerName $ComputerName
if ($error.Count -ne 0)
{
$ErrorCode = $error[0].Exception.ErrorCode
If ($WmiConnectErrorCode -eq $ErrorCode)
{
$error.Clear()
$oInstance = Get-WmiObject -Class $sClassName -Namespace $sNamespace
}
}
}
else
{
$oInstance = Get-WmiObject -Class $sClassName -Namespace $sNamespace -Filter $sFilter -ComputerName $ComputerName
if ($error.Count -ne 0)
{
$ErrorCode = $error[0].Exception.ErrorCode
If ($WmiConnectErrorCode -eq $ErrorCode)
{
$error.Clear()
$oInstance = Get-WmiObject -Class $sClassName -Namespace $sNamespace -Filter $sFilter
}
}

}
}

return $oInstance
}

Function Get-ScriptParams([string]$fullscriptname, [ref]$strComputer, [ref]$MethodName)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$params = Get-CmdParams -fullname $fullscriptname -MaxCount 2

if ($null -eq $params -or 0 -eq $params.Count)
{
return
}

if ($null -eq $params.Count -or 1 -eq $params.Count)
{
if ($null -ne $strComputer) { $strComputer.Value = $params }
return
}

if ($params.Count -gt 1 )
{
if ($null -ne $strComputer) { $strComputer.Value = $params[0] }
if ($null -ne $MethodName) { $MethodName.Value = $params[1] }
}

return
}

function Get-CmdFilename([string]$fullname)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

$fileparam = "psparams.txt"
$fullnameparams = ".\$fileparam"
$fullparams = [System.IO.Path]::GetFullPath($fullnameparams)
if (0 -ne $error.Count)
{
$error.Clear()
$fullparams = $fullnameparams
}

if ($false -eq [string]::IsNullOrEmpty($fullname))
{
$error.Clear()
$fullnameparams = [System.IO.Path]::GetDirectoryName($fullname)
if (0 -eq $error.Count)
{
$fullpath = [System.IO.Path]::Combine($fullnameparams,$fileparam)
if (0 -ne $error.Count)
{
$error.Clear()
$fullpath = $fullnameparams + "\" + $fileparam
}

$fullparams = $fullpath
}
}

$error.Clear()
$IsFlag = $null
$IsFlag = [System.IO.File]::Exists($fullparams)

if ($null -eq $IsFlag)
{
$error.Clear()
return $null
}

if ($false -eq $IsFlag )
{
$fullparams = $null
}

$error.Clear()

return $fullparams
}

Function Parse-Params([string]$Value)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

if ([string]::IsNullOrEmpty($Value))
{
return null
}

$i = $Value.IndexOf("=")
if (-1 -eq $i) { return $null; }

$i++;

$result = ""

if ($i -le $Value.Length )
{
$result = $Value.Substring($i)
}

return $result
}

Function Get-CmdParams([string]$fullname,[int]$MaxCount=0)
{
$ErrorActionPreference = 'SilentlyContinue' # Scoped only to function
$error.Clear()

if ($MaxCount -lt 0)
{
$MaxCount = 0
}

$filename = Get-CmdFilename -fullname $fullname

if ($null -eq $filename)
{
return $null
}

$ap = Get-Content -Path $filename -Force

if (0 -ne $error.Count)
{
return $null
}

if (0 -eq $ap.Length)
{
return $null
}

$result = @()
$i = 0
foreach($d in $ap)
{
$p = Parse-Params -Value $d
if ($null -ne $p)
{
$i++
if ($i -gt $MaxCount -and 0 -ne $MaxCount) { break; }
$result += $p
}
}

return $result
}


$strComputer = ""
$MethodName = ""
$fullscriptname = $MyInvocation.MyCommand.Definition

Get-ScriptParams -fullscriptname $fullscriptname -strComputer ([ref] $strComputer) -MethodName ([ref] $MethodName)
Main

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>ClusterNodeExecuteMethod.js</Name>
<Contents><Script>//Copyright (c) Microsoft Corporation. All rights reserved.

function alert($message) {
WScript.Echo($message);
}

function exit($message) {
alert($message);
WScript.Quit(0);
}

String.prototype.trim = function () {
return this.replace(/^\s+|\s+$/gm, '');
}

String.prototype.replaceAll = function (str1, str2, ignore) {
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\&lt;\&gt;\-\&amp;])/g, "\\$&amp;"), (ignore ? "gi" : "g")), (typeof (str2) == "string") ? str2.replace(/\$/g, "$$$$") : str2);
}

function GetErrorDetails($e) {
if (!($e instanceof Error)) { return; }

if ($e.number &lt; 0) {
$e.number = 0xffffffff + $e.number + 1;
}

return " Error details: Error code: 0x" + $e.number.toString(16) + ". Description : " + $e.description;
}

function getEscapedName($Name) {
return $Name.replaceAll("\\", "\\\\").replaceAll("'", "\\'");
}

function getClusterService($NodeName) {
$wmiPath = "winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\\\" + $NodeName + "\\root\\mscluster";
var Service = null;
var $message = "";

try {
Service = GetObject($wmiPath);
}
catch (e) {
$message = GetErrorDetails(e);
$message = "Cannot connect to Cluster Namespace. " + $message;
exit($message);
}

return Service;
}

function GetWmiQuery($query, $Service, $message, $IsA) {
var $coll = null;
var $iterator = null;
var $Count = null;
var $Message = null;

try {
$coll = $Service.ExecQuery($query);
$Count = $coll.Count;
if (0 !== $Count) {
$iterator = new Enumerator($coll);
}
}
catch (e) {
$iterator = undefined;
if (!$IsA) {
$Message = GetErrorDetails(e);
$Message = $message + "\n" + $Message;
alert($Message);
}
}
finally {
delete $coll;
$coll = null;
}

return $iterator;

}

function getCmdFileName() {
var $f = WScript.ScriptName;
var $p = WScript.ScriptFullName;
var $nf = "";

if (undefined === $f || null === $f || "string" !== typeof ($f)) { return null; }
if (undefined === $p || null === $p || "string" !== typeof ($p)) { return null; }
if (0 === $f.length || 0 === $p.length || $p.length &lt;= $f.length) { return null; }

return $p.substring(0, $p.length - $f.length) + "vbparams.txt";
}

function parseCmd($s,$d)
{
if ("string" !== typeof ($s) || undefined === $s || null === $s ) { return null; }
if ("string" !== typeof ($d) || undefined === $d || null === $d || 0 === $d.length) { $d = "="; }

var $l = $s.length;
var $i = -1;

if (0 === $l) { return null; }

$i = $s.indexOf($d, 0)

if (-1 === $i) { return null; }

$i += $d.length;

return $l &lt;= $i ? "" : $s.slice($i,$l);
}


function getCmdParams($MaxParams) {
var $fso = null;
var $fl = null;
var $filename = getCmdFileName();
var $args = [];
var $i = 0;
var $v = null;
if (null === $filename) { return $args; }
if (undefined === $MaxParams || null === $MaxParams || "number" !== typeof ($MaxParams)) { $MaxParams = 0; }

try {
$fso = new ActiveXObject("Scripting.FileSystemObject");
if (!$fso.FileExists($filename)) { return $args; }
$fl = $fso.OpenTextFile($filename,1,false,-1);
if (null === $fl || undefined === $fl) { return null; }
$i = 0;
for (; !$fl.AtEndOfStream;) {
$v = parseCmd($fl.ReadLine(), "=");
if (null !== $v) {
$i++;
if ($i &gt; $MaxParams &amp;&amp; 0 !== $MaxParams) { break; }
$args.push($v);
}

}
} catch (e) {
$args = null;
alert("Cannot read command line parameters.");
}
finally {
if (null !== $fl &amp;&amp; 0 !== $i) { $fl.Close(); }
}

return $args;
}

function getParams()
{
//Copyright (c) Microsoft Corporation. All rights reserved.

var $args = getCmdParams(2);

if (null === $args) { exit(""); }

if ($args.length &lt; 2) {
exit("Wrong number of arguments.");
}

var $p = { srv: "", m: "" ,isp:false,isr:false};
var $m = "";

$p.srv = $args[0];
$p.m = $args[1];

if (0 === $p.srv.trim()) {
exit("Node name is empty.");
}

if (0 === $p.m.trim()) {
exit("Method name is empty.");
}

$m = $p.m.toLowerCase();

$p.isp = "pause" === $m;
$p.isr = "resume" === $m;


if (! $p.isp &amp;&amp; !$p.isr) {
exit("[Error]: Unrecognized method " + $m + " used");
}

return $p;

}

function getNode($n,$Service)
{
if (undefined === $n || null === $n || "string" !== typeof ($n)) { return $undefined; }
if (undefined === $Service || null === $Service || "object" !== typeof ($Service)) { return $undefined; }

var $query = "select Name, State from MSCLuster_Node where Name ='" + getEscapedName($n) + "'";
var $it = GetWmiQuery($query, $Service, "Cannot get node from wmi. ");

if (undefined === $it || null === $it) { return undefined;}
$it = $it.item();
if (undefined === $it || null === $it) { $it = undefined; }

return $it;
}

function getNodeLegacy($n, $Service) {
if (undefined === $n || null === $n || "string" !== typeof ($n)) { return $undefined; }
if (undefined === $Service || null === $Service || "object" !== typeof ($Service)) { return $undefined; }

var $query = "select Name from MSCLuster_Service where Name ='ClusterService' and SystemName ='" + getEscapedName($n) + "'";
var $it = GetWmiQuery($query, $Service, "Cannot get node from wmi. ");

if (undefined === $it || null === $it) { return undefined; }
$it = $it.item();
if (undefined === $it || null === $it) { $it = undefined; }

return $it;
}

function checkWmiMethod($Object, $MethodName) {
if (null === $Object || undefined === $Object || null === $MethodName || undefined === $MethodName || "object" !== typeof ($Object)) {
return false;
}

var $methods = null;
var $result = true;
$methods = $Object.Methods_;

if (null === $methods || undefined === $methods || "object" !== typeof ($methods)) { delete $methods; $methods = null; return false; }
if (0 === $methods.Count || null === $methods.Count) { delete $methods; $methods = null; return false; }

try {
$methods.Item($MethodName);
} catch (e) {
$result = false;
}

delete $methods;
$methods = null;

return $result;
}

function pauseNodeLegacy($Node,$Service,$m)
{
var $ns = getNodeLegacy($Node.Name, $Service);
if (undefined === $ns) { alert("\nCannot get Node object."); return; }
var $isp = checkWmiMethod($ns, $m);

if (false === $isp) {alert("\nCannot " +$m + " node."); return -1;}

$ns.ExecMethod_($m);

return 0;
}

function pauseNode($Node,$Service,$isr)
{
if (undefined === $Node || null === $Node || "object" !== typeof ($Node)) { return ; }
if ("number" !== typeof ($Node.State)) { alert("\nCannot get node state."); return; }
var $state = $Node.State;
var $m = true === $isr ? "resume" : "pause";
var $mes = "\nCannot " +$m + " node.";

if (!$isr)
{
if (0 !== $state) { alert("\nNode is not online."); return; }
}
else
{
if (2 !== $state) { alert("\nNode is not paused."); return; }

}

var $isp = checkWmiMethod($Node, $m);

try {
if (true === $isp) {
$Node.ExecMethod_($m);

}
else
{
if (-1 === pauseNodeLegacy($Node, $Service, $m)) { $mes = "";}
}

if (0 !== $mes.length)
{
$mes = "\nNode " + $Node.Name + " " + $m + "d successfully.";
}


} catch (e) {
$mes = $mes + "\n" + GetErrorDetails(e);
}

alert($mes);

}

function Main() {
var $p = getParams();
var $Service = getClusterService(".");
var $Node = getNode($p.srv, $Service);
var $Sta

if (undefined === $Node) {delete $Service; $Service = null; exit("Cannot find node " + $p.srv + " ."); }
if (true === $p.isp)
{
pauseNode($Node, $Service);
delete $Service;
$Service = null;
return;
}

if (true === $p.isr) {
pauseNode($Node, $Service,true);
delete $Service;
$Service = null;
return;
}

}

Main();</Script></Contents>
<Unicode>true</Unicode>
</File>
<File>
<Name>vbparams.txt</Name>
<Contents><Script>

=$Target/Property[Type='ClusLibrary!Microsoft.Windows.Cluster.Node']/NodeName$
=$Config/MethodName$

</Script></Contents>
<Unicode>true</Unicode>
</File>
<File>
<Name>psparams.txt</Name>
<Contents><Script>

=$Target/Property[Type='ClusLibrary!Microsoft.Windows.Cluster.Node']/NodeName$
=$Config/MethodName$

</Script></Contents>
<Unicode>true</Unicode>
</File>
</Files>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="WA"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>