Teilen über


Abfragen von Protokollen der Updateverwaltung

Wichtig

Die Updateverwaltung für Automation wurde am 31. August 2024 eingestellt, und es wird empfohlen, Azure Update Manager zu verwenden. Befolgen Sie die Leitfäden für die Migration von der Automation-Updateverwaltung zu Azure Update Manager.

Zusätzlich zu den Details, die während der Bereitstellung der Updateverwaltung bereitgestellt werden, können Sie die in Ihrem Log Analytics-Arbeitsbereich gespeicherten Protokolle durchsuchen. Um die Protokolle von Ihrem Automation-Konto aus zu durchsuchen, wählen Sie Updateverwaltung aus, und öffnen Sie den Log Analytics-Arbeitsbereich, der Ihrer Bereitstellung zugeordnet ist.

Sie können auch die Protokollabfragen anpassen oder sie auf verschiedenen Clients verwenden. Weitere Informationen finden Sie in der Dokumentation zur Such-API von Log Analytics.

Abfragen von Updatedatensätzen

Die Updateverwaltung sammelt Datensätze für Windows- und Linux-VMs und die Datentypen, die in den Protokollsuchergebnissen enthalten sind. In den folgenden Abschnitten werden diese Datensätze beschrieben.

Abfragen von Updatedatensätzen

Ein Datensatz mit dem Typ Update wird erstellt, der die für einen Computer verfügbaren Updates sowie deren Installationsstatus darstellt. Die Eigenschaften der Datensätze sind in der folgenden Tabelle aufgeführt:

Eigenschaft BESCHREIBUNG
TenantId Eindeutiger Bezeichner entsprechend der Microsoft Entra ID-Instanz Ihrer Organisation.
SourceSystem Das Quellsystem des Datensatzes. Der Wert ist OperationsManager.
TimeGenerated Datum und Uhrzeit der Erstellung des Datensatzes.
SourceComputerId Eindeutiger Bezeichner, der den Quellcomputer darstellt.
Titel Der Titel der Aktualisierung.
Klassifizierung Genehmigungsklassifizierung. Der Wert ist „Updates“.
PublishedDate (UTC) Das Datum, an dem das Update zum Download und zur Installation von Windows Update bereit steht.
Computer Vollqualifizierter Domänenname des berichtenden Computers.
UpdateState Der aktuelle Zustand des Updates.
Produkt Die Produkte, für die das Update gilt.
OSType Typ des Betriebssystems. Werte sind Windows oder Linux.
ProductVersion Version des Updates.
Produktarchitektur Zutreffende Computerarchitektur
CVENumbers CVE-Nummer (Common Vulnerabilities and Exposures, allgemeine Sicherheitslücken und Schwachstellen)
BulletinUrl URL des Bulletins
BulletinID ID-Nummer des Bulletins.
PackageRepository Repositoryinformationen des Pakets.
PackageSeverity Schweregrad des Updates.
OSName Typ des Betriebssystems. Werte sind Windows oder Linux.
OSVersion Die Version des Betriebssystems.
OSFullName Name des Betriebssystems.
SubscriptionId Der eindeutige Bezeichner für das Azure-Abonnement.
ResourceGroup Name der Ressourcengruppe, zu der die Ressource gehört.
ResourceProvider Der Ressourcenanbieter.
Ressource Der Name der Ressource.
ResourceId Eindeutiger Bezeichner für die Ressource, der der Datensatz zugeordnet ist.
ResourceType Der Ressurcentyp.
ComputerEnvironment Umgebung Mögliche Werte sind „Azure“ oder „Non-Azure“.
VMUUID Eindeutiger Bezeichner für den virtuellen Computer.
MG Eindeutiger Bezeichner für die Verwaltungsgruppe oder den Log Analytics-Arbeitsbereich.
ManagementGroupName Name der Operations Management-Verwaltungsgruppe oder Log Analytics-Arbeitsbereichs.
MSRCSeverity Bewertung des Schweregrads des Sicherheitsrisiko. Gültige Werte:
Kritisch
Wichtig
Moderat
Niedrig
KBID ID des Knowledge Base-Artikels für das Windows Update.
UpdateID Eindeutiger Bezeichner des Softwareupdates.
revisionnumber Die Revisionsnummer einer bestimmten Revision eines Updates.
Optional TRUE, wenn der Datensatz optional ist, andernfalls FALSE.
RebootBehavior Das Neustartverhalten nach der Installation/Deinstallation eines Updates.
MSRCBulletinID ID-Nummer des Sicherheitsbulletins.
Genehmigt TRUE, wenn der Datensatz genehmigt wird, andernfalls FALSE.
ApprovalSource Gilt nur für das Windows-Betriebssystem. Quelle der Genehmigung für den Datensatz. Der Wert ist „Microsoft Update“.
InstallTimePredictionSeconds
InstallTimeDeviationRangeSeconds
InstallTimeAvailable
Typ Datensatztyp. Der Wert ist „Update“.

