Consultar os registos da Gestão de Atualizações

Importante

O Gerenciamento de Atualização de Automação foi desativado em 31 de agosto de 2024 e recomendamos que você use o Azure Update Manager. Siga as diretrizes para migração do Automation Update Management para o Azure Update Manager.

Além dos detalhes fornecidos durante a implantação do Gerenciamento de Atualizações, você pode pesquisar os logs armazenados no espaço de trabalho do Log Analytics. Para pesquisar os logs da sua conta de automação, selecione Gerenciamento de atualizações e abra o espaço de trabalho do Log Analytics associado à sua implantação.

Você também pode personalizar as consultas de log ou usá-las de clientes diferentes. Consulte a documentação da API de pesquisa do Log Analytics.

Consultar registos de atualização

O Gerenciamento de Atualizações coleta registros para VMs Windows e Linux e os tipos de dados que aparecem nos resultados da pesquisa de log. As seções a seguir descrevem esses registros.

Registo de Atualização de Consulta

É criado um registro com um tipo de que representa as atualizações disponíveis e seu status de Update instalação para uma máquina. Esses registros têm as propriedades na tabela a seguir:

Property Description
TenantId Identificador exclusivo que representa a instância do Microsoft Entra ID da sua organização.
SourceSystem O sistema de origem do registo. O valor é OperationsManager.
TimeGenerated Data e hora da criação do registo.
SourceComputerId Identificador exclusivo que representa o computador de origem.
Título O título da atualização.
Classificação Classificação de aprovação. O valor é Updates.
Data de Publicação (UTC) A data em que a atualização está pronta para ser transferida e instalada a partir do Windows Update.
Computador Nome de domínio totalmente qualificado da máquina de relatórios.
UpdateState O estado atual da atualização.
Produto Os produtos aos quais a atualização é aplicável.
OSType Tipo de sistema operacional. Os valores são Windows ou Linux.
Versão do produto Versão da atualização.
Arco do Produto Arquitetura de máquina aplicável
CVENumbers Número de Vulnerabilidades e Exposições Comuns
BulletinUrl URL do Boletim
ID do boletim Número de identificação do boletim.
PackageRepository Informações do repositório do pacote.
PackageSeverity Severidade da atualização.
OSName Tipo de sistema operacional. Os valores são Windows ou Linux.
OSVersion A versão do sistema operacional.
OSFullName Nome do sistema operacional.
SubscriptionId Identificador exclusivo da subscrição do Azure.
ResourceGroup Nome do grupo de recursos ao qual o recurso pertence.
ResourceProvider O provedor de recursos.
Recurso Nome do recurso.
ResourceId Identificador exclusivo do recurso associado ao registro.
ResourceType O tipo do recurso.
Ambiente Informático Ambiente. Os valores possíveis são Azure ou Non-Azure.
VMUUID Identificador exclusivo para a máquina virtual.
MG Identificador exclusivo para o grupo de gerenciamento ou espaço de trabalho do Log Analytics.
ManagementGroupName Nome do grupo de gerenciamento do Operations Manager ou do espaço de trabalho do Log Analytics.
MSRCSeverity Classificação de gravidade da vulnerabilidade. Os valores são:
Crítico
Importante
Moderado
Baixo
KBID ID do artigo da Base de Dados de Conhecimento para a atualização do Windows.
UpdateID Identificador exclusivo da atualização de software.
RevisionNumber O número de revisão de uma revisão específica de uma atualização.
Opcional True se o registro for opcional ou False caso contrário.
RebootBehavior O comportamento de reinicialização após a instalação/desinstalação de uma atualização.
MSRCBulletinID Número de identificação do boletim de segurança.
Aprovado True se o registro for aprovado ou False caso contrário.
Fonte de aprovação Aplica-se apenas ao sistema operativo Windows. Fonte de aprovação para o registo. O valor é Microsoft Update.
InstallTimePredictionSeconds
InstallTimeDeviationRangeSeconds
InstallTimeAvailable
Type Tipo de registo. O valor é Update.

Registro de Status de Implantação de Atualização de Consulta

É criado um registro com um tipo de que fornece o status de implantação de atualização de uma implantação agendada UpdateRunProgress por máquina. Esses registros têm as propriedades na tabela a seguir:

