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:
Ö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).
Ö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
- Ausführliche Informationen zu Azure Monitor-Protokollen finden Sie unter Azure Monitor-Protokolle.
- Hilfe zu Warnungen finden Sie unter Konfigurieren von Warnungen.