Wykonywanie zapytań względem dzienników rozwiązania Update Management

Oprócz szczegółów podanych podczas wdrażania rozwiązania Update Management można przeszukiwać dzienniki przechowywane w obszarze roboczym usługi Log Analytics. Aby przeszukać dzienniki z konta usługi Automation, wybierz pozycję Update Management i otwórz obszar roboczy usługi Log Analytics skojarzony z wdrożeniem.

Możesz również dostosować zapytania dziennika lub użyć ich z różnych klientów. Zobacz dokumentację interfejsu API wyszukiwania usługi Log Analytics.

Wykonywanie zapytań dotyczących rekordów aktualizacji

Rozwiązanie Update Management zbiera rekordy dla maszyn wirtualnych z systemami Windows i Linux oraz typów danych wyświetlanych w wynikach wyszukiwania dzienników. W poniższych sekcjach opisano te rekordy.

Rekord aktualizacji kwerendy

Tworzony jest rekord o typie Update , który reprezentuje dostępne aktualizacje i ich stan instalacji dla maszyny. Te rekordy mają właściwości w poniższej tabeli:

Właściwości opis
TenantId Unikatowy identyfikator reprezentujący wystąpienie organizacji identyfikatora Entra firmy Microsoft.
SourceSystem System źródłowy rekordu. Wartość to OperationsManager.
TimeGenerated Data i godzina utworzenia rekordu.
SourceComputerId Unikatowy identyfikator reprezentujący komputer źródłowy.
Tytuł Tytuł aktualizacji.
Klasyfikacja Klasyfikacja zatwierdzenia. Wartość jest Aktualizacje.
Data publikacji (UTC) Data, w którym aktualizacja jest gotowa do pobrania i zainstalowania z usługi Windows Update.
Komputer W pełni kwalifikowana nazwa domeny maszyny raportowania.
UpdateState Bieżący stan aktualizacji.
Produkt Produkty, dla których ma zastosowanie aktualizacja.
OSType Typ systemu operacyjnego. Wartości to Windows lub Linux.
Productversion Wersja aktualizacji.
Łuk produktu Odpowiednia architektura maszyny
CVENumbers Typowy numer luk w zabezpieczeniach i ekspozycji
BiuletynUrl Adres URL biuletynu
Identyfikator biuletynu Numer identyfikacyjny biuletynu.
Repozytorium pakietów Informacje o repozytorium pakietu.
PackageSeverity Ważność aktualizacji.
Nazwa systemu operacyjnego Typ systemu operacyjnego. Wartości to Windows lub Linux.
OSVersion Wersja systemu operacyjnego.
OSFullName Nazwa systemu operacyjnego.
SubscriptionId Unikatowy identyfikator subskrypcji platformy Azure.
ResourceGroup Nazwa grupy zasobów, do której należy zasób.
ResourceProvider Dostawca zasobów.
Zasób Nazwa zasobu.
ResourceId Unikatowy identyfikator zasobu skojarzonego z rekordem.
ResourceType Typ zasobu.
KomputerŚrodowisko Środowiska. Możliwe wartości to Azure lub spoza platformy Azure.
Identyfikator VMUUID Unikatowy identyfikator maszyny wirtualnej.
GRUPĄ ZARZĄDZANIA Unikatowy identyfikator grupy zarządzania lub obszaru roboczego usługi Log Analytics.
ManagementGroupName Nazwa grupy zarządzania programu Operations Manager lub obszaru roboczego usługi Log Analytics.
MSRCSeverity Ocena ważności luki w zabezpieczeniach. Wartości to:
Krytyczne
Ważne
Średnio
Niska
KBID Identyfikator artykułu bazy wiedzy dla usługi Windows Update.
UpdateID Unikatowy identyfikator aktualizacji oprogramowania.
RevisionNumber Numer poprawki określonej poprawki aktualizacji.
Opcjonalnie Wartość True, jeśli rekord jest opcjonalny lub fałsz.
RebootBehavior Zachowanie ponownego uruchamiania po zainstalowaniu/odinstalowaniu aktualizacji.
MSRCBulletinID Numer identyfikacyjny biuletynu zabezpieczeń.
Zatwierdzona Wartość True, jeśli rekord jest zatwierdzony lub fałsz.
Źródło zatwierdzenia Dotyczy tylko systemu operacyjnego Windows. Źródło zatwierdzenia dla rekordu. Wartość to Microsoft Update.
InstallTimePredictionSeconds
InstallTimeDeviationRangeSeconds
InstallTimeAvailable
Type Typ rekordu. Wartość to Update.

