Stagger daily scans across early morning
This commit is contained in:
@@ -34,7 +34,10 @@ powershell -ExecutionPolicy Bypass -File .\build\build-release-manifest.ps1 `
|
|||||||
|
|
||||||
The installer creates two Windows Scheduled Tasks running as `SYSTEM`:
|
The installer creates two Windows Scheduled Tasks running as `SYSTEM`:
|
||||||
|
|
||||||
- `OCSentinel Daily Scan`: runs every day at `08:00` and uploads one signed report.
|
- `OCSentinel Daily Scan`: runs once per day and uploads one signed report.
|
||||||
|
The installer deterministically assigns each device a stable slot between
|
||||||
|
`04:00` and `06:59`, derived from its Windows `MachineGuid`. This distributes
|
||||||
|
a fleet rollout instead of sending all reports at the same time.
|
||||||
- `OCSentinel Burst Check`: runs every five minutes. It performs no scan unless
|
- `OCSentinel Burst Check`: runs every five minutes. It performs no scan unless
|
||||||
the NinjaOne device custom field `ocsentinelburst` is enabled.
|
the NinjaOne device custom field `ocsentinelburst` is enabled.
|
||||||
|
|
||||||
|
|||||||
@@ -74,8 +74,21 @@ $scheduledScript = Join-Path $scriptRoot "run-ocsentinel-scheduled.ps1"
|
|||||||
$taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
|
$taskPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
|
||||||
$taskSettings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Minutes 30) -MultipleInstances IgnoreNew
|
$taskSettings = New-ScheduledTaskSettingsSet -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Minutes 30) -MultipleInstances IgnoreNew
|
||||||
|
|
||||||
|
# Spread fleet uploads across the early-morning window while keeping each device's slot stable.
|
||||||
|
$machineGuid = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Cryptography" -Name "MachineGuid").MachineGuid
|
||||||
|
$guidBytes = [Text.Encoding]::UTF8.GetBytes([string]$machineGuid)
|
||||||
|
$sha256 = [Security.Cryptography.SHA256]::Create()
|
||||||
|
try {
|
||||||
|
$slotHash = $sha256.ComputeHash($guidBytes)
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
$sha256.Dispose()
|
||||||
|
}
|
||||||
|
$dailySlotMinutes = [BitConverter]::ToUInt32($slotHash, 0) % 180
|
||||||
|
$dailyRunAt = (Get-Date -Hour 4 -Minute 0 -Second 0).AddMinutes($dailySlotMinutes)
|
||||||
|
|
||||||
$dailyAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scheduledScript`" -Kind daily" -WorkingDirectory $scriptRoot
|
$dailyAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scheduledScript`" -Kind daily" -WorkingDirectory $scriptRoot
|
||||||
$dailyTrigger = New-ScheduledTaskTrigger -Daily -At 08:00
|
$dailyTrigger = New-ScheduledTaskTrigger -Daily -At $dailyRunAt
|
||||||
Register-ScheduledTask -TaskName "OCSentinel Daily Scan" -Action $dailyAction -Trigger $dailyTrigger -Principal $taskPrincipal -Settings $taskSettings -Description "OfficeCom Sentinel daily signed scan and upload." -Force | Out-Null
|
Register-ScheduledTask -TaskName "OCSentinel Daily Scan" -Action $dailyAction -Trigger $dailyTrigger -Principal $taskPrincipal -Settings $taskSettings -Description "OfficeCom Sentinel daily signed scan and upload." -Force | Out-Null
|
||||||
|
|
||||||
$burstAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scheduledScript`" -Kind burst" -WorkingDirectory $scriptRoot
|
$burstAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$scheduledScript`" -Kind burst" -WorkingDirectory $scriptRoot
|
||||||
@@ -87,4 +100,4 @@ Write-Host "Main path: $installRoot"
|
|||||||
Write-Host "Runner: $(Join-Path $scriptRoot 'run-ocsentinel.ps1')"
|
Write-Host "Runner: $(Join-Path $scriptRoot 'run-ocsentinel.ps1')"
|
||||||
Write-Host "Monitor: $(Join-Path $scriptRoot 'run-ocsentinel-monitor.ps1')"
|
Write-Host "Monitor: $(Join-Path $scriptRoot 'run-ocsentinel-monitor.ps1')"
|
||||||
Write-Host "Updater: $(Join-Path $scriptRoot 'update-ocsentinel.ps1')"
|
Write-Host "Updater: $(Join-Path $scriptRoot 'update-ocsentinel.ps1')"
|
||||||
Write-Host "Schedule: Daily scan at 08:00; burst check every 5 minutes."
|
Write-Host "Schedule: Daily scan at $($dailyRunAt.ToString('HH:mm')) (deterministic 04:00-06:59 slot); burst check every 5 minutes."
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"channel": "stable",
|
"channel": "stable",
|
||||||
"version": "1.3.0",
|
"version": "1.3.2",
|
||||||
"publishedAtUtc": "2026-07-26T00:16:43.0355921Z",
|
"publishedAtUtc": "2026-07-26T00:23:31.3024295Z",
|
||||||
"artifactUrl": "https://gitea.officecom.cloud/officecom/oc-sentinel/releases/download/v1.3.0/OCSentinelClient-win-x64.zip",
|
"artifactUrl": "https://gitea.officecom.cloud/officecom/oc-sentinel/releases/download/v1.3.2/OCSentinelClient-win-x64.zip",
|
||||||
"sha256": "35dfc6e1022da0e7c4ae26d656c6c588365fd152deb5b29c1ff2d5ea95c8ac56",
|
"sha256": "dbfedf0890176873cef8bc91b9f7a6d6c3c8382ffadc972324b9900bad1153cc",
|
||||||
"minUpdaterVersion": "1.0.0"
|
"minUpdaterVersion": "1.0.0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,10 @@
|
|||||||
<RootNamespace>OCSentinelCli</RootNamespace>
|
<RootNamespace>OCSentinelCli</RootNamespace>
|
||||||
<Product>OfficeCom Sentinel</Product>
|
<Product>OfficeCom Sentinel</Product>
|
||||||
<Company>OfficeCom</Company>
|
<Company>OfficeCom</Company>
|
||||||
<Version>1.3.0</Version>
|
<Version>1.3.2</Version>
|
||||||
<AssemblyVersion>1.3.0.0</AssemblyVersion>
|
<AssemblyVersion>1.3.2.0</AssemblyVersion>
|
||||||
<FileVersion>1.3.0.0</FileVersion>
|
<FileVersion>1.3.2.0</FileVersion>
|
||||||
<InformationalVersion>1.3.0</InformationalVersion>
|
<InformationalVersion>1.3.2</InformationalVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
Reference in New Issue
Block a user