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 »