Rekord stanu wdrożenia aktualizacji kwerendy

Tworzony jest rekord o typie UpdateRunProgress , który zapewnia stan wdrożenia aktualizacji zaplanowanego wdrożenia według maszyny. Te rekordy mają właściwości w poniższej tabeli:

Właściwości opis
TenantId Unikatowy identyfikator reprezentujący wystąpienie organizacji identyfikatora Entra firmy Microsoft.
SourceSystem System źródłowy rekordu. Wartość to OperationsManager.
TimeGenerated Data i godzina utworzenia rekordu.
GRUPĄ ZARZĄDZANIA Unikatowy identyfikator grupy zarządzania lub obszaru roboczego usługi Log Analytics.
ManagementGroupName Nazwa grupy zarządzania programu Operations Manager lub obszaru roboczego usługi Log Analytics.
SourceComputerId Unikatowy identyfikator reprezentujący komputer źródłowy.
KBID Identyfikator artykułu bazy wiedzy dla usługi Windows Update.
UpdateId Unikatowy identyfikator aktualizacji oprogramowania.
SucceededOnRetry Wartość wskazująca, czy wykonanie aktualizacji nie powiodło się podczas pierwszej próby, a bieżąca operacja jest ponowną próbą.
BłądResult Kod błędu usługi Windows Update wygenerowany, jeśli instalacja aktualizacji nie powiedzie się.
UpdateRunName Nazwa harmonogramu aktualizacji.
Stan instalacji Możliwe stany instalacji aktualizacji na komputerze klienckim,
NotStarted — zadanie nie zostało jeszcze wyzwolone.
Failed — zadanie zostało uruchomione, ale nie powiodło się z wyjątkiem.
InProgress - zadanie w toku.
MaintenanceWindowExceeded — jeśli wykonanie pozostało, ale osiągnięto interwał okna obsługi.
Succeeded — zadanie zakończyło się pomyślnie.
Install Failed — nie można pomyślnie zainstalować aktualizacji.
NotIncluded — odpowiednia klasyfikacja aktualizacji nie jest zgodna z wpisami klienta na liście klasyfikacji danych wejściowych.
Excluded — użytkownik wprowadza identyfikator KBID na wykluczonej liście. Podczas stosowania poprawek, jeśli identyfikator KBID na wykluczonej liście jest zgodny z systemem wykrył identyfikator bazy wiedzy aktualizacji, jest oznaczony jako wykluczony.
Komputer W pełni kwalifikowana nazwa domeny maszyny raportowania.
Tytuł Tytuł aktualizacji.
Produkt Produkty, dla których ma zastosowanie aktualizacja.
OSType Typ systemu operacyjnego. Wartości to Windows lub Linux.
StartTime (UTC) Czas instalowania aktualizacji. Ta właściwość nie jest obecnie używana. Zobacz TimeGenerated.
EndTime (UTC) Czas zakończenia procesu synchronizacji. Ta właściwość nie jest obecnie używana. Zobacz TimeGenerated.
CorrelationId Unikatowy identyfikator uruchomienia zadania elementu Runbook dla aktualizacji.
SubscriptionId Unikatowy identyfikator subskrypcji platformy Azure.
ResourceGroup Nazwa grupy zasobów, do której należy zasób.
ResourceProvider Dostawca zasobów.
Zasób Nazwa zasobu.
ResourceId Unikatowy identyfikator zasobu skojarzonego z rekordem.
ResourceType Typ zasobu.
KomputerŚrodowisko Środowiska. Wartości to Azure lub spoza platformy Azure.
Identyfikator VMUUID Unikatowy identyfikator maszyny wirtualnej.
Type Typ aktualizacji. Wartość to UpdateRunProgress.
_ResourceId Unikatowy identyfikator zasobu skojarzonego z rekordem.

