Este projeto é uma ferramenta de gerenciamento de patches leves para o sistema operacional baseado em Windows. Ajuda a monitorar e controlar o gerenciamento de patches do sistema operacional. Originalmente escrito para ajudar no gerenciamento de patches para soluções baseadas no Windows Virtual Desktop (WVD), mas também funciona muito bem para outras soluções ou configurações não baseadas em WVD. (Por exemplo, gerenciamento de patches para computadores familiares)
Para gerenciamento de patches para cargas de trabalho baseadas em Windows, você normalmente possui muitas opções de nível corporativo. Por exemplo, o System Center Configuration Manager, Windows Update for Business, Windows Update, no caso de WVD Patch Management também injeção na imagem WVD básica.
Mas, às vezes, talvez você não tenha configuração, o que permite usar ferramentas destacadas acima. Talvez você tenha muitos domínios e florestas de anúncios, talvez esteja perdendo alguns recursos, como relatórios, painéis e telemetria, para citar poucos.
É quando você pode se beneficiar deste projeto que está tentando atender a essas necessidades.
Geralmente, nossa recomendação é sempre procurar as soluções profissionais descritas acima e somente se você vir algumas lacunas com essas soluções profissionais, pode querer verificar este projeto de código aberto.


Os dados de telemetria agora suportam informações provenientes da plataforma do Azure (se a VM executar dentro da plataforma do Azure). Informações sobre metadados da VM como o nome do Azure VM (vmResourceName), nome do grupo de recursos (ResourceGroupName) e ID da assinatura (SubscriptionId). Basicamente, informações em que sua VM do Azure é definida.
Isso permite suportar recursos de filtragem mais ricos e identificar VMs do Azure e onde essas VMs são definidas. Nos casos em que esse ambiente de hospedagem não está em execução dentro da plataforma do Azure, essas informações não estão disponíveis no cabeçalho da telemetria.
Application Insights e Log Analytics Workspace . Você também pode criar uma conta do Azure gratuito, se necessário: https://azure.microsoft.com/en-us/free WVDCUS.zip - contém arquivos binários que precisam ser implantados para monitorados hostsSource code.zip - código -fonte deste projetoSource code.tar.gz - código -fonte deste projeto em formato de alcatrão/zip diferenteWVDCUS.zip . No diretório de downloads, clique com o botão direito do Properties no arquivo e marque o Unblock da caixa de seleção. Clique em OK .WVDCUS.zip em todos os hosts monitorados no diretório WVDCUS . Por exemplo, no diretório: C:Program FilesWVDCUS Log Analytics Workspace na região preferida, com nome exclusivo e plano de pagamento: https://docs.microsoft.com/en-us/azure/azure-monitor/learn/quick-create-workspace#create-a-workspaceApplication Insights de recursos baseados em espaço de trabalho sobre a mesma região que o recurso anterior, com nome exclusivo, com opção baseada em espaço de trabalho e selecione o espaço de trabalho que você criou antes. https://docs.microsoft.com/en-us/azure/azure-monitor/app/create-workspace-resource#create-workspace baseado em resistênciaApplication Insights recém -criado Recurso Clique em Overview e copie Instrumentation Key Telemetry Key Alias, que será usada posteriormente durante a configuração. C:Program FilesWVDCUSWVDCUS.Service.exe.config no bloco de notas (ou em qualquer outro editor de texto)TelemetryKey e substitua o conteúdo 00000000-0000-0000-0000-000000000000 pelo valor obtido do recurso Application Insights do Item Instrumentation Key .CheckForUpdatesIntervalHours para um valor mais adequado. Este valor especifica com que frequência a verificação de novas atualizações deve ser feita. O padrão é de 4 horas e o valor válido pode estar entre 1 e 590 horas.UpdatesSearchQuery para um valor mais adequado. Este valor especifica quais tipos e categorias de patches devem ser instalados automaticamente. Descrição da consulta e parâmetros estão aqui: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ff357803(v=vs.85) e aqui: https://docs.microsoft.com/en-us/windows/win32/api/wuapi/nf-wuapi-iupdatesearcher-searchWVDCUS.Console.exe.config
WVDCUS.Console.exe agora para ver se o aplicativo está configurado corretamente. Preste atenção a quaisquer erros na saída do aplicativo. Se você vir alguns erros, verifique se tem permissões suficientes. O aplicativo pode verificar, baixar e instalar patches, se estiverem disponíveis.
Depois de verificar uma configuração com o aplicativo de console, você pode finalizar a configuração com o registro do aplicativo para ser executado como serviço do Windows. Para registrar o aplicativo para executar como serviço do Windows, você deve ter credenciais de administrador no computador onde ele está instalado. Você precisa usar a ferramenta installutil.exe , que faz parte do .NET Runtime. Esta ferramenta está instalada com a estrutura .NET na pasta %windir%Microsoft.NETFramework[64]<framework version> . Por exemplo, o caminho padrão para a versão de 64 bits é %windir%Microsoft.NETFramework64v4.0.30319InstallUtil.exe .
Run as Administratorcd C:Program FilesWVDCUSC:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe WVDCUS.Service.exeinstallutil.exe falhar, verifique o log de instalação para descobrir o porquê. Por padrão, o log está na mesma pasta que o serviço executável.WVDCUS.Console.exe antes - então o installutil.exe falhará. O erro é que o log de eventos já está registrado por aplicativo de console. Se falhar, basta desinstalar o serviço Windows com o comando abaixo (remove o log de eventos) e instalar o serviço do Windows novamente.C:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe /u WVDCUS.Service.exeC:WindowsMicrosoft.NETFramework64v4.0.30319InstallUtil.exe WVDCUS.Service.exe 
services.msc , onde você pode encontrar apenas o serviço Windows registrado sob o nome de exibição WVDCUS Service . O nome do próprio serviço é WVDCUS .WVDCUS Service . Na guia Recuperação Especifique a primeira e a segunda falha Restart the Service .ApplyStart
Você pode ver informações detalhadas sobre a saúde do serviço, falhas e mensagens informativas em um log de eventos.
eventvwr.msc , onde você pode encontrar informações detalhadas nos arquivos de log.WVDCUSLog .
Depois que o serviço do Windows estiver acordado e em estado em execução, ele começará a gerar dados de telemetria e armazená -los em recursos provisionados Application Insights através do TelemetryKey Identifier. Como o recurso Application Insights foi conectado ao Log Analytics Workspace durante o processo de provisionamento, você pode se beneficiar de todos os recursos disponíveis no recurso de Log Analytics Workspace . Para mais detalhes, consulte: https://docs.microsoft.com/en-us/azure/azure-monitor/log-query/log-query-overview
Os dados de telemetria são armazenados como eventos personalizados e você pode encontrá -los na tabela customEvents . Isso permite visualizar e analisar dados de todos os hosts e ver mensagens de estado, saúde e informações atuais sobre gerenciamento de patches de muitas perspectivas e intervalo de tempo especificado. Para mais detalhes, consulte: https://docs.microsoft.com/en-us/azure/azure-monitor/log-query/get-started-queries

