Eseguire query sui log di Gestione aggiornamenti

Oltre ai dettagli indicati durante la distribuzione di Gestione aggiornamenti, è possibile eseguire ricerche nei log archiviati nell'area di lavoro Log Analytics. Per cercare i log dall'account di automazione, selezionare Gestione aggiornamenti e aprire l'area di lavoro Log Analytics associata alla distribuzione.

È anche possibile personalizzare le query sui log o usarle da client diversi. Vedere Documentazione dell'API di ricerca di Log Analytics.

Eseguire una query sui record di aggiornamento

Gestione aggiornamenti raccoglie i record per le macchine virtuali Windows e Linux e i tipi di dati visualizzati nei risultati della ricerca log. Nelle sezioni seguenti vengono descritti i record.

Eseguire una query su un record di aggiornamento

Viene creato un record con un tipo di Update che rappresenta gli aggiornamenti disponibili e il relativo stato di installazione per un computer. Questi record includono le proprietà elencate nella tabella seguente:

Proprietà Descrizione
TenantId Identificatore univoco che rappresenta l'istanza dell'organizzazione dell'ID Microsoft Entra.
SourceSystem Sistema di origine per il record. Il valore è OperationsManager.
TimeGenerated Data e ora di creazione del record.
SourceComputerId Identificatore univoco che rappresenta il computer di origine.
Titolo Il titolo dell'aggiornamento.
Classificazione Classificazione dell'approvazione. Il valore è Updates.
PublishedDate (UTC) Data in cui l'aggiornamento è pronto per il download e l'installazione da Windows Update.
Computer Nome di dominio completo del computer per la creazione del report.
UpdateState Stato attuale del problema.
Prodotto Prodotti per i quali l'aggiornamento è applicabile.
OSType Tipo di sistema operativo. I valori sono Windows o Linux.
ProductVersion Versione dell'aggiornamento.
Product Arch Architettura del computer applicabile
CVENumbers Numero di vulnerabilità ed esposizioni comuni
BulletinUrl URL del bollettino
Id bollettino Numero ID bollettino.
PackageRepository Informazioni sul repository del pacchetto.
PackageSeverity Gravità dell'aggiornamento.
OSName Tipo di sistema operativo. I valori sono Windows o Linux.
OSVersion Versione del sistema operativo.
OSFullName Nome del sistema operativo.
SubscriptionId Identificatore univoco per la sottoscrizione di Azure.
ResourceGroup Nome del gruppo di risorse a cui appartiene la risorsa.
ResourceProvider Provider di risorse.
Risorsa Nome della risorsa.
ResourceId Identificatore univoco per la risorsa associata al record.
ResourceType Tipo di risorsa.
ComputerEnvironment Ambiente. I valori possibili sono Azure o non Azure.
VMUUID Identificatore univoco per la macchina virtuale.
MG Identificatore univoco per il gruppo di gestione o l'area di lavoro Log Analytics.
ManagementGroupName Nome del gruppo di gestione Operations Manager o dell'area di lavoro Log Analytics.
MSRCSeverity Classificazione di gravità per la vulnerabilità. I valori sono:
Critico
Importante
Moderato
Bassa
KBID ID dell'articolo della Knowledge Base per l'aggiornamento Windows.
UpdateID Identificatore univoco dell'aggiornamento software.
RevisionNumber Numero di una revisione specifica di un aggiornamento.
Facoltativo True se il record è facoltativo; in caso contrario False.
RebootBehavior Comportamento del riavvio dopo l'installazione o la disinstallazione di un aggiornamento.
MSRCBulletinID Numero ID bollettino di sicurezza.
Approvata True se il record è approvato; in caso contrario False.
ApprovalSource Si applica solo al sistema operativo Windows. Origine dell'approvazione per il record. Il valore è Microsoft Update.
InstallTimePredictionSeconds
InstallTimeDeviationRangeSeconds
InstallTimeAvailable
Tipo Tipo di record. Il valore è Update.

Eseguire una query sui record dello stato di distribuzione dell'aggiornamento

Viene creato un record con un tipo di UpdateRunProgress che fornisce lo stato di distribuzione dell'aggiornamento di una distribuzione pianificata per computer. Questi record includono le proprietà elencate nella tabella seguente:

Proprietà Descrizione
TenantId Identificatore univoco che rappresenta l'istanza dell'organizzazione dell'ID Microsoft Entra.
SourceSystem Sistema di origine per il record. Il valore è OperationsManager.
TimeGenerated Data e ora di creazione del record.
MG Identificatore univoco per il gruppo di gestione o l'area di lavoro Log Analytics.
ManagementGroupName Nome del gruppo di gestione Operations Manager o dell'area di lavoro Log Analytics.
SourceComputerId Identificatore univoco che rappresenta il computer di origine.
KBID ID dell'articolo della Knowledge Base per l'aggiornamento Windows.
UpdateId Identificatore univoco dell'aggiornamento software.
SucceededOnRetry Valore che indica se l'esecuzione dell'aggiornamento non è riuscita al primo tentativo e se l'operazione corrente è un nuovo tentativo.
ErrorResult Codice di errore di Windows Update generato se l'installazione di un aggiornamento non riesce.
UpdateRunName Nome della pianificazione dell'aggiornamento.
InstallationStatus Possibili stati di installazione di un aggiornamento nel computer client.
NotStarted - il processo non è stato ancora attivato.
Failed - il processo è stato avviato, ma non è riuscito con un'eccezione.
InProgress - processo in corso.
MaintenanceWindowExceeded - se l'esecuzione è in corso, ma è stato raggiunto l'intervallo della finestra di manutenzione.
Succeeded - processo completato.
Install Failed - installazione dell'aggiornamento non riuscita.
NotIncluded : la classificazione dell'aggiornamento corrispondente non corrisponde alle voci del cliente nell'elenco di classificazione di input.
Excluded : l'utente immette un KBID nell'elenco escluso. Durante l'applicazione di patch, se KBID nell'elenco escluso corrisponde all'ID kb di aggiornamento rilevato dal sistema, viene contrassegnato come escluso.
Computer Nome di dominio completo del computer per la creazione del report.
Titolo Il titolo dell'aggiornamento.
Prodotto Prodotti per i quali l'aggiornamento è applicabile.
OSType Tipo di sistema operativo. I valori sono Windows o Linux.
StartTime (UTC) Ora pianificata per l'installazione dell'aggiornamento. Questa proprietà non è attualmente utilizzata. Vedere TimeGenerated.
EndTime (UTC) Data e ora di fine del processo di sincronizzazione. Questa proprietà non è attualmente utilizzata. Vedere TimeGenerated.
CorrelationId Identificatore univoco dell'esecuzione del processo runbook per l'aggiornamento.
SubscriptionId Identificatore univoco per la sottoscrizione di Azure.
ResourceGroup Nome del gruppo di risorse a cui appartiene la risorsa.
ResourceProvider Provider di risorse.
Risorsa Nome della risorsa.
ResourceId Identificatore univoco per la risorsa associata al record.
ResourceType Tipo di risorsa.
ComputerEnvironment Ambiente. I valori sono Azure o non Azure.
VMUUID Identificatore univoco per la macchina virtuale.
Tipo Tipo di aggiornamento. Il valore è UpdateRunProgress.
_ResourceId Identificatore univoco per la risorsa associata al record.

Eseguire una query sui record di riepilogo aggiornamento

Viene creato un record con un tipo di UpdateSummary che fornisce il riepilogo degli aggiornamenti per computer. Questi record includono le proprietà elencate nella tabella seguente:

Proprietà Descrizione
TenantId Identificatore univoco che rappresenta l'istanza dell'organizzazione dell'ID Microsoft Entra.
SourceSystem Sistema di origine per il record. Il valore è OpsManager.
TimeGenerated Data e ora di creazione del record.
MG Identificatore univoco per il gruppo di gestione o l'area di lavoro Log Analytics.
ManagementGroupName Nome del gruppo di gestione Operations Manager o dell'area di lavoro Log Analytics.
SourceComputerId Identificatore univoco per la macchina virtuale.
LastUpdateApplied (UTC)
OldestMissingSecurityUpdateInDays Numero totale di giorni per l'aggiornamento meno recente rilevato come applicabile che non è stato installato.
OldestMissingSecurityUpdateBucket Identificatore del bucket di sicurezza mancante meno recente. I valori sono:
Recente se il valore è inferiore a 30 giorni
30 giorni fa
60 giorni fa
90 giorni fa
120 giorni fa
150 giorni fa
180 giorni fa
Meno recente quando il valore è maggiore di 180 giorni.
WindowsUpdateSetting Stato dell'agente di Windows Update. I valori possibili sono:
Scheduled installation
Notify before installation
Error returned from unhealthy WUA agent
WindowsUpdateAgentVersion Versione dell'agente di Windows Update.
WSUSServer Errori se si verifica un problema nell'agente di Windows Update, per facilitare la risoluzione dei problemi.
Computer Nome di dominio completo del computer per la creazione del report.
OsVersion Versione del sistema operativo.
NETRuntimeVersion Versione di .NET Framework installata nel computer Windows.
CriticalUpdatesMissing Numero di aggiornamenti critici applicabili mancanti.
SecurityUpdatesMissing Numero di aggiornamenti della sicurezza mancanti applicabili.
OtherUpdatesMissing Conteggio degli aggiornamenti rilevati mancanti.
TotalUpdatesMissing Numero totale di aggiornamenti mancanti applicabili.
RestartPending True se un riavvio è in sospeso; in caso contrario False.
SubscriptionId Identificatore univoco per la sottoscrizione di Azure.
ResourceGroup Nome del gruppo di risorse che contiene la risorsa.
ResourceProvider Provider di risorse.
Risorsa Nome della risorsa per il record.
ResourceId Identificatore univoco per la risorsa associata al record.
ResourceType Tipo di risorsa.
ComputerEnvironment Ambiente. I valori sono Azure o non Azure.
VMUUID Identificatore univoco per la macchina virtuale.
Tipo Tipo di record. Il valore è UpdateSummary.
_ResourceId Identificatore univoco per la risorsa associata al record.

Query di esempio

Le sezioni seguenti contengono esempi di query di ricerca sui log per i record di aggiornamento raccolti per Gestione aggiornamenti.

Verificare che i computer non Azure siano abilitati per Gestione aggiornamenti

Per verificare che i computer connessi direttamente comunichino con i log di Monitoraggio di Azure, eseguire una di queste ricerche log.

Linux

Heartbeat
| where OSType == "Linux" | summarize arg_max(TimeGenerated, *) by SourceComputerId | top 500000 by Computer asc | render table

Windows

Heartbeat
| where OSType == "Windows" | summarize arg_max(TimeGenerated, *) by SourceComputerId | top 500000 by Computer asc | render table

In un computer Windows la connettività degli agenti con i log di Monitoraggio di Azure può essere verificata esaminando le informazioni seguenti:

  1. Aprire Microsoft Monitoring Agent nel Pannello di controllo. Nella scheda Analisi dei log di Azure l'agente visualizza un messaggio per indicare che Microsoft Monitoring Agent ha eseguito la connessione a Log Analytics.

  2. Aprire il registro eventi di Windows. Passare a Registri applicazioni e servizi\Operations Manager e cercare gli ID evento 3000 e 5002 del connettore del servizio di origine. Questi eventi indicano che il computer ha eseguito la registrazione all'area di lavoro di Log Analytics e sta ricevendo la configurazione.

Se l'agente non è in grado di comunicare con i log di Monitoraggio di Azure ed è configurato in modo da comunicare con Internet attraverso un firewall o un server proxy, verificare che il firewall o il server proxy sia configurato correttamente. Per sapere come verificare se il firewall o il server proxy è configurato correttamente, vedere Connettere computer Windows al servizio Log Analytics in Azure oppure Raccogliere dati dal computer Linux ospitato nell'ambiente in uso.

Nota

Se i sistemi Linux sono configurati per la comunicazione con un proxy o il gateway di Log Analytics e si sta abilitando Gestione aggiornamenti, aggiornare le autorizzazioni proxy.conf per concedere al gruppo omiuser le necessarie autorizzazioni di lettura per il file usando i comandi seguenti:

sudo chown omsagent:omiusers /etc/opt/microsoft/omsagent/proxy.conf sudo chmod 644 /etc/opt/microsoft/omsagent/proxy.conf

