This feature adds client version tracking and update notification capabilities to the SecureBootWatcher solution. It enables IT teams to:
- Track which version of the client is deployed on each device
- Receive alerts when newer versions are available
- Optionally enable auto-download and auto-install of updates (opt-in)
- Maintain visibility of the fleet's update status via the dashboard
The default configuration uses a notification-only approach:
Client ? Check Version API ? Alert if Update Available ? Dashboard Shows Outdated Devices
IT teams retain full control over update deployment via Intune/GPO/SCCM.
If enabled, clients can:
- Auto-download: Download update package to temp folder
- Auto-install: Schedule update to run after current execution
- Rollback: Automatically restore previous version if update fails
{
"ClientUpdate": {
"LatestVersion": "1.0.0.0",
"ReleaseDate": "2025-01-08T00:00:00Z",
"MinimumVersion": "1.0.0.0",
"DownloadUrl": "https://yourstorageaccount.blob.core.windows.net/client-packages/SecureBootWatcher-Client-latest.zip",
"IsUpdateRequired": false,
"ReleaseNotes": "Initial release",
"Checksum": "sha256-hash-here",
"FileSize": 1024000,
"PackagePath": ""
}
}Configuration Fields:
| Field | Description | Example |
|---|---|---|
LatestVersion |
Current latest version available | "1.2.0.0" |
ReleaseDate |
Release date of latest version | "2025-01-15T10:00:00Z" |
MinimumVersion |
Minimum supported version | "1.0.0.0" |
DownloadUrl |
URL to download update package | Azure Blob Storage URL |
IsUpdateRequired |
Force update flag | false |
ReleaseNotes |
Human-readable release notes | "Bug fixes and improvements" |
Checksum |
SHA256 hash for integrity validation | (optional) |
FileSize |
Package size in bytes | 1024000 |
PackagePath |
Local path for direct download | (optional) |
{
"SecureBootWatcher": {
"ClientUpdate": {
"CheckForUpdates": true,
"AutoDownloadEnabled": false,
"AutoInstallEnabled": false,
"NotifyOnUpdateAvailable": true
}
}
}Configuration Fields:
| Field | Description | Default | Recommendation |
|---|---|---|---|
CheckForUpdates |
Enable version checking | true |
? Keep enabled |
AutoDownloadEnabled |
Automatically download updates | false |
?? Use with caution |
AutoInstallEnabled |
Automatically install updates | false |
? Not recommended for production |
NotifyOnUpdateAvailable |
Add alert to report | true |
? Recommended |
Every report now includes the client version:
{
"device": {
"machineName": "DESKTOP-123",
"clientVersion": "1.0.0.0"
}
}???????????????????
? Client Starts ?
???????????????????
?
?
???????????????????????????
? ReportBuilder.BuildAsync?
???????????????????????????
?
?
????????????????????????????????
? IClientUpdateService.Check ?
? API/ClientUpdate/check?ver= ?
????????????????????????????????
?
?
???????????
? Update ?
?Available?
???????????
?
???????????????
? Yes ? No
? ?
??????????? ????????????
? Add ? ? Continue ?
? Alert ? ? Normally ?
??????????? ????????????
Update Available (Informational):
?? Client update available: Version 1.2.0 (current: 1.0.0)
Update Required (Warning):
?? CLIENT UPDATE REQUIRED: Version 1.2.0 is available (current: 1.0.0). Update is mandatory.
If AutoDownloadEnabled = true:
- Client downloads package to
%TEMP%\SecureBootWatcher-Update - Validates checksum (if provided)
- Stores path for later installation
If AutoInstallEnabled = true (requires AutoDownloadEnabled = true):
- Creates PowerShell update script
- Creates one-time scheduled task to run 10 seconds after client exits
- Task performs:
- Waits for client process to exit
- Backs up current version
- Copies new files
- Restarts scheduled task
- Self-deletes
Returns latest version information.
Response:
{
"latestVersion": "1.2.0.0",
"releaseDate": "2025-01-15T10:00:00Z",
"downloadUrl": "https://...",
"isUpdateRequired": false,
"minimumVersion": "1.0.0.0",
"releaseNotes": "Bug fixes",
"checksum": "sha256-hash",
"fileSize": 1024000
}Checks if update is available for a specific version.
Response:
{
"currentVersion": "1.0.0.0",
"latestVersion": "1.2.0.0",
"updateAvailable": true,
"updateRequired": false,
"downloadUrl": "https://...",
"releaseNotes": "Bug fixes"
}Downloads the latest client package directly from the API.
Response: application/zip file
Adds ClientVersion column to Devices table:
ALTER TABLE Devices ADD ClientVersion nvarchar(50) NULL;Apply Migration:
dotnet ef database update --project SecureBootDashboard.ApiConfiguration:
{
"CheckForUpdates": true,
"AutoDownloadEnabled": false,
"AutoInstallEnabled": false,
"NotifyOnUpdateAvailable": true
}Workflow:
- Client checks for updates on each run
- Alert added to report if update available
- Dashboard shows devices with outdated versions
- IT deploys updates via Intune/GPO/SCCM
Benefits:
- ? Full IT control
- ? Tested deployment process
- ? Audit trail via Intune
- ? Rollback capabilities via Intune
Configuration:
{
"CheckForUpdates": true,
"AutoDownloadEnabled": true,
"AutoInstallEnabled": false,
"NotifyOnUpdateAvailable": true
}Workflow:
- Client checks for updates
- If update available, downloads to temp folder
- Alert indicates "Update downloaded, pending installation"
- IT triggers installation via script or Intune
Benefits:
- ? Faster deployment (pre-downloaded)
- ? Reduced network load during deployment window
- ?? Requires manual installation trigger
Configuration:
{
"CheckForUpdates": true,
"AutoDownloadEnabled": true,
"AutoInstallEnabled": true,
"NotifyOnUpdateAvailable": true
}Workflow:
- Client checks for updates
- Downloads update
- Schedules installation
- Installs after current execution completes
Risks:
- ? No testing before rollout
- ? Potential for fleet-wide failures
- ? Loss of deployment control
- ? Compliance issues
Use Cases:
- Development/testing environments
- Small fleets (<10 devices)
- Hotfix deployment with known good package
Edit appsettings.json:
{
"ClientUpdate": {
"LatestVersion": "1.2.0.0",
"ReleaseDate": "2025-01-15T10:00:00Z",
"DownloadUrl": "https://yourstorageaccount.blob.core.windows.net/client-packages/SecureBootWatcher-Client-1.2.0.zip",
"ReleaseNotes": "Bug fixes and performance improvements"
}
}# Build client
.\scripts\Deploy-Client.ps1 -Configuration Release
# Upload to Azure Blob Storage
$ctx = New-AzStorageContext -StorageAccountName "yourstorageaccount" -UseConnectedAccount
Set-AzStorageBlobContent `
-File ".\client-package\SecureBootWatcher-Client.zip" `
-Container "client-packages" `
-Blob "SecureBootWatcher-Client-1.2.0.zip" `
-Context $ctx$hash = Get-FileHash ".\client-package\SecureBootWatcher-Client.zip" -Algorithm SHA256
Write-Host "Checksum: $($hash.Hash)"Add to appsettings.json:
{
"Checksum": "ABC123DEF456..."
}# If running in IIS
iisreset
# If running as service
Restart-Service SecureBootDashboardApiThe dashboard can display devices with outdated client versions:
SELECT
MachineName,
ClientVersion,
LastSeenUtc,
DATEDIFF(day, LastSeenUtc, GETUTCDATE()) AS DaysSinceLastSeen
FROM Devices
WHERE ClientVersion < '1.2.0.0' -- Latest version
ORDER BY LastSeenUtc DESC;| Machine Name | Client Version | Last Seen | Status |
|---|---|---|---|
| DESKTOP-001 | 1.0.0.0 | 2 days ago | ?? Outdated |
| DESKTOP-002 | 1.2.0.0 | 1 hour ago | ? Up-to-date |
| DESKTOP-003 | 1.1.0.0 | 5 days ago | ?? Outdated |
Always provide a SHA256 checksum for update packages:
Get-FileHash "SecureBootWatcher-Client.zip" -Algorithm SHA256Client verifies checksum before installation (if provided).
The DownloadUrl MUST use HTTPS to prevent man-in-the-middle attacks:
? https://yourstorageaccount.blob.core.windows.net/...
? http://yourstorageaccount.blob.core.windows.net/...
Consider signing the client package with Authenticode:
Set-AuthenticodeSignature -FilePath "SecureBootWatcher.Client.exe" `
-Certificate (Get-ChildItem Cert:\CurrentUser\My\THUMBPRINT)Use Azure Blob Storage with:
- Private containers
- SAS tokens with expiration
- IP restrictions (if possible)
Cause: API endpoint not configured or not accessible.
Fix:
- Verify
WebApi.BaseAddressis correct in client config - Check API is running and accessible
- Verify firewall rules
Cause: Invalid DownloadUrl or network issue.
Fix:
- Verify URL is accessible from client
- Check Azure Storage account permissions
- Review client logs for detailed error
Cause: Scheduled task failed to run.
Fix:
- Check Task Scheduler for
SecureBootWatcher-Updatetask - Review
C:\ProgramData\SecureBootWatcher\update.log - Verify SYSTEM account has permissions
Cause: Migration not applied or old client version.
Fix:
- Apply migration:
dotnet ef database update - Redeploy client with updated version
- Wait for next report
- Use notification-only mode for production
- Test updates in dev/test environments first
- Provide checksums for all packages
- Use HTTPS for download URLs
- Keep Azure Blob Storage private
- Monitor dashboard for outdated devices
- Document version changes in release notes
- Enable auto-install in production without testing
- Use HTTP for download URLs
- Skip checksum validation
- Deploy updates without testing
- Mix update channels (Intune + auto-update)
- Forget to update API configuration
{
"CheckForUpdates": true,
"AutoDownloadEnabled": false,
"AutoInstallEnabled": false,
"NotifyOnUpdateAvailable": true
}- Redeploy clients with version tracking
- Monitor dashboard for version distribution
- Publish test version to API
- Verify alerts appear in reports
- Confirm dashboard shows outdated devices
- Continue using Intune/GPO for deployment
- Use dashboard to track deployment progress
- Alerts help identify devices that missed updates
The Client Version Tracking feature provides:
? Visibility: Know which version is running on each device
? Alerting: Automatic notification when updates are available
? Control: IT retains full control over deployment
? Flexibility: Opt-in auto-update for specific scenarios
? Safety: Rollback capabilities and checksum validation
Recommended Configuration: Notification-only mode with manual deployment via Intune.
Not Recommended: Auto-install in production without extensive testing.
Version: 1.0
Last Updated: 2025-01-09
Related Documentation:
INTUNE_WIN32_DEPLOYMENT.mdDEPLOYMENT_GUIDE.mdREADME.md