# Set-CitrixPSVersion.ps1 # Brandon Shell [MVP] # www.bsonposh.com # Sets PS Version on a Server, List of Servers, or all Servers in the Farm Param($file,$server,$PSVer,[switch]$help,[switch]$all,[switch]$whatif,[switch]$show,[switch]$verbose) function HelpMe{ Write-Host Write-Host " Set-CitrixPSVersion.ps1:" -fore Green Write-Host " Sets PS Version on a Server, List of Servers, or all Servers in the Farm" Write-Host Write-Host " Parameters:" -fore Green Write-Host " -File : Optional. Name of the File of Servers" Write-Host " -Server : Optional. Name of the Server to Change" Write-Host " -Verbose : Optional. Enables Verbose Output" Write-Host " -All : Optional. Sets Version on all Servers [Requires -Server]" Write-Host " -Show : Optional. Displays the Version for Server(s)" Write-Host " -Help : Optional. Displays This" Write-Host " -Whatif : Optional. Will not Commit Info just Display what would change" Write-Host Write-Host " Examples:" -fore Green Write-Host " Set PS Version on Server1 to STD" -fore White Write-Host " .\Set-CitrixPSVersion.ps1 -Server Server1 -psver STD " -fore Yellow Write-Host Write-Host " Set PS Version on Servers in a File" -fore White Write-Host " .\Set-CitrixPSVersion.ps1 -file c:\Mylist.txt -psver STD " -fore Yellow Write-Host Write-Host " Get PS Version from ALL server" -fore White Write-Host " .\Set-CitrixPSVersion.ps1 -all -Server myzdcserver" -fore Yellow Write-Host Write-Host " Product Edition Options" -fore Green Write-Host " STD = Citrix Presentation Server Standard Edition" -fore White Write-Host " ADV = Citrix Presentation Server Advanced Edition" -fore White Write-Host " ENT = Citrix Presentation Server Enterprise Edition" -fore White Write-Host " PLT = Citrix Presentation Server Platinum Edition" -fore White Write-Host } function Ping-Server { Param($srv) $pingresult = Get-WmiObject win32_pingstatus -f "address='$srv'" if($pingresult.statuscode -eq 0) {$true} else {$false} } function Set-PSVer{ Param($srv) Write-Verbose " Getting Citrix Server Object" $type = [System.Type]::GetTypeFromProgID("MetaframeCOM.MetaframeServer",$srv) $mfsrv = [system.Activator]::CreateInstance($type) $mfsrv.Initialize(6,$srv) if(!$?){Write-Host " - Server [$srv] threw and Error" -fore red;return} if($show) # Check for $Show and will display only { Write-Host " - PS Version for [$srv]: $($mfsrv.WinServerObject.mpsedition)" return } else { if($whatif) # Check for $Whatif { Write-Host " What if: Performing operation `"Set PS Version [$PSVer]`" on Target `"$srv`"." } else { Write-Verbose " - Setting PSVer to [$PSVer] on [$srv]" $mfsrv.WinServerObject.mpsedition = $PSVer Write-Host " - PS Version for [$srv]: $($mfsrv.WinServerObject.mpsedition)" } } } function Set-PSALL{ $mfarm = new-Object -com "MetaframeCOM.MetaframeFarm" $mfarm.Initialize(1) foreach($mfsrv in $mfarm.Servers) { if($show){Write-Host " - PS Version for [$($mfsrv.ServerName)]: $($mfsrv.WinServerObject.MPSEdition)";continue} if($whatif){Write-Host " What if: Performing operation `"Set PS Version [$PSVer]`" on Target `"$($mfsrv.ServerName)`"."} else { Write-Verbose " - Setting PSVer to [$PSVer] on [$($mfsrv.ServerName)]" $mfsrv.WinServerObject.mpsedition = $PSVer Write-Host " - PS Version for [$($mfsrv.ServerName)]: $($mfsrv.WinServerObject.MPSEdition)" } } } # Script Setup. Checking Parameters Write-Host ## Checing Verbose flag if($verbose){$verbosepreference = "Continue"}else{$erroractionpreference = "SilentlyContinue"} ## Verifying that File/Server was passed. If not or -help I Call HelpMe and close. if(!$file -and !$server -and !$all -or $help){HelpMe;Return} ## Verify Valid Edition was Passed if(!$show -and ($PSVer -notmatch "STD|ADV|ENT|PLT")) { Write-Host " PS Edition [$PSVER] is NOT Valid. Please use STD, ADV, ENT, or PLT" -fore RED Write-Host Return } # If $Server and we can ping it we run Set-PSVer against Server if($server -and (ping-server $server)) { Set-PSVer $server Write-host } # Check for -File and Verify the file is valid if($File -and (test-Path $file)) { Write-Verbose " - Processing File [$file]" # Process each Server checking for blanks foreach($Server in (get-Content $file | where{$_ -match "^\S"})) { Write-Host " + Processing Server [$Server]" if(ping-Server $server){Set-PSVer $Server}else{Write-Host " - Ping Failed to [$Server]" -fore Red} Write-host } } if($all){Set-PSALL} Write-Host