#Status Defaults
$TxtStatusArr = @("OK","WARN","CRIT")
#Determine servers
#We assume AppFabric Distributed Cache is activated on the Front-End servers
$SharePointServers = @(Get-SPServer | ?{$_.Role -eq "Application"} | %{$_.Name})
#Handle all-in-one development server
If (@($SharePointServers).Count -eq 1){
$FrontEndServers = @($SharePointServers)
}Else{
$WebAppServers = @(Get-SPServiceInstance | ?{$_.TypeName -eq "Microsoft SharePoint Foundation Web Application"} | ?{$_.Status -eq "Online"} | %{$_.Server.Name})
$BackEndServers = @(Get-SPServiceInstance | ?{$_.TypeName -eq "Central Administration"} | ?{$_.Status -eq "Online"} | %{$_.Server.Name})
$FrontEndServers = @(Get-SPServer | ?{$_.Role -eq "Application"} | %{$_.Name} | ?{$_ -NotIn $BackEndServers})
#Handle farm where Central Admin is hosted on every SP Server
If (@($FrontEndServers).Count -eq 0){
$FrontEndServers = @($BackEndServers)
}
}
#AppFabricDistributedCache check
$CheckName = "SP_DistributedCache_CacheHosts"
$ResultStatus = 1
Try{
$CacheServices = @(Get-SPServiceInstance | ?{$_.TypeName -eq "Distributed Cache"})
Use-CacheCluster
$CacheHosts = @(Get-CacheHost -ErrorAction:SilentlyContinue)
If ( $CacheServices.Count -eq $FrontEndServers.Count ){
#CacheServiceCount
If ( @($CacheServices | ?{$_.Status -eq "Online"}).Count -eq $CacheServices.Count){
#CacheServiceStatus
If ( $CacheHosts.Count -eq $CacheServices.Count ){
#CacheHostsCount
If ( @($CacheHosts | ?{$_.Status -eq "Up"}).Count -eq $CacheServices.Count){
#CacheHostsStatus
$ResultTxt = "All cache hosts are OK"
$ResultStatus = 0
}Else{
#CacheHostsStatus
$FailedCacheHosts = @($CacheHosts | ?{$_.Status -ne "Up"} | %{ @($_.Hostname,$_.Status) -Join ":" }) -Join ","
$ResultTxt = "Some cache hosts in down status: $FailedCacheHosts"
}
}Else{
#CacheHostsCount
$FailedCacheHosts = @($FrontEndServers | ?{$_ -NotIn @($CacheServices).Server.Name})
$ResultTxt = "Some FrontEnd servers do not have the cache host: $FailedCacheHosts"
}
}Else{
#CacheServiceStatus
$FailedCacheHosts = @($CacheServices | ?{$_.Status -ne "Online"} | %{ @($_.Server.Name,$_.Status) -Join ":" }) -Join ","
$ResultTxt = "Some cache services in down status: $FailedCacheHosts"
}
}Else{
#CacheServiceCount
$FailedCacheHosts = @($FrontEndServers | ?{$_ -NotIn @($CacheServices).Server.Name})
$ResultTxt = "Some FrontEnd servers do not have the cache service: $FailedCacheHosts"
}
}Catch{
$ResultTxt = $_.Exception.Message
$ResultStatus = 2
}
Write-Host "$ResultStatus $CheckName $($TxtStatusArr[$ResultStatus]) - $ResultTxt"