Compartilhar via


Consultar os logs do Gerenciamento de Atualizações

Importante

O Gerenciamento de Atualizações da Automação foi desativado em 31 de agosto de 2024 e recomendamos que você use o Gerenciador de Atualizações do Azure. Siga as diretrizes para migração do Gerenciamento de Atualizações da Automação para o Gerenciador de Atualizações do Azure.

Além dos detalhes fornecidos durante a implantação do Gerenciamento de Atualizações, você pode pesquisar os logs armazenados em seu workspace do Log Analytics. Para pesquisar os logs da conta de Automação do Azure, selecione Gerenciamento de Atualizações e abra o workspace do Log Analytics associado à implantação.

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

Consultar registros de atualização

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

Consultar registros de atualização

É criado um registro do tipo Update que representa as atualizações disponíveis e o status da instalação em um computador. Esses registros têm as propriedades descritas na tabela a seguir:

Propriedade Descrição
TenantId Identificador exclusivo que representa a instância do Microsoft Entra ID de sua organização.
SourceSystem O sistema de origem do registro. O valor é OperationsManager.
TimeGenerated Data e hora da criação do registro.
SourceComputerId Identificador exclusivo que representa o computador de origem.
Título O título da atualização.
classificação Classificação da aprovação. O valor é Updates.
PublishedDate (UTC) A data em que a atualização está pronta para ser baixada e instalada pelo Windows Update.
Computador Nome de domínio totalmente qualificado do computador de relatórios.
UpdateState O estado atual da atualização.
Product Produtos aos quais a atualização se aplica.
OSType Tipo do sistema operacional. Os valores são Windows ou Linux.
ProductVersion Versão da atualização.
Arco do Produto Arquitetura de computador aplicável
CVENumbers Número de Vulnerabilidades e Exposições Comuns
BulletinUrl URL do Boletim
BulletinID Número da ID do Boletim.
PackageRepository Informações do repositório do pacote.
PackageSeverity Gravidade da atualização.
OSName Tipo do 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 assinatura do Azure.
ResourceGroup Nome do grupo de recursos ao qual pertence o recurso.
ResourceProvider O provedor de recursos.
Recurso Nome do recurso.
ResourceId Identificador exclusivo do recurso associado ao registro.
ResourceType O tipo de recurso.
ComputerEnvironment Ambiente. Os valores possíveis são Azure ou Non-Azure.
VMUUID Identificador exclusivo da máquina virtual.
MG Identificador exclusivo do grupo de gerenciamento ou do workspace do Log Analytics.
ManagementGroupName Nome do grupo de gerenciamento do Operations Manager ou do workspace do Log Analytics.
MSRCSeverity Classificação de severidade da vulnerabilidade. Os valores são:
Crítico
Importante
Moderado
Baixo
KBID ID do artigo da base de dados de conhecimento para o Windows Update.
UpdateID Identificador exclusivo da atualização de software.
RevisionNumber O número de uma revisão específica de uma atualização.
Opcional Se o registro for opcional, True. Caso contrário, False.
RebootBehavior O comportamento de reinicialização após instalar/desinstalar uma atualização.
MSRCBulletinID Número de ID do boletim de segurança.
Aprovado Se o registro for aprovado, True. Caso contrário, False.
ApprovalSource Aplica-se exclusivamente ao sistema operacional Windows. Origem da aprovação do registro. O valor é Microsoft Update.
InstallTimePredictionSeconds
InstallTimeDeviationRangeSeconds
InstallTimeAvailable
Tipo Tipo de registro. O valor é Update.

Consultar registro de status da implantação da atualização

É criado um registro do tipo UpdateRunProgress que fornece o status da implantação da atualização agendada pelo computador. Esses registros têm as propriedades descritas na tabela a seguir:

