AutopilotMonitor.ps1

<#PSScriptInfo
.VERSION 1.0
.GUID 1b6608bd-f562-4cd3-9726-5ded493f5263
.AUTHOR Piotr Gardy
.COMPANYNAME
.COPYRIGHT
.TAGS Windows AutoPilot
.LICENSEURI
.PROJECTURI
.ICONURI
.EXTERNALMODULEDEPENDENCIES
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
Version 1.0: Original published version
#>


<#
 
.SYNOPSIS
A sample script that monitors connectivity to Intune and shows errors and win32app info for c:\ProgramData\Microsoft\IntuneManagementExtension\Logs\IntuneManagementExtension.log log file
 
.DESCRIPTION
A sample script that monitors connectivity to Intune and shows errors and win32app info for c:\ProgramData\Microsoft\IntuneManagementExtension\Logs\IntuneManagementExtension.log log file
 
.EXAMPLE
.\AutopilotMonitor.ps1
Run the script
 
#>



#Let's define parameters
$SleepInSeconds = 10
$LogFilePath = "c:\ProgramData\Microsoft\IntuneManagementExtension\Logs\IntuneManagementExtension.log"
$LinesNumber = 30
Function ShowCMLog ($sLine) {
    $reLine = ([regex]'<!\[LOG\[(.+)\]LOG\]!>').matches($sLine); 
    if ($reline.count -gt 0 ) { $body = $reLine[0].Groups[1].Value } 
    $reLine = ([regex]'<time="(.+)" date="(.+)" component').matches($sLine); 
    if ($reline.count -gt 0 ) { 
        $DateTime = $reLine[0].Groups[2].Value + " " + $reLine[0].Groups[1].Value 
    }  
    $oLog = New-Object System.Object;
    $oLog | Add-Member -type NoteProperty -name DateTime -value $DateTime;
    $oLog | Add-Member -type NoteProperty -name Message -value  $body
    $oLog = $oLog | Sort-Object 'DateTime'
    if ($reline.count -gt 0 ) {
        if ($oLog.Message -ilike "exception") {
            write-host -Foreground Yellow "$($oLog.DateTime) $($oLog.Message)"
        }
        else {
            write-host  "$($oLog.DateTime) $($oLog.Message)"
        }
    }
}
Function ShowFilteredContent {
    $global:content = $global:content | select-string -Pattern "BackgroundWorker is checking at" -NotMatch
    $global:content = $global:content | select-string -Pattern "Total valid AAD User session count is" -NotMatch 
    $global:content = $global:content | select-string -Pattern "ESP checker found 0 session for user" -NotMatch
    $global:content = $global:content | select-string -Pattern "active user sessions" -NotMatch
    $global:content = $global:content | Select-Object -last $LinesNumber
    foreach ($line in ($global:content) ) {
        ShowCMLog $line
    }
}
Function ProcessLog {
    $global:content = @()
    $FileContent = get-content $LogFilePath
    $FileContent2 = @()
    for ($i = 0; $i -lt $FileContent.Length; $i++) {
        if ($null -ne ([regex]'<!\[LOG\[(.+)\]LOG\]!>').matches($FileContent[$i]).Success) {
            $FileContent2 += $FileContent[$i]
        }
        else {
            if ($null -ne ([regex]'<!\[LOG\[(.+)').matches($FileContent[$i]).Success) {
                $merged = $false
                [string]$str = $FileContent[$i]
                while (!$merged) {
                    $i++;
                    $str += $FileContent[$i]
                    if ($null -ne ([regex]'\]LOG\]!>').matches($FileContent[$i]).Success) {
                        $merged = $true
                        $FileContent2 += $str
                    }
                }
            } 
        }
    }
    $global:content += $FileContent2  | Select-String -pattern "\[Win32App\]"
    $global:content += $FileContent2  | Select-String -pattern "WebException"
    ShowFilteredContent | Sort-Object
}
function CheckHttp ($url, $UseMachineCert = $false) {
    $RequestSucceded = $false
    $errorMessage = ""
    if ($UseMachineCert) {
        $certToUse = $null
        $CertOK = $false
        $ValidIssuer = "CN=Microsoft Intune MDM Device CA"
        #1.3.6.1.5.5.7.3.2 => Client Authentication
        $certs = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { ($_.Issuer -ieq $ValidIssuer) -and ($_.NotAfter -gt (Get-Date)) -and $($_.EnhancedKeyUsageList.ObjectId -contains "1.3.6.1.5.5.7.3.2") }
        foreach ($cert in $certs) {
            $CertOK = $true
            $certToUse = $cert
            break
        }
    }
    write-host -NoNewline  "$($url) =====>"
    try {
        if ($UseMachineCert -and ($null -ne $certToUse)) {
            $result = Invoke-WebRequest -Uri $url -CertificateThumbprint ($cert.Thumbprint)
        }
        else {
            $result = Invoke-WebRequest -Uri $url
        }
    }
    catch {
        $errorMessage = $errorMessage + " " + $_.Exception.Message
        $a = 1
    }
    if ($null -ne $result.StatusCode) {
        if ($result.StatusCode -ieq 200) {
            $RequestSucceded = $true
            write-host -ForegroundColor Green "OK"
        }
    }
    if ($RequestSucceded -eq $false) {
        for ($i = 1; $i -le 5; $i++) {
            [console]::beep()
        }
        write-host -ForegroundColor RED "FAILED: $($errorMessage)"
    }
    
}

while ($true) {
    cls
    CheckHttp "https://manage.microsoft.com"
    #CheckHttp "https://fef.XXXX.manage.microsoft.com/TrafficGateway/TrafficRoutingService/SideCar/StatelessSideCarGatewayService" $true
    write-host
    write-host
    write-host
    #ProcessLog

    Start-Sleep -Seconds $SleepInSeconds
}