Analisar dados por meio de consultas e múltiplas perspectivas é um recurso muito poderoso. No entanto, para o monitoramento diário, você normalmente precisa ver rapidamente o estado geral de seus hosts através de algum tipo de relatório. Felizmente, o recurso Log Analytics Workspace também possui essa capacidade.
Você pode criar pasta de trabalho personalizada com consultas personalizadas sobre dados de telemetria e renderizar resultados por meio de representação visual relevante.
Para mais detalhes, consulte: https://docs.microsoft.com/en-us/azure/azure-monitor/platform/workbooks-overview
Application Insights , Workbooks da seçãoCheckForUpdatesIntervalHours . Quando o intervalo de tempo é menor, você pode não ver nenhum dado.Run Query para renderizar o gráfico dos dados mais recentesDone EditingSave e salve a pasta de trabalho em algum nome preferido. Da próxima vez que você poderá ir diretamente nas seções Workbooks e clicar em Recriar apenas uma pasta de trabalho para ver o relatório com os dados mais recentes.
let WVDCUS = customEvents
| where itemType == 'customEvent' and operation_Name == 'WVDCUS.Event';
let WVDCUS_TelemetryStart = WVDCUS
| where name == 'TelemetryStart'
| project MachineName = tostring(customDimensions.MachineName), operation_Id, timestamp, VMResourceName = tostring(customDimensions.VMResourceName), ResourceGroupName = tostring(customDimensions.ResourceGroupName), SubscriptionId = tostring(customDimensions.SubscriptionId)
| summarize arg_max(timestamp, *) by MachineName;
let WVDCUS_Result = WVDCUS_TelemetryStart
| join kind = innerunique customEvents on operation_Id
| where name in ('NoUpdatesAvailable', 'UpdatesInstalledNoUpdates', 'UpdatesNotInstalledFailed', 'UpdatesInstalledRebootRequired', 'UpdatesInstalledAllOK', 'Error')
| extend State=replace(@'NoUpdatesAvailable', @'Up to date', name)
| extend State=replace(@'UpdatesInstalledNoUpdates', @'Up to date', State)
| extend State=replace(@'UpdatesNotInstalledFailed', @'Failed', State)
| extend State=replace(@'UpdatesInstalledRebootRequired', @'Reboot Required', State)
| extend State=replace(@'UpdatesInstalledAllOK', @'Up to date', State)
| extend State=replace(@'Error', @'Error', State)
| project MachineName, Timestamp = timestamp1, State, VMResourceName, ResourceGroupName, SubscriptionId;
WVDCUS_Result
| project MachineName, State, VMResourceName, ResourceGroupName, SubscriptionId
| summarize Count=count() by State
| render piechart;
Você também pode querer ver o relatório mostrando o estado atual de cada host. Você pode estender a pasta de trabalho apenas criada com uma nova parte do relatório.
EditAdd . Clique nele e selecione Add Query .CheckForUpdatesIntervalHours . Quando o intervalo de tempo é menor, você pode não ver nenhum dado.Run Query para ver os resultados dos dados mais recentesDone EditingSave let WVDCUS = customEvents
| where itemType == 'customEvent' and operation_Name == 'WVDCUS.Event';
let WVDCUS_TelemetryStart = WVDCUS
| where name == 'TelemetryStart'
| project MachineName = tostring(customDimensions.MachineName), operation_Id, timestamp, VMResourceName = tostring(customDimensions.VMResourceName), ResourceGroupName = tostring(customDimensions.ResourceGroupName), SubscriptionId = tostring(customDimensions.SubscriptionId)
| summarize arg_max(timestamp, *) by MachineName;
let WVDCUS_Result = WVDCUS_TelemetryStart
| join kind = innerunique customEvents on operation_Id
| where name in ('NoUpdatesAvailable', 'UpdatesInstalledNoUpdates', 'UpdatesNotInstalledFailed', 'UpdatesInstalledRebootRequired', 'UpdatesInstalledAllOK', 'Error')
| extend State=replace(@'NoUpdatesAvailable', @'Up to date', name)
| extend State=replace(@'UpdatesInstalledNoUpdates', @'Up to date', State)
| extend State=replace(@'UpdatesNotInstalledFailed', @'Failed', State)
| extend State=replace(@'UpdatesInstalledRebootRequired', @'Reboot Required', State)
| extend State=replace(@'UpdatesInstalledAllOK', @'Up to date', State)
| extend State=replace(@'Error', @'Error', State)
| project MachineName, Timestamp = timestamp1, State, VMResourceName, ResourceGroupName, SubscriptionId;
WVDCUS_Result
| project MachineName, Timestamp, State, VMResourceName, ResourceGroupName, SubscriptionId
Você pode ver um relatório de exemplo combinado - contendo duas partes na figura abaixo.