Rekord podsumowania aktualizacji kwerendy

Tworzony jest rekord o typie UpdateSummary , który udostępnia podsumowanie aktualizacji według maszyny. Te rekordy mają właściwości w poniższej tabeli:

Właściwości opis
TenantId Unikatowy identyfikator reprezentujący wystąpienie organizacji identyfikatora Entra firmy Microsoft.
SourceSystem System źródłowy rekordu. Wartość to OpsManager.
TimeGenerated Data i godzina utworzenia rekordu.
GRUPĄ ZARZĄDZANIA Unikatowy identyfikator grupy zarządzania lub obszaru roboczego usługi Log Analytics.
ManagementGroupName Nazwa grupy zarządzania programu Operations Manager lub obszaru roboczego usługi Log Analytics.
SourceComputerId Unikatowy identyfikator maszyny wirtualnej.
LastUpdateApplied (UTC)
OldestMissingSecurityUpdateInDays Łączna liczba dni dla najstarszej aktualizacji wykrytej jako odpowiednia, która nie została zainstalowana.
OldestMissingSecurityUpdateBucket Specyfikator najstarszego brakującego zasobnika zabezpieczeń. Wartości to:
Ostatnie, jeśli wartość jest mniejsza niż 30 dni
30 dni temu
60 dni temu
90 dni temu
120 dni temu
150 dni temu
180 dni temu
Starsze, gdy wartość jest większa niż 180 dni.
WindowsUpdateSetting Stan agenta usługi Windows Update. Dopuszczalne wartości:
Scheduled installation
Notify before installation
Error returned from unhealthy WUA agent
WindowsUpdateAgentVersion Wersja agenta usługi Windows Update.
WSUSServer Błędy, jeśli agent usługi Windows Update ma problem, aby pomóc w rozwiązywaniu problemów.
Komputer W pełni kwalifikowana nazwa domeny maszyny raportowania.
OsVersion Wersja systemu operacyjnego.
NETRuntimeVersion Wersja programu .NET Framework zainstalowana na komputerze z systemem Windows.
CriticalUpdatesMissing Liczba brakujących odpowiednich aktualizacji krytycznych.
SecurityUpdatesMissing Liczba brakujących aktualizacji zabezpieczeń, które mają zastosowanie.
OtherUpdatesMissing Liczba wykrytych aktualizacji, których brakuje.
TotalUpdatesMissing Łączna liczba brakujących aktualizacji, które mają zastosowanie.
Ponowne uruchamianiePending Wartość True, jeśli ponowne uruchomienie jest oczekujące lub fałsz.
SubscriptionId Unikatowy identyfikator subskrypcji platformy Azure.
ResourceGroup Nazwa grupy zasobów zawierającej zasób.
ResourceProvider Dostawca zasobów.
Zasób Nazwa zasobu rekordu.
ResourceId Unikatowy identyfikator zasobu skojarzonego z rekordem.
ResourceType Typ zasobu.
KomputerŚrodowisko Środowiska. Wartości to Azure lub spoza platformy Azure.
Identyfikator VMUUID Unikatowy identyfikator maszyny wirtualnej.
Type Typ rekordu. Wartość to UpdateSummary.
_ResourceId Unikatowy identyfikator zasobu skojarzonego z rekordem.

Przykładowe zapytania

W poniższych sekcjach przedstawiono przykładowe zapytania dziennika dotyczące rekordów aktualizacji zebranych w usłudze Update Management.

Upewnij się, że maszyny spoza platformy Azure są włączone dla rozwiązania Update Management

