I created this function some time ago already when we did not have the SCOM Management Pack for Windows Clusters imported yet.
This script basically scans a Cluster, to scan its current CSV State, and report you the current size/usage/freespace available.
The output of this script can be used to filter out unhealthy volumes, or volumes that are filling up!
Function GetClusterVolumeState{
<#
.SYNOPSIS
Retrieve information about the Cluster Volume Health
.DESCRIPTION
The GetClusterVolumeState function retrieves information about the cluster volumes on a certain cluster.
This information will show the Cluster, Volume, Health and Disk space.
.PARAMETER Clusters
One or multiple clusters you would like to retrieve information from
.EXAMPLE
Retrieve information about the Clustervolumes for Cluster01
RI-GetClusterVolumeState -clusters "Cluster01"
.NOTES
This script was written by Danny den Braver @2013, for questions please contact danny@denbraver.com
#>
[CmdletBinding(SupportsShouldProcess=$true)]
param([array][Parameter(Mandatory=$true)]$Clusters)
foreach ($Cluster in $Clusters){
# Test Connection availability and continue if $true
$testconnection = Test-Connection $Cluster -Quiet
if ($testconnection -eq $true){
Write-Verbose -Message "Scanning: $Cluster for clusterdisk information"
# Get CSV Volumes
$CSVDisks = Get-ClusterSharedVolume -Cluster $Cluster
foreach ($CSVDisk in $CSVDisks){
# Get CSV VolumeInformation
$CSVVolumeInfo = $CSVDisk | Select -Expand SharedVolumeInfo
$CSVFriendlyName = $CSVVolumeInfo.FriendlyVolumeName
$CSVVolume = ($CSVFriendlyName.Split("\")[2]).ToLower()
$CSVState = $CSVDisk.State
# Get CSV free space
[int]$CSVDiskDriveFreeSpace = ([math]::round((($CSVVolumeInfo | Select -Expand Partition).FreeSpace / 1GB), 0))
# Get CSV total space
[int]$CSVDiskSpace = ([math]::round((($CSVVolumeInfo | Select -Expand Partition).Size / 1GB), 0))
# Get CSV used Space
[int]$CSVDiskDriveUsedSpace = [int]$CSVDiskSpace - [int]$CSVDiskDriveFreeSpace
# Get CSV Health
if ($CSVState -eq "Online"){
if ($CSVVolumeInfo.MaintenanceMode -eq $False){
if ($CSVVolumeInfo.RedirectedAccess -eq $True){
$CSVHealth = "Warning"
$CSVHealthDetails = 'Volume is in redirected mode.'
}
else {
$CSVHealth = "Healthy"
$CSVHealthDetails = 'Volume is healthy.'
}
}
else {
$CSVHealth = "Maintenance"
$CSVHealthDetails = 'Volume is in maintenance mode."'
}
}
else {
$CSVHealth = "Critical"
$CSVHealthDetails = 'Volume is in offline state.'
}
# CSV Output
$clustername = $cluster -replace ".eu.rabonet.com",""
$clustername | select @{l="Clustername";e={$Clustername}},
@{l="Volume"; e={"$CSVVolume"}},
@{l="DiskSpaceGB"; e={"$CSVDiskSpace"}},
@{l="UsedSpaceGB"; e={"$CSVDiskDriveUsedSpace"}},
@{l="FreeSpaceGB"; e={"$CSVDiskDriveFreeSpace"}},
@{l="Health"; e={"$CSVHealth"}},
@{l="Health Description"; e={"$CSVHealthDetails"}}
}
}
else { Write-Warning "Could not connect to $Cluster" }
}
}