Propriedade Descrição
TenantId Identificador exclusivo que representa a instância do Microsoft Entra ID de sua organização.
SourceSystem Sistema de origem do registro. O valor é OperationsManager.
TimeGenerated Data e hora da criação do registro.
MG Identificador exclusivo do grupo de gerenciamento ou do workspace do Log Analytics.
ManagementGroupName Nome do grupo de gerenciamento do Operations Manager ou do workspace do Log Analytics.
SourceComputerId Identificador exclusivo que representa o computador de origem.
KBID ID do artigo da base de dados de conhecimento para o Windows Update.
UpdateID Identificador exclusivo da atualização de software.
SucceededOnRetry Valor que indica se a execução da atualização não ocorreu na primeira tentativa e se a operação atual é uma nova tentativa.
ErrorResult Código de erro do Windows Update gerado quando uma atualização não é instalada.
UpdateRunName Nome do agendamento de atualização.
InstallationStatus Os estados de instalação possíveis de uma atualização no computador cliente:
NotStarted - o trabalho ainda não foi disparado.
Failed - trabalho iniciado, mas falhou com uma exceção.
InProgress - trabalho em andamento.
MaintenanceWindowExceeded - se a execução não tinha terminado, mas o intervalo da janela de manutenção foi alcançado.
Succeeded - trabalho realizado.
Install Failed - atualização não realizada.
NotIncluded – a classificação da atualização correspondente não corresponde às entradas do cliente na lista de classificação de entrada.
Excluded – o usuário insere um KBID na lista excluída. Durante a aplicação de patch, se o KBID na lista excluída corresponder à KBID de atualização detectada pelo sistema, ela será marcada como excluída.
Computador Nome de domínio totalmente qualificado do computador de relatórios.
Título O título da atualização.
Product Produtos aos quais a atualização se aplica.
OSType Tipo do sistema operacional. Os valores são Windows ou Linux.
StartTime (UTC) Hora em que a atualização está agendada para ser instalada. Atualmente, esta propriedade não é usada. Confira TimeGenerated.
EndTime (UTC) A hora em que o processo de sincronização terminou. Atualmente, esta propriedade não é usada. Confira TimeGenerated.
CorrelationId Identificador exclusivo da execução do trabalho de runbook para a atualização.
SubscriptionId Identificador exclusivo da assinatura do Azure.
ResourceGroup Nome do grupo de recursos ao qual pertence o recurso.
ResourceProvider O provedor de recursos.
Recurso Nome do recurso.
ResourceId Identificador exclusivo do recurso associado ao registro.
ResourceType Tipo de recurso.
ComputerEnvironment Ambiente. Os valores são Azure ou Non-Azure.
VMUUID Identificador exclusivo da máquina virtual.
Tipo O tipo de atualização. O valor é UpdateRunProgress.
_ResourceId Identificador exclusivo do recurso associado ao registro.

Consultar registro de resumo de atualização

É criado um registro do tipo UpdateSummary que fornece o resumo da atualização por computador. Esses registros têm as propriedades descritas na tabela a seguir:

Propriedade Descrição
TenantId Identificador exclusivo que representa a instância do Microsoft Entra ID de sua organização.
SourceSystem Sistema de origem do registro. O valor é OpsManager.
TimeGenerated Data e hora da criação do registro.
MG Identificador exclusivo do grupo de gerenciamento ou do workspace do Log Analytics.
ManagementGroupName Nome do grupo de gerenciamento do Operations Manager ou do workspace do Log Analytics.
SourceComputerId Identificador exclusivo da máquina virtual.
LastUpdateApplied (UTC)
OldestMissingSecurityUpdateInDays Número total de dias para a atualização mais antiga detectada, conforme 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 de Windows Update tiver um problema, para auxiliar na solução de problemas.
Computador Nome de domínio totalmente qualificado do computador 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 aplicáveis.
OtherUpdatesMissing Contagem de atualizações detectadas que estão faltando.
TotalUpdatesMissing Número total de atualizações ausentes que se aplicam.
RestartPending True se uma reinicialização estiver pendente. Caso contrário, False.
SubscriptionId Identificador exclusivo da assinatura do Azure.
ResourceGroup Nome do grupo de recursos que contém o recurso.
ResourceProvider O provedor de recursos.
Recurso Nome do recurso do registro.
ResourceId Identificador exclusivo do recurso associado ao registro.
ResourceType Tipo de recurso.
ComputerEnvironment Ambiente. Os valores são Azure ou Non-Azure.
VMUUID Identificador exclusivo da máquina virtual.
Tipo Tipo de registro. O valor é UpdateSummary.
_ResourceId Identificador exclusivo do recurso associado ao registro.

Consultas de exemplo

As seções a seguir fornecem consultas de log de exemplo dos registros de atualizações coletados pelo Gerenciamento de Atualizações.

Confirme se os computadores não Azure estão habilitados para Gerenciamento de Atualizações.

Para confirmar se os computadores conectados diretamente estão se comunicando com o Azure Monitor, execute uma das pesquisas de logs a seguir.

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 examinar a seguinte informação para verificar a conectividade do agente com os logs do Azure Monitor:

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

  2. Abra o Log de Eventos do Windows. Navegue até Logs de Aplicativos e Serviços\Operations Manager e procure as IDs de Evento 3000 e 5002 do Conector de Serviço de origem. Esses eventos indicam que o computador foi registrado com o workspace do Log Analytics e está recebendo a configuração.

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

Observação

Se os seus sistemas Linux estiverem configurados para se comunicar com um proxy ou com o Gateway do Log Analytics, e você estiver habilitando o Gerenciamento de Atualizações, atualize as permissões de proxy.conf 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

Agentes do Linux recém-adicionados mostram um status de Atualizado após ter sido realizada uma avaliação. Esse processo pode levar até seis horas.

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

Consultas de Avaliação de VM única 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 deveria ser usado executando a seguinte consulta nos logs do Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Resumo das atualizações ausentes

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 das atualizações ausentes

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 distribuições de 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 procura 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 deveria ser usado executando a seguinte consulta nos logs do Azure Monitor: Update | where Computer == "<machine name>" | summarize by Computer, VMUUID

Resumo das atualizações ausentes

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 das atualizações ausentes

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

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 das atualizações ausentes

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óximas etapas