Abfragen des Datensatzes zum Bereitstellungsstatus von Updates

Ein Datensatz mit dem Typ UpdateRunProgress wird erstellt, der den Bereitstellungsstatus des Updates einer geplanten Bereitstellung nach Computer bereitstellt. Die Eigenschaften der Datensätze sind in der folgenden Tabelle aufgeführt:

Eigenschaft BESCHREIBUNG
TenantId Eindeutiger Bezeichner entsprechend der Microsoft Entra ID-Instanz Ihrer Organisation.
SourceSystem Das Quellsystem des Datensatzes. Der Wert ist OperationsManager.
TimeGenerated Datum und Uhrzeit der Erstellung des Datensatzes.
MG Eindeutiger Bezeichner für die Verwaltungsgruppe oder den Log Analytics-Arbeitsbereich.
ManagementGroupName Name der Operations Management-Verwaltungsgruppe oder des Log Analytics-Arbeitsbereichs.
SourceComputerId Eindeutiger Bezeichner, der den Quellcomputer darstellt.
KBID ID des Knowledge Base-Artikels für das Windows Update.
UpdateId Eindeutiger Bezeichner des Softwareupdates.
SucceededOnRetry Wert, der angibt, wann die Updateausführung beim ersten Versuch fehlgeschlagen ist und dass der aktuelle Vorgang ein Wiederholungsversuch ist.
ErrorResult Generierter Windows Update-Fehlercode, wenn die Installation eines Updates fehlschlägt.
UpdateRunName Name des Updatezeitplans.
InstallationStatus Die folgenden Installationszustände sind für Updates auf dem Clientcomputer möglich:
NotStarted: Der Auftrag wurde noch nicht ausgelöst.
Failed: Der Auftrag wurde gestartet, ist aber mit einer Ausnahme fehlgeschlagen.
InProgress: Der Auftrag ist in Bearbeitung.
MaintenanceWindowExceeded: Wenn die Ausführung noch nicht erfolgt ist, aber das Wartungsfenster erreicht wurde.
Succeeded: Der Auftrag war erfolgreich.
Install Failed: Die Installation des Updates ist fehlgeschlagen.
NotIncluded: Die Klassifizierung des entsprechenden Updates stimmt nicht mit den Einträgen des Kunden in der Eingabeklassifizierungsliste überein.
Excluded: Der Benutzer gibt eine KBID in die Ausschlussliste ein. Wenn beim Patchen die KBID in der Ausschlussliste mit der vom System erkannten Update-KBID übereinstimmt, wird sie als ausgeschlossen markiert.
Computer Vollqualifizierter Domänenname des berichtenden Computers.
Titel Der Titel der Aktualisierung.
Produkt Die Produkte, für die das Update gilt.
OSType Typ des Betriebssystems. Werte sind Windows oder Linux.
StartTime (UTC) Die Uhrzeit, für die die Installation des Updates geplant ist. Diese Eigenschaft wird derzeit nicht verwendet. Siehe „TimeGenerated“.
EndTime (UTC) Der Zeitpunkt, an dem der Synchronisierungsprozess beendet wurde. Diese Eigenschaft wird derzeit nicht verwendet. Siehe „TimeGenerated“.
CorrelationId Eindeutiger Bezeichner für die Runbookauftragsausführung für das Update.
SubscriptionId Der eindeutige Bezeichner für das Azure-Abonnement.
ResourceGroup Name der Ressourcengruppe, zu der die Ressource gehört.
ResourceProvider Der Ressourcenanbieter.
Ressource Der Name der Ressource.
ResourceId Eindeutiger Bezeichner für die Ressource, der der Datensatz zugeordnet ist.
ResourceType Ressourcentyp:
ComputerEnvironment Umgebung Die Werte sind „Azure“ oder „Non-Azure“.
VMUUID Eindeutiger Bezeichner für den virtuellen Computer.
Typ Die Art von Update: Der Wert ist UpdateRunProgress.
_ResourceId Eindeutiger Bezeichner für die Ressource, der der Datensatz zugeordnet ist.