Property Description
TenantId Identificador exclusivo que representa a instância do Microsoft Entra ID da sua organização.
SourceSystem Sistema de origem do registo. O valor é OperationsManager.
TimeGenerated Data e hora da criação do registo.
MG Identificador exclusivo para o grupo de gerenciamento ou espaço de trabalho do Log Analytics.
ManagementGroupName Nome do grupo de gerenciamento do Operations Manager ou espaço de trabalho do Log Analytics.
SourceComputerId Identificador exclusivo que representa o computador de origem.
KBID ID do artigo da Base de Dados de Conhecimento para a atualização do Windows.
UpdateId Identificador exclusivo da atualização de software.
SucceededOnRetry Valor que indica se a execução da atualização falhou na primeira tentativa e se a operação atual é uma tentativa de nova tentativa.
ErrorResult Código de erro do Windows Update gerado se uma atualização falhar na instalação.
UpdateRunName Nome da agenda de atualização.
Status da instalação Os possíveis estados de instalação de uma atualização no computador cliente,
NotStarted - trabalho ainda não acionado.
Failed - O trabalho começou, mas falhou com uma exceção.
InProgress - Trabalhos em curso.
MaintenanceWindowExceeded - se a execução estava mantida, mas o intervalo da janela de manutenção foi atingido.
Succeeded - trabalho bem sucedido.
Install Failed - A atualização falhou ao instalar com êxito.
NotIncluded - A classificação da atualização correspondente não corresponde às entradas do cliente na Lista de Classificação de Entrada.
Excluded - usuário insere um KBID na lista de excluídos. Durante a aplicação de patches, se o KBID na lista de excluídos corresponder ao ID KB de atualização detetado pelo sistema, ele será marcado como excluído.
Computador Nome de domínio totalmente qualificado da máquina de relatórios.
Título O título da atualização.
Produto Os produtos aos quais a atualização é aplicável.
OSType Tipo de sistema operacional. Os valores são Windows ou Linux.
StartTime (UTC) Hora em que a atualização está agendada para ser instalada. Esta propriedade não é usada no momento. Consulte TimeGenerated.
EndTime (UTC) A hora em que o processo de sincronização terminou. Esta propriedade não é usada no momento. Consulte TimeGenerated.
CorrelationId Identificador exclusivo do trabalho runbook executado para a atualização.
SubscriptionId Identificador exclusivo da subscrição do Azure.
ResourceGroup Nome do grupo de recursos ao qual o recurso pertence.
ResourceProvider O provedor de recursos.
Recurso Nome do recurso.
ResourceId Identificador exclusivo do recurso associado ao registro.
ResourceType Tipo de recurso.
Ambiente Informático Ambiente. Os valores são Azure ou Non-Azure.
VMUUID Identificador exclusivo para a máquina virtual.
Type O tipo de atualização. O valor é UpdateRunProgress.
_ResourceId Identificador exclusivo do recurso associado ao registro.

Registro de Resumo de Atualização de Consulta

É criado um registro com um tipo de que fornece resumo de UpdateSummary atualização por máquina. Esses registros têm as propriedades na tabela a seguir:

Property Description
TenantId Identificador exclusivo que representa a instância do Microsoft Entra ID da sua organização.
SourceSystem Sistema de origem do registo. O valor é OpsManager.
TimeGenerated Data e hora da criação do registo.
MG Identificador exclusivo para o grupo de gerenciamento ou espaço de trabalho do Log Analytics.
ManagementGroupName Nome do grupo de gerenciamento do Operations Manager ou espaço de trabalho do Log Analytics.
SourceComputerId Identificador exclusivo para a máquina virtual.
LastUpdateApplied (UTC)
OldestMissingSecurityUpdateInDays Número total de dias para a atualização mais antiga detetada como aplicável que não foi instalada.
OldestMissingSecurityUpdateBucket Especificador do bucket de segurança ausente mais antigo. Os valores são:
Recente se o valor for inferior a 30 dias
há 30 dias
há 60 dias
há 90 dias
há 120 dias
há 150 dias
há 180 dias
Mais antigo quando o valor é superior a 180 dias.
WindowsUpdateSetting Status do agente do Windows Update. Os valores possíveis são:
Scheduled installation
Notify before installation
Error returned from unhealthy WUA agent
WindowsUpdateAgentVersion Versão do agente do Windows Update.
WSUSServer Erros se o agente do Windows Update tiver um problema, para ajudar na solução de problemas.
Computador Nome de domínio totalmente qualificado da máquina de relatórios.
OsVersion A versão do sistema operacional.
NETRuntimeVersion Versão do .NET Framework instalada no computador Windows.
CriticalUpdatesMissing Número de atualizações críticas aplicáveis que estão faltando.
SecurityUpdatesMissing Contagem de atualizações de segurança ausentes que são aplicáveis.
OtherUpdatesMissing Contagem de atualizações detetadas ausentes.
TotalUpdatesMissing Número total de atualizações em falta que são aplicáveis.
RestartPending True se uma reinicialização estiver pendente ou False caso contrário.
SubscriptionId Identificador exclusivo da subscrição do Azure.
ResourceGroup Nome do grupo de recursos que contém o recurso.
ResourceProvider O provedor de recursos.
Recurso Nome do recurso para o registro.
ResourceId Identificador exclusivo do recurso associado ao registro.
ResourceType Tipo de recurso.
Ambiente Informático Ambiente. Os valores são Azure ou Non-Azure.
VMUUID Identificador exclusivo para a máquina virtual.
Type Tipo de registo. O valor é UpdateSummary.
_ResourceId Identificador exclusivo do recurso associado ao registro.

