The following scripting example shows how to set the MPIO Load Balancing policy via a script calling WMI:
Just to expand on the information below,
'-----------------------------------------------------------------------------
'
' SET_LBP.vbs
' WScript which can be used to change MPIO Load Balance Policies on Windows 2008
' USAGE:
' SET_LBP.vbs <FOO | RR | RRwS | LQD | WP>
' Change to FOO: SET_LBP.vbs FOO
' Change to RR: SET_LBP.vbs RR
' Change to RRwS: SET_LBP.vbs RRwS
' Change to LQD: SET_LBP.vbs LQD
' Change to WP: SET_LBP.vbs WP
' Return value:
' Success: 0
' Failure: -1
' Function returning ALUA or nonALUA flag
Function aluaflag(theInstance)
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\WMI")
Set objShare = objWMIService.Get("DSM_QueryLBPolicy_V2.InstanceName=" & _
"'"&theInstance&"'")
For Each objDsmPath in objShare.LoadBalancePolicy.DSM_Paths
aluaflag = objDsmPath.ALUASupport
Exit for
Next
End Function
Dim Usage
Usage = "USAGE:" & vbCrLf & _
" SET_LBP.vbs <FOO | RR | RRwS | LQD | WP>" & vbCrLf
' Make sure we have the correct number of arguments.
If ( WScript.Arguments.Count <>1 ) Then
WScript.StdOut.Write Usage
WScript.Quit -1
End If
' Extract the arguments.
Dim bFlag, BOOL, LBP, LBPath, LBPolicy, foo, rr, rrws, lqd, wp
Dim fooValue, rrValue, rrwsValue, lqdValue, wpValue
LBP = WScript.Arguments(0): foo = "FOO" : rr = "RR" : rrws = "RRwS" : lqd = "LQD" : wp = "WP"
fooValue = StrComp(LBP, foo, 1)
rrValue = StrComp(LBP, rr, 1)
rrwsValue = StrComp(LBP, rrws, 1)
lqdValue = StrComp(LBP, lqd, 1)
wpValue = StrComp(LBP, wp, 1)
' ----------FOO---------
If ( 0 = fooValue) Then
LBPolicy = 1
' ----------RR---------
If ( 0 = rrValue ) Then
LBPolicy = 2
' ----------RRwS---------
If ( 0 = rrwsValue ) Then
LBPolicy = 3
' ----------LQD---------
If ( 0 = lqdValue ) Then
LBPolicy = 4
' ----------WP---------
If ( 0 = wpValue ) Then
LBPolicy = 5
If ( Err.Number = 0 ) Then
' Locate device
Set colSWbemObjectSet = objWMIService.InstancesOf("DSM_QueryLBPolicy_V2")
' Loop through all devices
For Each objSWbemObject In colSWbemObjectSet
' Set the boolean flag to FALSE
BOOL = 0
WScript.StdOut.Write "InstanceName= "& objSWbemObject.InstanceName & vbCrLf
' Flag for ALUA LUN
bFlag = aluaflag(objSWbemObject.InstanceName)
' If ALUA=True and LBPolicy=RoundRobin, don't apply the change
Do
if LBPolicy = 2 Then
if bFlag > 0 Then Exit Do:
End if
' Set boolean flag to TRUE if ALUA
if bFlag > 0 Then
BOOL = 1
'Assign each WbemObject to LBPolicy object
Set objLBPolicy = objSWbemObject
' Obtain an instance of the the class using a key property value.
Set objShare = objWMIService.Get("DSM_LB_Operations.InstanceName=" & _
"'"&objSWbemObject.InstanceName&"'")
' Obtain an InParameters object specific to the method we are going to call.
Set objInParam = objShare.Methods_("DsmSetLoadBalancePolicyALUA").inParameters.SpawnInstance_()
' set to user-defined LB Policy
objLBPolicy.LoadBalancePolicy.LoadBalancePolicy = LBPolicy
Dim count
count = 0
' If LB Policy is set to FOO
' If it is the 1st path, Set to A/O
' If is is not the 1st Path, Set to A/U if ALUA or S/B if not ALUA
' else LB Policy is set to other than FOO
' If It is ALUA
' If TargetPortGroup State is A/O
' Set the associated paths to A/O
' If TargetPortGroup State is A/U
' Set the associated paths to A/U
' else It is not ALUA
' Set all paths to A/O
For Each objDSMPath In objLBPolicy.LoadBalancePolicy.DSM_Paths
if LBPolicy = 1 Then
if count = 0 Then
objDSMPath.PrimaryPath = 1
else
if BOOL = 1 Then
objDSMPath.OptimizedPath = 0
objDSMPath.OptimizedPath = 1
objDSMPath.PrimaryPath = 0
if objDSMPath.TargetPortGroup_State = 0 Then
count = count + 1
objInParam.Properties_.item("LoadBalancePolicy") = objLBPolicy.LoadBalancePolicy
WScript.StdOut.Write "DSM_LB_Operations.InstanceName=" & "'"& _
objSWbemObject.InstanceName & "'" & vbCrLf & vbCrLf
Set objOutParams = objWMIService.ExecMethod("DSM_LB_Operations.InstanceName=" & _
"'"&objSWbemObject.InstanceName&"'","DsmSetLoadBalancePolicyALUA", objInParam)
Loop Until True:
If (LBPolicy = 5) Then
WScript.StdOut.Write "LB Policy has successfully changed to WP" & vbCrLf
If (LBPolicy = 4) Then
WScript.StdOut.Write "LB Policy has successfully changed to LQD" & vbCrLf
If (LBPolicy = 3) Then
WScript.StdOut.Write "LB Policy has successfully changed to RRwS" & vbCrLf
If (LBPolicy = 2) Then
If(BOOL = 0) Then
WScript.StdOut.Write vbCrLf & "Found no applicable device for RR" & vbCrLf
WScript.StdOut.Write "LB Policy has successfully changed to RR" & vbCrLf
If (LBPolicy = 1) Then
WScript.StdOut.Write "LB Policy has successfully changed to FOO" & vbCrLf
WScript.Quit 0
Else
' Something went wrong.
WScript.StdOut.Write "Failed to change LB Policy" & Err.Description & vbCrLf
------------------------