Gli agenti Linux appena aggiunti visualizzano lo stato Aggiornato dopo l'esecuzione di una valutazione. Il processo può richiedere fino a 6 ore.

Per verificare che un gruppo di gestione di Operations Manager comunichi con i log di Monitoraggio di Azure, vedere Convalidare l'integrazione di Operations Manager con i log di Monitoraggio di Azure.

Singole query di valutazione delle macchine virtuali di Azure (Windows)

Sostituire il valore VMUUID con il GUID VM della macchina virtuale per cui si esegue la query. Per trovare il VMUUID da usare, eseguire la query seguente sui log di Monitoraggio di Azure: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Riepilogo degli aggiornamenti mancanti

Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and VMUUID=~"b08d5afa-1471-4b52-bd95-a44fea6e4ca8"
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| summarize by UpdateID, Classification
| summarize allUpdatesCount=count(), criticalUpdatesCount=countif(Classification has "Critical"), securityUpdatesCount=countif(Classification has "Security"), otherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security")

Elenco degli aggiornamenti mancanti

Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and VMUUID=~"8bf1ccc6-b6d3-4a0b-a643-23f346dfdf82"
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Title, KBID, PublishedDate, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| project-away UpdateState, Approved, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), displayName=any(Title), publishedDate=min(PublishedDate), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(UpdateID, "_", KBID), classification=Classification, InformationId=strcat("KB", KBID), InformationUrl=iff(isnotempty(KBID), strcat("https://support.microsoft.com/kb/", KBID), ""), osType=2
| sort by ClassificationWeight desc, computersCount desc, displayName asc
| extend informationLink=(iff(isnotempty(InformationId) and isnotempty(InformationUrl), toobject(strcat('{ "uri": "', InformationUrl, '", "text": "', InformationId, '", "target": "blank" }')), toobject('')))
| project-away ClassificationWeight, InformationId, InformationUrl

Singole query di valutazione delle macchine virtuali di Azure (Linux)

Per alcune distribuzioni Linux esiste una mancata corrispondenza tra l'ordine dei byte con il valore VMUUID di Azure Resource Manager e quello archiviato nei log di Monitoraggio di Azure. La query seguente verifica la presenza di una corrispondenza in uno degli ordini di byte. Sostituire i valori VMUUID con il formato big-endian e little-endian del GUID in modo che i risultati vengano restituiti correttamente. Per trovare il VMUUID da usare, eseguire la query seguente sui log di Monitoraggio di Azure: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Riepilogo degli aggiornamenti mancanti

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and (VMUUID=~"625686a0-6d08-4810-aae9-a089e68d4911" or VMUUID=~"a0865662-086d-1048-aae9-a089e68d4911")
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification) by Computer, SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| summarize by Product, ProductArch, Classification
| summarize allUpdatesCount=count(), criticalUpdatesCount=countif(Classification has "Critical"), securityUpdatesCount=countif(Classification has "Security"), otherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security")

Elenco degli aggiornamenti mancanti

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and (VMUUID=~"625686a0-6d08-4810-aae9-a089e68d4911" or VMUUID=~"a0865662-086d-1048-aae9-a089e68d4911")
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, BulletinUrl, BulletinID) by Computer, SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| project-away UpdateState, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(Product, "_", ProductArch), displayName=Product, productArch=ProductArch, classification=Classification, InformationId=BulletinID, InformationUrl=tostring(split(BulletinUrl, ";", 0)[0]), osType=1
| sort by ClassificationWeight desc, computersCount desc, displayName asc
| extend informationLink=(iff(isnotempty(InformationId) and isnotempty(InformationUrl), toobject(strcat('{ "uri": "', InformationUrl, '", "text": "', InformationId, '", "target": "blank" }')), toobject('')))
| project-away ClassificationWeight, InformationId, InformationUrl

Query di valutazione per più macchine virtuali

