I have been having issues with a script I found and even after modifying it I am unable to make it work. Could someone take a look and see if there’s an issue that I’m missing?
The idea is to get the services before, then after a reboot. It works fine when running as system in powershell ise so I’m unsure what issue I’m running into.
I will say this is running on 2012r2 via the automox agent under remediation with exit 1.
Check Script: Exit 1
Remediation Script:
Write-Output "Beginning Scan"
>string]$myorg = "Org1"
>string]$groupname = "Group_01"
<#
$myorg = "Org1"
$groupname = "Patching_Group_01"
#>
>string]$ComputerName = "localhost"
>string]$Search = "zzzz"
>string]$Search2 = "zzzz"
$DirPath = "C:\temp\AmoxPatching\$myorg\$groupname\Services"
$DirPathCheck = Test-Path -Path $DirPath
If (!($DirPathCheck)) {
Try {
#If not present then create the dir
New-Item -ItemType Directory $DirPath -Force
}
Catch {
Write-Output "The Directory $DirPath was not created."
}
}
Set-Location -Path "C:\temp\AmoxPatching\$myorg\$groupname\Services"
$Final = @()
$hosts = $ComputerName
Foreach ($Computer in $hosts) {
$XmlNameBefore = "$Computer" + "-Before" + ".xml"
if ($ComputerName) {
$XmlNameAfter = "$Computer" + "-After" + ".Individual" + ".xml"
}
else {
$XmlNameAfter = "$Computer" + "-After" + ".xml"
}
if (!(Test-Path .\$XmlNameBefore)) {
Write-Host "(BEFORE)" -ForegroundColor Green -NoNewline
Write-Host " Connecting to $Computer..." -NoNewline
try {
get-wmiobject win32_service -ErrorAction Ignore | select SystemName, Name, DisplayName, State, StartMode | sort StartMode | Export-Clixml .\$XmlNameBefore
if ($?) { Write-Host "Success" -ForegroundColor Green }
else {
Write-Host "WMI connection failed" -ForegroundColor Red
Remove-Item .\$XmlNameBefore -recurse
}
}
Catch {
Write-Host "Access Denied" -ForegroundColor Red
}
}
elseif ((Test-Path .\$XmlNameBefore) -and !(Test-Path .\$XmlNameAfter)) {
Write-Host "(AFTER)" -ForegroundColor Yellow -NoNewline
Write-Host " Connecting to $Computer..." -NoNewline
try {
get-wmiobject win32_service -ErrorAction Ignore | select SystemName, Name, DisplayName, State, StartMode | sort StartMode | Export-Clixml .\$XmlNameAfter
if ($?) { Write-Host "Success" -ForegroundColor Green }
else {
Write-Host "FAILED" -ForegroundColor Red
Remove-Item .\$XmlNameAfter -recurse
}
}
Catch {
Write-Host "Access Denied" -ForegroundColor Red
}
}
if ((Test-Path .\$XmlNameBefore) -and (Test-Path .\$XmlNameAfter)) {
$wmi = Get-WmiObject -Class Win32_OperatingSystem -Computer $Computer
$RebootTime = $wmi.ConvertToDateTime($wmi.LastBootUpTime)
$RebootTime = $RebootTime.ToLocalTime()
$RebootDiff = ((get-date) - $RebootTime)
$RebootDiffHours = Hmath]::round($RebootDiff.totalHours, 1)
$RebootDiffDays = fmath]::round($RebootDiff.totalDays, 1)
$XmlNameBeforeTIME = (Get-ChildItem .\$XmlNameBefore).LastWriteTime
$XmlNameAfterTIME = (Get-ChildItem .\$XmlNameAfter).LastWriteTime
PsObject]$xmlBefore = Import-Clixml -Path ".\$XmlNameBefore"
PsObject]$xmlAfter = Import-Clixml -Path ".\$XmlNameAfter"
$CompareBefore = @()
$CompareAfter = @()
$CompareBefore = Compare-Object $xmlBefore $xmlAfter -Property SystemName, Name, DisplayName, State, StartMode | where { $_.SideIndicator -EQ "<=" }
$CompareAfter = Compare-Object $xmlBefore $xmlAfter -Property SystemName, Name, DisplayName, State, StartMode | where { $_.SideIndicator -EQ "=>" }
if ((!$CompareBefore) -and (!$CompareAfter)) { Write-Host "► No differences found for $Computer ◄" -ForegroundColor Yellow }
$obj = @()
$obj += ForEach ($line1 in $xmlBefore) {
# Looking for all rows in the first CSV file
ForEach ($line2 in $xmlAfter) {
# Looking for all rows in the second CSV file
if ($line1.name -eq $line2.name) {
# If the same service name is found in both files
if (($line1.startmode -ne $line2.startmode) -or ($line1.state -ne $line2.state)) {
# If different
New-Object -TypeName PSObject -Property @{
SystemName = $line1.SystemName
Rebooted_Hrs = $RebootDiffHours
Name = $line1.name
DisplayName = $line1.DisplayName
StartMode_Before = $line1.startmode
StartMode_After = $line2.startmode
State_Before = $line1.state
State_After = $line2.state
}
}
}
}
} #end of Foreach
foreach ($line1a in $CompareAfter) {
$found = $false
foreach ($line1b in $CompareBefore) {
If ($line1b.DisplayName -eq $line1a.DisplayName) {
$found = $true
}
}
if ($found -eq $false) {
$obj += New-Object -TypeName PSObject -Property @{
SystemName = $line1a.SystemName
Rebooted_Hrs = $RebootDiffHours
Name = $line1a.name
DisplayName = $line1a.DisplayName
StartMode_After = $line1a.startmode
State_After = $line1a.state
StartMode_Before = '---'
State_Before = '---'
}
}
}
foreach ($line1b in $CompareBefore) {
$found = $false
foreach ($line1a in $CompareAfter) {
If ($line1a.DisplayName -eq $line1b.DisplayName) {
$found = $true
}
}
if ($found -eq $false) {
$obj += New-Object -TypeName PSObject -Property @{
SystemName = $line1b.SystemName
Rebooted_Hrs = $RebootDiffHours
Name = $line1b.name
DisplayName = $line1b.DisplayName
StartMode_Before = $line1b.startmode
State_Before = $line1b.state
StartMode_After = '---'
State_After = '---'
}
}
}
$Final += $Obj
} # End of If Test-path
} # End of Foreach $Computer
$Final2 = @()
$Final2 = $Final | sort DisplayName | Select SystemName, Rebooted_Hrs, Name, State_Before, State_After, StartMode_Before, StartMode_After, DisplayName
if ($Final2) {
If ($ComputerName) {
if (Test-Path "$($ComputerName).$($myOrg).$($PatchGroup).Report.$(Get-date -f 'yyyy.MM.dd_HH.mm.ss').html") {
remove-item "$($ComputerName).$($myOrg).$($PatchGroup).Report.$(Get-date -f 'yyyy.MM.dd_HH.mm.ss').html"
}
}
else {
If (Test-Path "$($myOrg).$($PatchGroup).Report.$(Get-date -f 'yyyy.MM.dd_HH.mm.ss').html") {
Remove-item "$($myOrg).$($PatchGroup).Report.$(Get-date -f 'yyyy.MM.dd_HH.mm.ss').html"
}
}
$head = @'
<Title>Service Compare</Title>
<style>
body
{
background-color:#FFFFFF;
font-family:Tahoma;
font-size:12pt;
}
td, th
{
border:1px solid black;
border-collapse:collapse;
}
th
{
color:white;
background-color:black;
}
table, tr, td, th { padding: 5px; margin: 0px; box-shadow: 2px 2px 1px #888}
table { margin-left:50px; }
.danger {background-color: red}
.warn {background-color: yellow}
</style>
'@
#create an xml document from the HTML fragment
>xml]$html = $Final2 | ConvertTo-Html -fragment
#check each row, skipping the TH header row
for ($i = 1; $i -le $html.table.tr.count - 1; $i++) {
$class = $html.CreateAttribute("class")
#check the value of the last column and assign a class to the row
if (($html.table.trt$i].tdl7]) -like "*$Search*") {
$class.value = "warn"
$html.table.trt$i].Attributes.Append($class) | Out-Null
}
elseif (($html.table.trt$i].tdl7]) -like "*$Search2*") {
$class.value = "danger"
$html.table.trt$i].Attributes.Append($class) | Out-Null
}
}
#create the final report from the innerxml which should be html code
$body = @"
<p style="LINE-HEIGHT:10px;margin-left: 60px"><b>BEFORE</b> data was collected on $XmlNameBeforeTIME</p>
<p style="LINE-HEIGHT:0px;margin-left: 60px"><b>AFTER</b> data was collected on $XmlNameAfterTIME</p>
$($html.innerxml)
"@
#put it all together
if ($ComputerName) {
ConvertTo-HTML -head $head -PostContent "<br><i>HTML Generated on $(get-date)</i>" -body $body | Out-File "$($ComputerName).$($myOrg).$($PatchGroup).Report.$(Get-date -f 'yyyy.MM.dd_HH.mm.ss').html" -Encoding ascii
}
else {
ConvertTo-HTML -head $head -PostContent "<br><i>HTML Generated on $(get-date)</i>" -body $body | Out-File "$($myOrg).$($PatchGroup).Report.$(Get-date -f 'yyyy.MM.dd_HH.mm.ss').html" -Encoding ascii
}
#$ReportPath = (Get-Item -Path ".\Report.html" -Verbose).FullName
#Invoke-Item $ReportPath
}
#else {
# if (!$Final) {write-host `n "No differences found" -ForegroundColor Yellow}
# }