Abfragen des Datensatzes mit der Updatezusammenfassung

Ein Datensatz mit dem Typ UpdateSummary wird erstellt, der eine Updatezusammenfassung nach Computer bereitstellt. Die Eigenschaften der Datensätze sind in der folgenden Tabelle aufgeführt:

Eigenschaft BESCHREIBUNG
TenantId Eindeutiger Bezeichner entsprechend der Microsoft Entra ID-Instanz Ihrer Organisation.
SourceSystem Das Quellsystem des Datensatzes. Der Wert ist OpsManager.
TimeGenerated Datum und Uhrzeit der Erstellung des Datensatzes.
MG Eindeutiger Bezeichner für die Verwaltungsgruppe oder den Log Analytics-Arbeitsbereich.
ManagementGroupName Name der Operations Management-Verwaltungsgruppe oder des Log Analytics-Arbeitsbereichs.
SourceComputerId Eindeutiger Bezeichner für den virtuellen Computer.
LastUpdateApplied (UTC)
OldestMissingSecurityUpdateInDays Die Gesamtanzahl von Tagen für das älteste erkannte Update, das nicht installiert wurde (sofern zutreffend).
OldestMissingSecurityUpdateBucket Der Spezifizierer des ältesten fehlenden Sicherheitsbuckets. Gültige Werte:
Aktuell, wenn der Wert unter 30 Tagen liegt
vor 30 Tagen
Vor 60 Tagen
Vor 90 Tagen
Vor 120 Tagen
Vor 150 Tagen
Vor 180 Tagen
Älter, wenn der Wert größer als 180 Tage ist.
WindowsUpdateSetting Status des Windows Update-Agents. Dabei sind folgende Werte möglich:
Scheduled installation
Notify before installation
Error returned from unhealthy WUA agent
WindowsUpdateAgentVersion Version des Windows Update-Agents.
WSUSServer Fehlermeldungen, wenn der Windows Update-Agent ein Problem hat, das behandelt werden muss.
Computer Vollqualifizierter Domänenname des berichtenden Computers.
OsVersion Die Version des Betriebssystems.
NETRuntimeVersion Version des auf dem Windows-Computer installierten .NET Frameworks.
CriticalUpdatesMissing Anzahl der anwendbaren wichtigen Updates, die fehlen.
SecurityUpdatesMissing Anzahl der fehlenden anwendbaren Sicherheitsupdates.
OtherUpdatesMissing Anzahl der erkannten fehlenden Updates.
TotalUpdatesMissing Gesamtanzahl der fehlenden anwendbaren Updates.
RestartPending TRUE, wenn ein Neustart aussteht, andernfalls FALSE.
SubscriptionId Der eindeutige Bezeichner für das Azure-Abonnement.
ResourceGroup Name der Ressourcengruppe mit der Ressource.
ResourceProvider Der Ressourcenanbieter.
Ressource Name der Ressource für den Datensatz.
ResourceId Eindeutiger Bezeichner für die Ressource, der der Datensatz zugeordnet ist.
ResourceType Ressourcentyp:
ComputerEnvironment Umgebung Die Werte sind „Azure“ oder „Non-Azure“.
VMUUID Eindeutiger Bezeichner für den virtuellen Computer.
Typ Datensatztyp. Der Wert ist UpdateSummary.
_ResourceId Eindeutiger Bezeichner für die Ressource, der der Datensatz zugeordnet ist.

Beispielabfragen

Die folgenden Abschnitte enthalten Beispielprotokollabfragen für Updatedatensätze, die für die Updateverwaltung erfasst werden.