Riepilogo dei computer

Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(14h) and OSType!="Linux"
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Approved, Optional, Classification) by SourceComputerId, UpdateID
    | distinct SourceComputerId, Classification, UpdateState, Approved, Optional
    | summarize WorstMissingUpdateSeverity=max(iff(UpdateState=~"Needed" and (Optional==false or Classification has "Critical" or Classification has "Security") and Approved!=false, iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1)), 0)) by SourceComputerId
)
on SourceComputerId
| extend WorstMissingUpdateSeverity=coalesce(WorstMissingUpdateSeverity, -1)
| summarize computersBySeverity=count() by WorstMissingUpdateSeverity
| union (Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(5h) and OSType=="Linux"
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification) by SourceComputerId, Product, ProductArch
    | distinct SourceComputerId, Classification, UpdateState
    | summarize WorstMissingUpdateSeverity=max(iff(UpdateState=~"Needed", iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1)), 0)) by SourceComputerId
)
on SourceComputerId
| extend WorstMissingUpdateSeverity=coalesce(WorstMissingUpdateSeverity, -1)
| summarize computersBySeverity=count() by WorstMissingUpdateSeverity)
| summarize assessedComputersCount=sumif(computersBySeverity, WorstMissingUpdateSeverity>-1), notAssessedComputersCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==-1), computersNeedCriticalUpdatesCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==4), computersNeedSecurityUpdatesCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==2), computersNeedOtherUpdatesCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==1), upToDateComputersCount=sumif(computersBySeverity, WorstMissingUpdateSeverity==0)
| summarize assessedComputersCount=sum(assessedComputersCount), computersNeedCriticalUpdatesCount=sum(computersNeedCriticalUpdatesCount),  computersNeedSecurityUpdatesCount=sum(computersNeedSecurityUpdatesCount), computersNeedOtherUpdatesCount=sum(computersNeedOtherUpdatesCount), upToDateComputersCount=sum(upToDateComputersCount), notAssessedComputersCount=sum(notAssessedComputersCount)
| extend allComputersCount=assessedComputersCount+notAssessedComputersCount

Riepilogo degli aggiornamenti mancanti

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification) by Computer, SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| summarize by Product, ProductArch, Classification
| union (Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| summarize by UpdateID, Classification )
| summarize allUpdatesCount=count(), criticalUpdatesCount=countif(Classification has "Critical"), securityUpdatesCount=countif(Classification has "Security"), otherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security")

Elenco dei computer

Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions, Computer, ResourceId, ComputerEnvironment, VMUUID) by SourceComputerId
| where Solutions has "updates"
| extend vmuuId=VMUUID, azureResourceId=ResourceId, osType=1, environment=iff(ComputerEnvironment=~"Azure", 1, 2), scopedToUpdatesSolution=true, lastUpdateAgentSeenTime=""
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(5h) and OSType=="Linux" and SourceComputerId in ((Heartbeat
    | where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
    | summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
    | where Solutions has "updates"
    | distinct SourceComputerId))
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Product, Computer, ComputerEnvironment) by SourceComputerId, Product, ProductArch
    | summarize Computer=any(Computer), ComputerEnvironment=any(ComputerEnvironment), missingCriticalUpdatesCount=countif(Classification has "Critical" and UpdateState=~"Needed"), missingSecurityUpdatesCount=countif(Classification has "Security" and UpdateState=~"Needed"), missingOtherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security" and UpdateState=~"Needed"), lastAssessedTime=max(TimeGenerated), lastUpdateAgentSeenTime="" by SourceComputerId
    | extend compliance=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0, 2, 1)
    | extend ComplianceOrder=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0 or missingOtherUpdatesCount > 0, 1, 3)
)
on SourceComputerId
| project id=SourceComputerId, displayName=Computer, sourceComputerId=SourceComputerId, scopedToUpdatesSolution=true, missingCriticalUpdatesCount=coalesce(missingCriticalUpdatesCount, -1), missingSecurityUpdatesCount=coalesce(missingSecurityUpdatesCount, -1), missingOtherUpdatesCount=coalesce(missingOtherUpdatesCount, -1), compliance=coalesce(compliance, 4), lastAssessedTime, lastUpdateAgentSeenTime, osType=1, environment=iff(ComputerEnvironment=~"Azure", 1, 2), ComplianceOrder=coalesce(ComplianceOrder, 2)
| union(Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions, Computer, ResourceId, ComputerEnvironment, VMUUID) by SourceComputerId
| where Solutions has "updates"
| extend vmuuId=VMUUID, azureResourceId=ResourceId, osType=2, environment=iff(ComputerEnvironment=~"Azure", 1, 2), scopedToUpdatesSolution=true, lastUpdateAgentSeenTime=""
| join kind=leftouter
(
    Update
    | where TimeGenerated>ago(14h) and OSType!="Linux" and SourceComputerId in ((Heartbeat
    | where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
    | summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
    | where Solutions has "updates"
    | distinct SourceComputerId))
    | summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Title, Optional, Approved, Computer, ComputerEnvironment) by Computer, SourceComputerId, UpdateID
    | summarize Computer=any(Computer), ComputerEnvironment=any(ComputerEnvironment), missingCriticalUpdatesCount=countif(Classification has "Critical" and UpdateState=~"Needed" and Approved!=false), missingSecurityUpdatesCount=countif(Classification has "Security" and UpdateState=~"Needed" and Approved!=false), missingOtherUpdatesCount=countif(Classification !has "Critical" and Classification !has "Security" and UpdateState=~"Needed" and Optional==false and Approved!=false), lastAssessedTime=max(TimeGenerated), lastUpdateAgentSeenTime="" by SourceComputerId
    | extend compliance=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0, 2, 1)
    | extend ComplianceOrder=iff(missingCriticalUpdatesCount > 0 or missingSecurityUpdatesCount > 0 or missingOtherUpdatesCount > 0, 1, 3)
)
on SourceComputerId
| project id=SourceComputerId, displayName=Computer, sourceComputerId=SourceComputerId, scopedToUpdatesSolution=true, missingCriticalUpdatesCount=coalesce(missingCriticalUpdatesCount, -1), missingSecurityUpdatesCount=coalesce(missingSecurityUpdatesCount, -1), missingOtherUpdatesCount=coalesce(missingOtherUpdatesCount, -1), compliance=coalesce(compliance, 4), lastAssessedTime, lastUpdateAgentSeenTime, osType=2, environment=iff(ComputerEnvironment=~"Azure", 1, 2), ComplianceOrder=coalesce(ComplianceOrder, 2) )
| order by ComplianceOrder asc, missingCriticalUpdatesCount desc, missingSecurityUpdatesCount desc, missingOtherUpdatesCount desc, displayName asc
| project-away ComplianceOrder