Aby potwierdzić, że bezpośrednio połączone maszyny komunikują się z dziennikami usługi Azure Monitor, uruchom jedno z następujących wyszukiwań dzienników.

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

Na komputerze z systemem Windows możesz przejrzeć następujące informacje, aby zweryfikować łączność agenta z dziennikami usługi Azure Monitor:

  1. W Panel sterowania otwórz program Microsoft Monitoring Agent. Na karcie Azure Log Analytics agent wyświetli następujący komunikat: Program Microsoft Monitoring Agent pomyślnie nawiązał połączenie z usługą Log Analytics.

  2. Otwórz dziennik zdarzeń systemu Windows. Przejdź do obszaru Dzienniki aplikacji i usług\Operations Manager i wyszukaj identyfikator zdarzenia 3000 i identyfikator zdarzenia 5002 z Połączenie or usługi źródłowej. Te zdarzenia informują o tym, że komputer został zarejestrowany w obszarze roboczym usługi Log Analytics i odbiera konfigurację.

Jeśli agent nie może komunikować się z dziennikami usługi Azure Monitor, a agent jest skonfigurowany do komunikowania się z Internetem za pośrednictwem zapory lub serwera proxy, upewnij się, że zapora lub serwer proxy są prawidłowo skonfigurowane. Aby dowiedzieć się, jak sprawdzić, czy zapora lub serwer proxy jest prawidłowo skonfigurowany, zobacz Konfiguracja sieci dla agenta systemu Windows lub Konfiguracja sieci dla agenta systemu Linux.

Uwaga

Jeśli systemy z systemem Linux są skonfigurowane do komunikowania się z serwerem proxy lub bramą usługi Log Analytics i włączasz rozwiązanie Update Management, zaktualizuj proxy.conf uprawnienia, aby przyznać grupie omiuser uprawnienia do odczytu w pliku przy użyciu następujących poleceń:

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

Nowo dodani agenci systemu Linux pokazują stan Zaktualizowano po przeprowadzeniu oceny. Ten proces może potrwać do 6 godzin.

Aby potwierdzić, że grupa zarządzania programu Operations Manager komunikuje się z dziennikami usługi Azure Monitor, zobacz Weryfikowanie integracji programu Operations Manager z dziennikami usługi Azure Monitor.

Zapytania oceny pojedynczej maszyny wirtualnej platformy Azure (Windows)

Zastąp wartość VMUUID identyfikatorem GUID maszyny wirtualnej maszyny wirtualnej, której wysyłasz zapytanie. Identyfikator VMUUID, który powinien być używany, uruchamiając następujące zapytanie w dziennikach usługi Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Brak podsumowania aktualizacji

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

Brak listy aktualizacji

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

Zapytania dotyczące oceny pojedynczej maszyny wirtualnej platformy Azure (Linux)

W przypadku niektórych dystrybucji systemu Linux występuje niezgodność endianness z wartością VMUUID pochodzącą z usługi Azure Resource Manager i przechowywanymi w dziennikach usługi Azure Monitor. Poniższe zapytanie sprawdza dopasowanie pod kątem obu elementów endianness. Zastąp wartości VMUUID formatem big-endian i little-endian identyfikatora GUID, aby prawidłowo zwrócić wyniki. Identyfikator VMUUID, który powinien być używany, uruchamiając następujące zapytanie w dziennikach usługi Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Brak podsumowania aktualizacji

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

Brak listy aktualizacji

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

Zapytania dotyczące oceny wielu maszyn wirtualnych

Podsumowanie komputerów

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

Brak podsumowania aktualizacji

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

Lista komputerów

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

Brak listy aktualizacji

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

Następne kroki

  • Aby uzyskać szczegółowe informacje na temat dzienników usługi Azure Monitor, zobacz Dzienniki usługi Azure Monitor.
  • Aby uzyskać pomoc dotyczącą alertów, zobacz Konfigurowanie alertów.