Finalmente, você pode não ter interesse em verificar os relatórios diariamente. Talvez você queira fazer isso apenas se isso for realmente necessário. Nesse caso, você pode se beneficiar do mecanismo de alerta que o notificará que algum host precisa da sua atenção.
Novamente, Log Analytics Workspace possui essa capacidade interna. Para mais detalhes, consulte: https://docs.microsoft.com/en-us/azure/azure-monitor/learn/tutorial-ressonse
Aqui está como você pode criar alerta com base no conjunto de condições.
Application Insights , Logs seção, feche a janela com consultas de exemplocustomEvents .See in query editorNew alert rule na barra de ferramentasScope como é - deve estar apontando para corrigir a instância Application Insights .Condition , especifique o valor do intervalo de tempo - esse valor precisa estar alinhado com as configurações CheckForUpdatesIntervalHours . Quando o intervalo de tempo é menor, você pode não ver nenhum dado.Search queryNumber of results , Greater than e valor limite 0 - basicamente o alerta será acionado se algum novo registro que estiver em estado Failed , Reboot Required , Error foi retornado por consulta.Action Group existente. Clique no botão Select action group . Se necessário, clique para Create action group . Consulte https://docs.microsoft.com/en-us/azure/azure-monitor/platform/action-groups?wt.mc_id=portal-microsoft_azure_monitoring.Create alert rule let WVDCUS = customEvents
| where itemType == 'customEvent' and operation_Name == 'WVDCUS.Event';
let WVDCUS_TelemetryStart = WVDCUS
| where name == 'TelemetryStart'
| project MachineName = tostring(customDimensions.MachineName), operation_Id, timestamp, VMResourceName = tostring(customDimensions.VMResourceName), ResourceGroupName = tostring(customDimensions.ResourceGroupName), SubscriptionId = tostring(customDimensions.SubscriptionId)
| summarize arg_max(timestamp, *) by MachineName;
let WVDCUS_Result = WVDCUS_TelemetryStart
| join kind = innerunique customEvents on operation_Id
| where name in ('NoUpdatesAvailable', 'UpdatesInstalledNoUpdates', 'UpdatesNotInstalledFailed', 'UpdatesInstalledRebootRequired', 'UpdatesInstalledAllOK', 'Error')
| extend State=replace(@'NoUpdatesAvailable', @'Up to date', name)
| extend State=replace(@'UpdatesInstalledNoUpdates', @'Up to date', State)
| extend State=replace(@'UpdatesNotInstalledFailed', @'Failed', State)
| extend State=replace(@'UpdatesInstalledRebootRequired', @'Reboot Required', State)
| extend State=replace(@'UpdatesInstalledAllOK', @'Up to date', State)
| extend State=replace(@'Error', @'Error', State)
| project MachineName, Timestamp = timestamp1, State, VMResourceName, ResourceGroupName, SubscriptionId;
WVDCUS_Result
| where State in ('Failed','Reboot Required', 'Error')
| project MachineName, Timestamp, State, VMResourceName, ResourceGroupName, SubscriptionId
Isso deve desencadear ação e atenção quando algum host cairá em um dos estados Failed , Reboot Required Error .
Alerta o e -mail que você pode receber para atrair sua atenção.
