I watch the forums at BrianMadden.com because I use Powershell a lot for Citrix. This question was brought up.
Q: How could one:
- query “server load” on all servers part of the farm
- extract all server under a minimum server load
- apply an “Offline” load evaluator on the extracted servers (in order to make them unavailable on the farm)
I posted a script to do what they wanted, but then I got to thinking… while it did achieve the goal it wasn’t very Powershellish.
As I have said over and over. The glory of Powershell is the objects. So I decided to Post this entry showing what I would consider the Powershell way 
Ideally you should just do this at the prompt
PS> Get-CitrixServers | where{$_.WinServerObject.Serverload -lt $load} | Set-CitrixLoadEvalutor “OffLine”
This is easy to achieve with the following scripts or even better make them functions!
Get-CitrixServers
-
param($Server)
-
$type =
[System.
Type]::
GetTypeFromProgID("MetaframeCOM.MetaframeFarm",
$Server)
-
$mfarm =
[system.
Activator]::
CreateInstance($type)
-
$mfarm.Initialize(1)
-
$mfarm.zones | foreach-Object{$_.OnlineServers}
Set-CitrixLoadEvalutor
-
Param($server,$LoadEvaluator = "MFDefaultLE",[switch]$Verbose)
-
#NOTE: This only work for 4.0 and 4.5
-
if($verbose){$verbosepreference = "Continue"}
-
-
function Set-LE{
-
Param($mySrv)
-
# Getting Current LE
-
write-Verbose " + Set-LE called : $($mySrv.ServerName)"
-
$le = $mfServer.AttachedLE
-
$le.LoadData(1)
-
Write-Verbose " - Old Evaluator: $($le.LEName)"
-
Write-Verbose " - Setting to $LoadEvaluator"
-
-
# Assigning New LE
-
$mySrv.AttachLEByName($LoadEvaluator)
-
-
# Checking LE
-
$le = $mySrv.AttachedLE
-
$le.LoadData(1)
-
Write-Verbose " - Load Evaluator Set to $($le.LEName)"
-
-
}
-
-
if($Server)
-
{
-
# Loading Server Object
-
Write-Verbose " + Processing $Server"
-
$type =
[System.
Type]::
GetTypeFromProgID("MetaframeCOM.MetaframeServer",
$Server)
-
$mfServer =
[system.
Activator]::
CreateInstance($type)
-
$mfServer.Initialize(6,$Server)
-
Write-Verbose " - Calling Set-LE"
-
Set-LE $mfServer
-
}
-
-
if($list)
-
{
-
foreach($Srv in (Get-Content $list))
-
{
-
Write-Verbose " + Processing $Srv"
-
# Loading Server Object
-
Write-Verbose " - Getting Citrix Object"
-
$type =
[System.
Type]::
GetTypeFromProgID("MetaframeCOM.MetaframeServer",
$Srv)
-
$mfServer =
[system.
Activator]::
CreateInstance($type)
-
$mfServer.Initialize(6,$Srv)
-
Write-Verbose " - Calling Set-LE"
-
Set-LE $mfServer
-
}
-
}
-
-
if($input)
-
{
-
foreach($Srv in $input)
-
{
-
Write-Verbose " + Processing $Srv"
-
if($Srv.ServerName)
-
{
-
Write-Verbose " - Input is a Citrix Server: $Srv"
-
Write-Verbose " - Calling Set-LE"
-
Set-LE $Srv
-
}
-
else
-
{
-
Write-Verbose " - Input: $Srv"
-
# Loading Server Object
-
Write-Verbose " - Getting Citrix Object"
-
$type =
[System.
Type]::
GetTypeFromProgID("MetaframeCOM.MetaframeServer",
$Srv)
-
$mfServer =
[system.
Activator]::
CreateInstance($type)
-
$mfServer.Initialize(6,$Srv)
-
Write-Verbose " - Calling Set-LE"
-
Set-LE $mfServer
-
}
-
}
-
}
This was the all in one that I posted
-
Param($Server,$minLoad = 1000,$LoadEval,[switch]$verbose)
-
if($verbose){$verbosepreference = "continue"}
-
function Get-CitrixFarm{
-
param($Srv)
-
$type =
[System.
Type]::
GetTypeFromProgID("MetaframeCOM.MetaframeFarm",
$Srv)
-
$mfarm =
[system.
Activator]::
CreateInstance($type)
-
$mfarm.Initialize(1)
-
Write-Verbose "Loading Farm $($mFarm.FarmName)"
-
return $mFarm
-
}
-
function Set-CitrixLoadEvalutor{
-
Param($server,$LoadEvaluator = "MFDefaultLE")
-
-
# Loading Server Object
-
$type =
[System.
Type]::
GetTypeFromProgID("MetaframeCOM.MetaframeServer",
$Server)
-
$mfServer =
[system.
Activator]::
CreateInstance($type)
-
$mfServer.Initialize(6,$Server)
-
-
# Getting Current LE
-
$le = $mfServer.AttachedLE
-
$le.LoadData(1)
-
Write-Verbose "Old Evaluator: $($le.LEName)"
-
Write-Verbose "Setting Load Evaluator on $server to $LoadEvaluator"
-
-
# Assigning New LE
-
$mfServer.AttachLEByName($LoadEvaluator)
-
-
# Checking LE
-
$le = $mfServer.AttachedLE
-
$le.LoadData(1)
-
Write-Verbose "Load Evaluator Set to $($le.LEName)"
-
}
-
-
$farm = Get-CitrixFarm $Server
-
foreach($ctxServer in $farm.Servers)
-
{
-
$load = $ctxServer.WinServerObject.Serverload
-
Write-Host ("{0,-15} :: {1}" -f $ctxServer.ServerName,$load)
-
if($load -lt $minLoad)
-
{
-
Write-Verbose "Setting Offline Load Eval"
-
if($LoadEval){Set-CitrixLoadEvalutor $ctxServer.ServerName $LoadEval}
-
}
-
}
tshell :: Dec.05.2007 ::
All, Citrix, Custom Objects, Powershell, Scripting ::
No Comments »