Sicherstellen, dass Nicht-Azure-Computer für die Updateverwaltung aktiviert sind

Sie können eine der folgenden Protokollsuchen ausführen, um zu bestätigen, dass direkt verbundene Computer mit Azure Monitor-Protokollen kommunizieren.

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

Auf einem Windows-Computer können Sie die folgenden Informationen überprüfen, um für den Agent die Konnektivität mit Azure Monitor-Protokollen zu bestätigen:

  1. Öffnen Sie in der Systemsteuerung Microsoft Monitoring Agent. Auf der Registerkarte Azure Log Analytics wird vom Agent die folgende Meldung angezeigt: The Microsoft Monitoring Agent has successfully connected to Log Analytics (Für den Microsoft Monitoring Agent wurde die Verbindung mit Log Analytics erfolgreich hergestellt).

  2. Öffnen Sie das Windows-Ereignisprotokoll. Navigieren Sie zu Anwendungs- und Dienstprotokolle\Operations Manager, und suchen Sie nach der Ereignis-ID 3000 und der Ereignis-ID 5002 aus der Quelle Service Connector. Mit diesen Ereignissen wird angegeben, dass für den Computer die Registrierung beim Log Analytics-Arbeitsbereich und die Konfiguration ausgeführt wurden.

Falls der Agent nicht mit Azure Monitor-Protokollen kommunizieren kann und für die Kommunikation mit dem Internet über eine Firewall oder einen Proxyserver konfiguriert ist, vergewissern Sie sich, dass die Firewall bzw. der Proxyserver ordnungsgemäß konfiguriert sind. Weitere Informationen zur Überprüfung der Firewall- oder Proxyserverkonfiguration finden Sie unter Netzwerkkonfiguration für den Windows-Agent bzw. unter Netzwerkkonfiguration für den Linux-Agent.

Hinweis

Wenn Ihre Linux-Systeme für die Kommunikation mit einem Proxy oder Log Analytics-Gateway konfiguriert sind und Sie die Updateverwaltung aktivieren, aktualisieren Sie die Berechtigungen für proxy.conf, um der Gruppe „omiuser“ Leseberechtigungen für die Datei zu erteilen. Führen Sie dazu die folgenden Befehle aus:

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

Für neu hinzugefügte Linux-Agents wird der Status Aktualisiert angezeigt, nachdem eine Bewertung ausgeführt wurde. Dieser Vorgang kann bis zu sechs Stunden dauern.

Wenn Sie bestätigen möchten, dass eine Operations Manager-Verwaltungsgruppe mit Azure Monitor-Protokollen kommuniziert, helfen Ihnen die Informationen unter Überprüfen der Integration von Operations Manager mit Log Analytics weiter.

Bewertungsabfragen für einzelne virtuelle Azure-Computer (Windows)

Ersetzen Sie den VMUUID-Wert durch die VM-GUID des virtuellen Computers, den Sie abfragen. Sie können die VMUUID ermitteln, die verwendet werden soll, indem Sie die folgende Abfrage in Azure Monitor-Protokollen ausführen: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Zusammenfassung fehlender Updates

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")

Liste fehlender Updates

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

Bewertungsabfragen für einzelne virtuelle Azure-Computer (Linux)

Für einige Linux-Distributionen besteht ein Konflikt der Bytereihenfolge mit dem VMUUID-Wert, der auf Azure Resource Manager und die in Azure Monitor-Protokollen gespeicherten Daten zurückzuführen ist. Die folgende Abfrage überprüft, ob eine Übereinstimmung für einen der Endianness-Werte vorliegt. Ersetzen Sie die VMUUID-Werte durch das big-endian- bzw. little-endian-Format der GUID, um die Ergebnisse ordnungsgemäß zurückzugeben. Sie können die VMUUID ermitteln, die verwendet werden soll, indem Sie die folgende Abfrage in Azure Monitor-Protokollen ausführen: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Zusammenfassung fehlender Updates

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")

Liste fehlender Updates

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

Bewertungsabfragen für mehrere virtuelle Computer

Computerzusammenfassung

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

Zusammenfassung fehlender Updates

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")

Computerliste

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

Liste fehlender Updates

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

Nächste Schritte