Public/Get-ServerUptime.ps1




function Get-ServerHealth {
    param (
        [string[]]$servers,
        $service1 = @("test"),
        $Threads = 50,
        [System.Management.Automation.PSCredential] $Credential
    )
    
    begin
    {

        $scriptBlock = {
    
            param ()
            #Region Executin Block
            $ret = (get-date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
            
            $hostname = hostname
        
            # save status
            $day = $ret.Days
            $uptimeStatus = "Server is up for $day Days"
            $ping = $true;
        
                
            #build object to return
            $properties = @{'ComputerName' = $hostname;
                'Uptime'                   = $uptimeStatus;
                'Ping'                     = $ping;
            }
            #endregion
            $avObj = New-Object -TypeName PSObject –Prop $properties 
            $avobj 
        }
    }

    process{
        
    # clear any existing jobs
    get-job | stop-job
    get-job | remove-job
    


    $bad = @()
    $jobname = "ServerHealthCheck"
    $count = 0
    $total = $servers.count
    $servers | ForEach-Object {
    
           
        $count++
        Write-Progress -Activity "scanning for Server Connectivity" -Status "$_ $count of $total" -PercentComplete ($count / $total * 100)
        if (Test-Connection -Quiet -Count 1 -ComputerName $_) {
            
            if($Credential)
            {
               Invoke-Command -AsJob -ThrottleLimit 100  -jobname $jobname -computername $_ -Credential $Credential -ScriptBlock $scriptBlock
            }
            else {
                Invoke-Command -AsJob -ThrottleLimit 100  -jobname $jobname -computername $_  -ScriptBlock $scriptBlock
            }
        }
        else {
    
            #Write-Host "$_" -ForegroundColor Yellow
            $bad += $_
        }
        while ((Get-Job -state running | where-object{ $_.Name -eq $jobname }).count -gt $threads) {
            Start-Sleep -Seconds 5 
            #"waiting for threads..."
        }
    }
    
    while ((Get-Job -state running | where-object { $_.Name -eq $jobname }).count -gt 0) {
        Start-Sleep -Seconds 5
        Get-Job -state running | where-object { $_.Name -eq $jobname }
    }
    
    $results = @()
    get-job -State Completed | where-object { $_.name -eq $jobname } | Receive-Job -keep | foreach-object { $results += $_ }
    #Write-host $results -ForegroundColor Yellow
    
    #add bad servers
    $bad | foreach-object {
        #build object to return
            
    
        $properties = @{'ComputerName' = $_;
            'Uptime'                   = "N/A";
            'Ping'                     = $false;
        }
        $avObj = New-Object -TypeName PSObject –Prop $properties 
        $results += $avobj 
    }
       
    $results
    }
        
}

<#
 
$env:result = "$pwd\report\Server_Zone_$($zone).csv"
 
$servers = Get-GridPMachine -Zone $zone -ExcludeType ChassisManager | Select-Object -ExpandProperty Name
 
$v=Get-ServerHealth $servers -Credential $cred_ada
 
$v | ? computername -ne $null | select computername,uptime,ping | Export-Csv -NoTypeInformation $env:result -Force
 
Send-Result -FileToSend $env:result -SubjectTitle "Server UptimeCheck - for Zone: $($zone)"
 
Remove-Item -Path $env:result -Force
 
#>