Consultas de amostra

As seções a seguir fornecem consultas de log de exemplo para registros de atualização coletados para o Gerenciamento de Atualizações.

Confirme se as máquinas que não são do Azure estão habilitadas para o Gerenciamento de Atualizações

Para confirmar se as máquinas conectadas diretamente estão se comunicando com os logs do Azure Monitor, execute uma das seguintes pesquisas de 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

Em um computador Windows, você pode revisar as seguintes informações para verificar a conectividade do agente com os logs do Azure Monitor:

  1. No Painel de Controle, abra o Microsoft Monitoring Agent. Na guia Azure Log Analytics, o agente exibe a seguinte mensagem: O Microsoft Monitoring Agent se conectou com êxito ao Log Analytics.

  2. Abra o Registo de Eventos do Windows. Vá para Logs de Aplicativos e Serviços\Operations Manager e procure ID de Evento 3000 e ID de Evento 5002 no Service Connector de origem. Estes eventos indicam que o computador foi registado na área de trabalho do Log Analytics e que está a receber a configuração.

Se o agente não puder se comunicar com os logs do Azure Monitor e estiver configurado para se comunicar com a Internet por meio de um firewall ou servidor proxy, confirme se o firewall ou servidor proxy está configurado corretamente. Para saber como verificar se o firewall ou servidor proxy está configurado corretamente, consulte Configuração de rede para agente Windows ou Configuração de rede para agente Linux.

Nota

Se seus sistemas Linux estiverem configurados para se comunicar com um proxy ou Log Analytics Gateway e você estiver habilitando o Gerenciamento de Atualizações, atualize as proxy.conf permissões para conceder ao grupo omiuser permissão de leitura no arquivo usando os seguintes comandos:

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

Os agentes Linux recém-adicionados mostram um status de Atualizado após uma avaliação ter sido executada. Este processo pode demorar até seis horas.

Para confirmar se um grupo de gerenciamento do Operations Manager está se comunicando com os logs do Azure Monitor, consulte Validar a integração do Operations Manager com os logs do Azure Monitor.

Consultas únicas de avaliação de VM do Azure (Windows)

Substitua o valor VMUUID pelo GUID da VM da máquina virtual que você está consultando. Você pode encontrar o VMUUID que deve ser usado executando a seguinte consulta nos logs do Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Resumo das atualizações em falta

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

Lista de atualizações em falta

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

Consultas de avaliação de VM única do Azure (Linux)

Para algumas distros Linux, há uma incompatibilidade de endianness com o valor VMUUID que vem do Azure Resource Manager e o que é armazenado nos logs do Azure Monitor. A consulta a seguir verifica se há uma correspondência em qualquer endianness. Substitua os valores VMUUID pelo formato big-endian e little-endian do GUID para retornar corretamente os resultados. Você pode encontrar o VMUUID que deve ser usado executando a seguinte consulta nos logs do Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Resumo das atualizações em falta

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

Lista de atualizações em falta

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

Consultas de avaliação de várias VMs

Resumo dos computadores

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

Resumo das atualizações em falta

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 de computadores

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

Lista de atualizações em falta

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

Próximos passos

  • Para obter detalhes dos logs do Azure Monitor, consulte Logs do Azure Monitor.
  • Para obter ajuda com alertas, consulte Configurar alertas.