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