Elenco degli aggiornamenti mancanti

Update
| where TimeGenerated>ago(5h) and OSType=="Linux" and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=="Linux" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, BulletinUrl, BulletinID) by SourceComputerId, Product, ProductArch
| where UpdateState=~"Needed"
| project-away UpdateState, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(Product, "_", ProductArch), displayName=Product, productArch=ProductArch, classification=Classification, InformationId=BulletinID, InformationUrl=tostring(split(BulletinUrl, ";", 0)[0]), osType=1
| union(Update
| where TimeGenerated>ago(14h) and OSType!="Linux" and (Optional==false or Classification has "Critical" or Classification has "Security") and SourceComputerId in ((Heartbeat
| where TimeGenerated>ago(12h) and OSType=~"Windows" and notempty(Computer)
| summarize arg_max(TimeGenerated, Solutions) by SourceComputerId
| where Solutions has "updates"
| distinct SourceComputerId))
| summarize hint.strategy=partitioned arg_max(TimeGenerated, UpdateState, Classification, Title, KBID, PublishedDate, Approved) by Computer, SourceComputerId, UpdateID
| where UpdateState=~"Needed" and Approved!=false
| project-away UpdateState, Approved, TimeGenerated
| summarize computersCount=dcount(SourceComputerId, 2), displayName=any(Title), publishedDate=min(PublishedDate), ClassificationWeight=max(iff(Classification has "Critical", 4, iff(Classification has "Security", 2, 1))) by id=strcat(UpdateID, "_", KBID), classification=Classification, InformationId=strcat("KB", KBID), InformationUrl=iff(isnotempty(KBID), strcat("https://support.microsoft.com/kb/", KBID), ""), osType=2)
| sort by ClassificationWeight desc, computersCount desc, displayName asc
| extend informationLink=(iff(isnotempty(InformationId) and isnotempty(InformationUrl), toobject(strcat('{ "uri": "', InformationUrl, '", "text": "', InformationId, '", "target": "blank" }')), toobject('')))
| project-away ClassificationWeight, InformationId, InformationUrl

Passaggi successivi