Get computers ping status, IP, OS version, sp version, uptime and last boot gui

This powershell script with built-in GUI allows you to point to a text file list of computers and will then retrieve the following information for each computer in the list. Whether it is pingable Its IP address OS Version Service Pack Version Uptime Last boot time.

Powershell tool to get multiple computer info and status

Param ([switch]$NoWarning,[switch]$Debug)    If ($Debug) {      #enable debug messages if -debug is specified      $debugPreference="Continue"  }    If ($NoWarning) {      #turn off warning messages      $WarningPreference="SilentlyContinue"  }    function Ping-Host {    Param([string]$computername=$(Throw "You must specify a computername."))        Write-Debug "In Ping-Host function"        $query="Select * from Win32_PingStatus where address='$computername'"        $wmi=Get-WmiObject -query $query    write $wmi  }    function Get-OS {    Param([string]$computername=$(Throw "You must specify a computername."))    Write-Debug "In Get-OS Function"    $wmi=Get-WmiObject Win32_OperatingSystem -computername $computername -ea stop        write $wmi    }      #Generated Form Function  function GenerateForm {    #region Import the Assemblies  Write-Debug "Loading Assemblies"  [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  #endregion    #region Generated Form Objects  Write-Debug "Creating form objects"  $form1 = New-Object System.Windows.Forms.Form  $lblRefreshInterval = New-Object System.Windows.Forms.Label  $numInterval = New-Object System.Windows.Forms.NumericUpDown  $btnQuit = New-Object System.Windows.Forms.Button  $btnGo = New-Object System.Windows.Forms.Button  $dataGridView = New-Object System.Windows.Forms.DataGridView  $label2 = New-Object System.Windows.Forms.Label  $statusBar = New-Object System.Windows.Forms.StatusBar  $txtComputerList = New-Object System.Windows.Forms.TextBox  $timer1 = New-Object System.Windows.Forms.Timer  #endregion Generated Form Objects    #----------------------------------------------  #Generated Event Script Blocks  #----------------------------------------------    $LaunchCompMgmt=   {      #only launch computer management if a cell in the Computername       #column was selected.      $c=$dataGridView.CurrentCell.columnindex      $colHeader=$dataGridView.columns[$c].name      if ($colHeader -eq "Computername") {          $computer=$dataGridView.CurrentCell.Value          Write-Debug ("Launch computer management for {0}" -f $computer.toUpper())          compmgmt.msc /computer:$computer      }  } #end Launch Computer Management script block    $GetStatus=   {     Trap {          Write-Debug "Error trapped in GetStatus script block"          Write-Warning $_.Exception.message          Continue      }            #stop the timer while data is refreshed      Write-Debug "Stop the timer"      $timer1.stop()        Write-Debug ("Getting content from {0}" -f $txtComputerlist.Text)      if ($computers) {Clear-Variable computers}            #clear the table      $dataGridView.DataSource=$Null            $computers=Get-Content $txtComputerList.Text -ea stop | sort             if ($computers) {                   $statusBar.Text = ("Querying computers from {0}" -f $txtComputerList.Text)          $form1.Refresh                    #create an array for griddata          Write-Debug "Create `$griddata"          $griddata=@()          #create a custom object                    foreach ($computer in $computers) {            Write-Debug "Pinging $computer"            $statusBar.Text=("Pinging {0}" -f $computer.toUpper())            Write-Debug "Creating `$obj"            $obj=New-Object PSobject            Write-Debug "Adding Computername property"            $obj | Add-Member Noteproperty Computername $computer.ToUpper()                        #ping the computer            if ($pingResult) {              #clear PingResult if it has a left over value              Clear-Variable pingResult              }            $pingResult=Ping-Host $computer            Write-Debug "Pinged status code is $($pingResult.Statuscode)"                    if ($pingResult.StatusCode -eq 0) {                                  $obj | Add-Member Noteproperty Pinged "Yes"                 Write-Debug "Adding $($pingresult.ProtocolAddress)"                 $obj | Add-Member Noteproperty IP $pingResult.ProtocolAddress                                  #get remaining information via WMI                 Trap {                  #define a trap to handle any WMI errors                  Write-Warning ("There was a problem with {0}" -f $computer.toUpper())                  Write-Warning $_.Exception.GetType().FullName                  Write-Warning $_.Exception.message                  Continue                  }                                           if ($os) {                      #clear OS if it has a left over value                      Clear-Variable os                  }                 $os=Get-OS $computer                 if ($os) {                     $lastboot=$os.ConvertToDateTime($os.lastbootuptime)                     Write-Debug "Adding $lastboot"                     $uptime=((get-date) - ($os.ConvertToDateTime($os.lastbootuptime))).tostring()                     Write-Debug "Adding $uptime"                     $osname=$os.Caption                     Write-Debug "Adding $osname"                     $servicepack=$os.CSDVersion                     Write-Debug "Adding $servicepack"                                          $obj | Add-Member Noteproperty OS $osname                     $obj | Add-Member Noteproperty ServicePack $servicepack                     $obj | Add-Member Noteproperty Uptime $uptime                     $obj | Add-Member Noteproperty LastBoot $lastboot                 }                 else {                 Write-Debug "Setting properties to N/A"                     $obj | Add-Member Noteproperty OS "N/A"                     $obj | Add-Member Noteproperty ServicePack "N/A"                     $obj | Add-Member Noteproperty Uptime "N/A"                     $obj | Add-Member Noteproperty LastBoot "N/A"                 }            }            else {                  Write-Debug "Ping failed"                  Write-Debug "Setting properties to N/A"                   $obj | Add-Member Noteproperty Pinged "No"                 $obj | Add-Member Noteproperty IP "N/A"                 $obj | Add-Member Noteproperty OS "N/A"                 $obj | Add-Member Noteproperty ServicePack "N/A"                 $obj | Add-Member Noteproperty Uptime "N/A"                 $obj | Add-Member Noteproperty LastBoot "N/A"            }                        #Add the object to griddata                  Write-Debug "Adding `$obj to `$griddata"                  $griddata+=$obj                      } #end foreach                    Write-Debug "Creating ArrayList"             $array= New-Object System.Collections.ArrayList                    Write-Debug "Adding `$griddata to `$arry"          $array.AddRange($griddata)          $DataGridView.DataSource = $array          #find unpingable computer rows          Write-Debug "Searching for non-pingable computers"          $c=$dataGridView.RowCount          for ($x=0;$x -lt $c;$x++) {              for ($y=0;$y -lt $dataGridView.Rows[$x].Cells.Count;$y++) {                  $value = $dataGridView.Rows[$x].Cells[$y].Value                  if ($value -eq "No") {                  #if Pinged cell = No change the row font color                  Write-Debug "Changing color on row $x"                  $dataGridView.rows[$x].DefaultCellStyle.Forecolor=[System.Drawing.Color]::FromArgb(255,255,0,0)                  }              }          }          Write-Debug "Setting status bar text"          $statusBar.Text=("Ready. Last updated {0}" -f (Get-Date))        }      else {          Write-Debug "Setting status bar text"          $statusBar.Text=("Failed to find {0}" -f $txtComputerList.text)      }          #set the timer interval      $interval=$numInterval.value -as [int]      Write-Debug "Interval is $interval"      #interval must be in milliseconds      $timer1.Interval = ($interval * 60000) #1 minute time interval      Write-Debug ("Timer interval calculated at {0} milliseconds" -f $timer1.Interval )      #start the timer      Write-Debug "Starting timer"      $timer1.Start()            Write-Debug "Refresh form"      $form1.Refresh()       } #End GetStatus scriptblock    $Quit=   {      Write-Debug "closing the form"      $form1.Close()  } #End Quit scriptblock    #----------------------------------------------  #region Generated Form Code  $form1.Name = 'form1'  $form1.Text = 'Display Computer Status'  $form1.DataBindings.DefaultDataSourceUpdateMode = 0  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 890  $System_Drawing_Size.Height = 359  $form1.ClientSize = $System_Drawing_Size  $form1.StartPosition = 1  $form1.BackColor = [System.Drawing.Color]::FromArgb(255,185,209,234)    $lblRefreshInterval.Text = 'Refresh Interval (min)'    $lblRefreshInterval.DataBindings.DefaultDataSourceUpdateMode = 0  $lblRefreshInterval.TabIndex = 10  $lblRefreshInterval.TextAlign = 64  #$lblRefreshInterval.Anchor = 9  $lblRefreshInterval.Name = 'lblRefreshInterval'  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 128  $System_Drawing_Size.Height = 23  $lblRefreshInterval.Size = $System_Drawing_Size  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 440  $System_Drawing_Point.Y = 28  $lblRefreshInterval.Location = $System_Drawing_Point    $form1.Controls.Add($lblRefreshInterval)    #$numInterval.Anchor = 9  $numInterval.DataBindings.DefaultDataSourceUpdateMode = 0  $numInterval.Name = 'numInterval'  $numInterval.Value = 10  $numInterval.TabIndex = 9  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 51  $System_Drawing_Size.Height = 20  $numInterval.Size = $System_Drawing_Size  $numInterval.Maximum = 60  $numInterval.Minimum = 1  $numInterval.Increment = 2  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 575  $System_Drawing_Point.Y = 30  $numInterval.Location = $System_Drawing_Point  # $numInterval.add_ValueChanged($GetStatus)    $form1.Controls.Add($numInterval)      $btnQuit.UseVisualStyleBackColor = $True  $btnQuit.Text = 'Close'    $btnQuit.DataBindings.DefaultDataSourceUpdateMode = 0  $btnQuit.TabIndex = 2  $btnQuit.Name = 'btnQuit'  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 75  $System_Drawing_Size.Height = 23  $btnQuit.Size = $System_Drawing_Size  #$btnQuit.Anchor = 9  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 341  $System_Drawing_Point.Y = 30  $btnQuit.Location = $System_Drawing_Point  $btnQuit.add_Click($Quit)    $form1.Controls.Add($btnQuit)      $btnGo.UseVisualStyleBackColor = $True  $btnGo.Text = 'Get Status'    $btnGo.DataBindings.DefaultDataSourceUpdateMode = 0  $btnGo.TabIndex = 1  $btnGo.Name = 'btnGo'  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 75  $System_Drawing_Size.Height = 23  $btnGo.Size = $System_Drawing_Size  #$btnGo.Anchor = 9  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 233  $System_Drawing_Point.Y = 31  $btnGo.Location = $System_Drawing_Point  $btnGo.add_Click($GetStatus)    $form1.Controls.Add($btnGo)    $dataGridView.RowTemplate.DefaultCellStyle.ForeColor = [System.Drawing.Color]::FromArgb(255,0,128,0)  $dataGridView.Name = 'dataGridView'  $dataGridView.DataBindings.DefaultDataSourceUpdateMode = 0  $dataGridView.ReadOnly = $True  $dataGridView.AllowUserToDeleteRows = $False  $dataGridView.RowHeadersVisible = $False  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 870  $System_Drawing_Size.Height = 260  $dataGridView.Size = $System_Drawing_Size  $dataGridView.TabIndex = 8  $dataGridView.Anchor = 15  $dataGridView.AutoSizeColumnsMode = 16        $dataGridView.AllowUserToAddRows = $False  $dataGridView.ColumnHeadersHeightSizeMode = 2  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 13  $System_Drawing_Point.Y = 70  $dataGridView.Location = $System_Drawing_Point  $dataGridView.AllowUserToOrderColumns = $True  $dataGridView.add_CellContentDoubleClick($LaunchCompMgmt)  #$dataGridView.AutoResizeColumns([System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells]::AllCells)  #$DataGridViewAutoSizeColumnsMode.AllCells    $form1.Controls.Add($dataGridView)    $label2.Text = 'Enter the name and path of a text file with your list of computer names: (One name per line)'    $label2.DataBindings.DefaultDataSourceUpdateMode = 0  $label2.TabIndex = 7  $label2.Name = 'label2'  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 490  $System_Drawing_Size.Height = 23  $label2.Size = $System_Drawing_Size  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 12  $System_Drawing_Point.Y = 7  $label2.Location = $System_Drawing_Point    $form1.Controls.Add($label2)    $statusBar.Name = 'statusBar'  $statusBar.DataBindings.DefaultDataSourceUpdateMode = 0  $statusBar.TabIndex = 4  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 428  $System_Drawing_Size.Height = 22  $statusBar.Size = $System_Drawing_Size  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 0  $System_Drawing_Point.Y = 337  $statusBar.Location = $System_Drawing_Point  $statusBar.Text = 'Ready'    $form1.Controls.Add($statusBar)    $txtComputerList.Text = 'c:\computers.txt'  $txtComputerList.Name = 'txtComputerList'  $txtComputerList.TabIndex = 0  $System_Drawing_Size = New-Object System.Drawing.Size  $System_Drawing_Size.Width = 198  $System_Drawing_Size.Height = 20  $txtComputerList.Size = $System_Drawing_Size  $System_Drawing_Point = New-Object System.Drawing.Point  $System_Drawing_Point.X = 13  $System_Drawing_Point.Y = 33  $txtComputerList.Location = $System_Drawing_Point  $txtComputerList.DataBindings.DefaultDataSourceUpdateMode = 0    $form1.Controls.Add($txtComputerList)      #endregion Generated Form Code    Write-Debug "Adding script block to timer"  #add the script block to execute when the timer interval expires  $timer1.add_Tick($GetStatus)    #Show the Form  Write-Debug "ShowDialog()"  $form1.ShowDialog()| Out-Null    } #End Function    #Call the Function  Write-Debug "Call GenerateForm"  GenerateForm 

http://jdhitsolutions.com/blog/powershell/3361/creating-styling-html-reports-with-powershell/

https://www.youtube.com/watch?v=QdK3qM5jnYw