After the rebase onto 1.4 the 16 SQLI-WIN/SQLI-SYN scripts had their own /* */ format, so SqlScriptTests (rule ids, review header, -- Kilde: blocks) failed. - The scripts have main's header (Regel-id, Titel, Alvor, Versioner, Vurdering, Grænseværdier, Rettigheder, Data kommer fra, Regelkode, Read-only); the Windows WQL/XPath stays word for word in comments. - The synthetic SQL check's SQL is registered (SyntheticCheckRunner.UseDatabaseSql, BeginTransactionSql, RollbackSql, SyntheticCheckSettings.DefaultQuery) and shown as -- Kilde: blocks in SQLI-SYN-001/002 and _collectors/SyntheticCheckRunner.sql. - SqlScriptTests know ServerRuleCatalog; only those rules may be without SQL blocks. - ServerScriptTests: every CimQueries query/filter is in a SQLI-WIN script word for word. - The SQL check cancels the rest of a large answer instead of draining it on close. - Rule counts: README (108 built-in: 92 SQL Server + 13 Windows + 3 synthetic), SQL Scripts/README (rule table, 124 rules, Windows/synthetic section), RuleCatalogTests, CONTRIBUTING (how to add a server rule). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
45 lines
3.2 KiB
SQL
45 lines
3.2 KiB
SQL
-- ===================================================================================================================
|
||
-- SQLI-WIN-013: En planlagt opgave kørte ikke, da den skulle
|
||
-- ===================================================================================================================
|
||
-- Regel-id: SQLI-WIN-013
|
||
-- Titel: En planlagt opgave kørte ikke, da den skulle
|
||
-- Alvor: Medium.
|
||
-- Versioner: Windows Server 2012 og nyere.
|
||
--
|
||
-- Hvad tjekkes, og hvorfor:
|
||
-- Opgaven skulle have kørt, men gjorde det ikke: Opgavestyring kørte ikke, betingelserne var ikke opfyldt (fx "kun når
|
||
-- brugeren er logget på"), eller serveren var slukket. Det, opgaven gør, er ikke sket.
|
||
--
|
||
-- Vurdering (sker i C# ud fra de indsamlede data, ikke på den overvågede server):
|
||
-- Et fund pr. aktiveret, overvåget opgave, der ikke kører nu, og hvor enten NumberOfMissedRuns > 0, eller NextRunTime
|
||
-- ligger mere end LateMinutes i fortiden, uden at LastRunTime er efter det tidspunkt.
|
||
--
|
||
-- Grænseværdier (agentens appsettings.json):
|
||
-- SQLInsight:Servers:Tasks:LateMinutes standard 60 (næste kørsel mere end så mange minutter i fortiden)
|
||
-- SQLInsight:Servers:Tasks:IncludeMicrosoftTasks standard false
|
||
-- SQLInsight:Servers:Tasks:Ignore opgaver der aldrig overvåges
|
||
--
|
||
-- Rettigheder på den overvågede server (db/permissions/grant-windows-server.ps1, aldrig lokal administrator):
|
||
-- WMI Enable Account/Remote Enable på root\Microsoft\Windows\TaskScheduler (se SQLI-WIN-012 om GetInfo over WinRM).
|
||
--
|
||
-- Data kommer fra (collector, fil – medlemmer, interval):
|
||
-- src/SQLInsight.Servers/CimWindowsServerSource.cs – Session.GetTasksAsync (CimQueries.TaskQuery og
|
||
-- PS_ScheduledTask.GetInfoByName), hvert 15. minut fra src/SQLInsight.Agent/Servers/ServerMonitor.cs – CollectTasksAsync.
|
||
-- Regelkode: src/SQLInsight.Rules/Servers/WindowsServerRules.cs : MissedScheduledTaskRule
|
||
--
|
||
-- Read-only: Ja. Reglen sender ingen SQL. Agenten læser kun fra Windows: CIM/WQL-forespørgsler (SELECT),
|
||
-- hændelsesloggen og for planlagte opgaver Task Schedulers skrivebeskyttede GetInfo. Den starter, stopper
|
||
-- eller ændrer intet på serveren. Filen indeholder kun kommentarer; forespørgslerne mod Windows står herunder.
|
||
-- ===================================================================================================================
|
||
|
||
-- Reglen bruger ikke SQL. Forespørgslerne mod Windows står herunder; filen indeholder kun kommentarer og ændrer intet.
|
||
--
|
||
-- CIM/WQL (namespace root\Microsoft\Windows\TaskScheduler):
|
||
-- SELECT TaskName, TaskPath, State FROM MSFT_ScheduledTask
|
||
-- CIM-metode (skrivebeskyttet) pr. overvåget opgave:
|
||
-- PS_ScheduledTask.GetInfoByName(TaskName, TaskPath) -> cmdletOutput: MSFT_TaskDynamicInfo
|
||
--
|
||
-- Efterprøv med PowerShell (skrivebeskyttet; kør på agentens server som agentens konto):
|
||
-- $s = New-CimSession -ComputerName SERVER
|
||
-- Get-ScheduledTask -CimSession $s | Where-Object { $_.TaskPath -notlike '\Microsoft\*' -and $_.State -ne 'Disabled' } |
|
||
-- Get-ScheduledTaskInfo -CimSession $s | Where-Object { $_.NumberOfMissedRuns -gt 0 -or ($_.NextRunTime -and $_.NextRunTime -lt (Get-Date).AddMinutes(-60)) }
|