Stay Current! :Detect Hyper-V 2012 Hotfixes if they are installed or not
After reading Cristians excellent blog here --> https://blogs.technet.com/b/cedward/archive/2013/05/24/validating-hyper-v-2012-and-failover-clustering-2012-hotfixes-and-updates-with-powershell.aspx I decided to try and write an addition on to his original script where it would parse the html table directory from the wiki page and just take the current patches!
so here is my attempt :)
<#
.SYNOPSIS
Runs a Check on a remote server for the necessary hotfixes
.DESCRIPTION
This script will check technet against the current
"hotfix" list
.PARAMETER Computername
.EXAMPLE
.\CheckHotFix.ps1 -Computername Server01
#>
param([Parameter(Position=0,Mandatory=$true)][ValidateNotNullorEmpty()][string]$computername)
function checkhotfix([string]$computername)
{
#List All Patches and & Hotfixes From
Remote Server
$session =
[activator]::CreateInstance([type]::GetTypeFromProgID(“Microsoft.Update.Session“,$computername))
$us = $session.CreateUpdateSearcher()
$qtd = $us.GetTotalHistoryCount()
$hot = $us.QueryHistory(1, $qtd)
$patches = $hot |select title
#Path for temp file to change large
string into Array of objects
$temppath = $env:userprofile +
"\Desktop"
$tempfile = $temppath +
"\temp.txt"
#Create a new Com object to work
with internet explorer in hidden mode
$ie = new-object -com
"InternetExplorer.Application"
$ie.navigate("https://social.technet.microsoft.com/wiki/contents/articles/15576.hyper-v-update-list-for-windows-server-2012.aspx")
$doc = $ie.document
sleep 5
$doc = $ie.document
$tb1 =
$doc.getelementsbytagname("table") |%{$_.InnerHtml}
#exporting first table which is the
Current updates
$tb1[0] |out-file $tempfile
#importing so we can process as an array
[array]$in = get-content $tempfile
remove-item $tempfile
[array]$heading = $null
[array]$output = $null
[array]$kbs = $null
for($i=0;$i -ne $in.count;$i++)
{
if (($in[$i] -notlike "*tr style*") -or ($in[$i]
-notlike "<tbody>") -or ($in[$i] -ne $null))
{
if ($in[$i] -like "<td style*")
{
$heading +=
($in[$i]).split(">")[2].split("<")[0]
}
elseif ($in[$i] -like "<td>*")
{
$count = 0
$returnobj = new-object psobject
while($in[$i] -ne "</tr>")
{
if ($in[$i] -like "<td>*")
{
$item = ($in[$i].split(">")[1]).split("<")[0]
if($item
-like "KB*")
{
$kbtemp = ($item.split(":")[0]).replace(" ","")
$installed = $patches |select-string $kbtemp
if
($installed -eq $null)
{
$returnobj
|add-member -type Noteproperty -name "Installed" -value $false
}
else
{
$returnobj |add-member -type Noteproperty -name "Installed" -value
$true
}
}
$returnobj |add-member -type noteproperty -name $heading[$count] -value $item
$count++
}
$i++
}
$output += $returnobj
}
}
}
$output
}
checkhotfix $computername