Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ClientInspectorV2 — Ferramenta de inventário de clientes e detecção de deriva baseada no Azure que coleta dados de configuração do Windows (antivírus, patches, BitLocker) no LogAnalytics para painéis orientados por KQL e alertas do Sentinel. | Kitploit
Ferramentas/GitHubGitHub/knudsenmorten/clientinspectorv2
Ferramentas DefensivasAuditoria de ConfiguraçãoSegurança na NuvemResposta a IncidentesAnálise de Logs
GitHubknudsenmorten/clientinspectorv2

ClientInspectorV2

Ferramenta de inventário de clientes e detecção de deriva baseada no Azure que coleta dados de configuração do Windows (antivírus, patches, BitLocker) no LogAnalytics para painéis orientados por KQL e alertas do Sentinel.

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
275há 3 anosRevisado pelo Kitploit

Introdução ao ClientInspector (v2)

ClientInspector

Você está no controle? - ou alguns dos seus processos principais de infraestrutura, como patching, antivírus, ativação do BitLocker, estão desviando? Ou gostaria de fazer um inventário avançado, onde você possa consultar o estado da garantia contra a garantia da Lenovo ou Dell? Então continue lendo.

Conheça o ClientInspector, que pode ajudá-lo a obter grande visibilidade do seu ambiente cliente completo.

O ClientInspector é gratuito para a comunidade - construído para ser uma demonstração interessante de como você pode trazer dados dos seus clientes usando o Pipeline de Ingestão de Logs do Azure, Regras de Coleta de Dados do Azure, LogAnalytics do Azure; visualizá-los com Azure Monitor e Dashboards do Azure - e obter "alertas de desvio" usando o Microsoft Sentinel.

Vídeo 3m 01s - Dashboards

Arquitetura e fluxo do ClientInspector

O ClientInspector (v2) está carregando os dados coletados em logs personalizados no workspace do Azure LogAnalytics - usando a API de Ingestão de Logs, Regras de Coleta de Dados do Azure (DCR) e Endpoints de Coleta de Dados do Azure (DCE).

Arquitetura

Dashboards de Exemplo

KPIs

Antivírus

Telas azuis

Aviso

É importante para mim afirmar que não estou tentando construir uma ferramenta de gerenciamento separada, que competirá com o stack de segurança e gerenciamento da Microsoft.

Nada supera o stack de gerenciamento e segurança do Microsoft Azure/M365. Eles são soluções fantásticas.

Mas sou realmente apaixonado pelas capacidades de registro e pelo poder de trazer dados de volta de clientes, servidores, nuvem e sistemas de terceiros - e obter informações valiosas a partir dos dados.

Tenho uma solução semelhante para servidores - ServerInspector. Infelizmente, ela não é pública.

Muito obrigado às grandes pessoas das equipes de produtos Microsoft - vocês são fantásticos 😄

Feliz caçada 😄


Links Rápidos

Quais dados estão sendo coletados?
Dashboards de Estado Desejado - Como obter visibilidade do meu ambiente a partir dos dados?
Como consulto os dados? - Kusto (KQL) é a resposta
Arquitetura, Esquema e Rede
Implementação
Dependências
Executando ClientInspector.ps1 - 3 modos
Saída de exemplo do ClientInspector
Segurança
Layout do conjunto de dados do ClientInspector
Modo detalhado e mais ajuda
Custo - Quanto custa armazenar esses dados? Encontrou bugs? Por favor, informe-me
Contato

Vídeos da solução

Vídeo 3m 19s - Executando ClientInspector usando linha de comando (modo normal)
Vídeo 1m 40s - Criação automática de 2 tabelas e DCRs (modo detalhado)
Vídeo 1m 37s - Criação automática de 2 tabelas e DCRs (modo normal)
Vídeo 1m 34s - Veja o esquema da DCR e da tabela)
Vídeo 2m 19s - Manipulação de dados
Vídeo 1m 58s - Consultas Kusto nos dados
Vídeo 3m 01s - Dashboards
Vídeo 0m 48s - Exemplo de uso dos dados - consulta ao banco de garantia da Lenovo
Vídeo 7m 25s - Implantação via ClientInspector DeploymentKit


Quais dados estão sendo coletados?

O ClientInspector pode ser usado para coletar muitas informações valiosas dos seus clientes Windows - e enviar os dados para Tabelas Personalizadas do Azure LogAnalytics.

O script coleta as seguintes informações (configurações, informações, configuração, estado):

  1. Usuário logado no cliente
  2. Informações do computador - BIOS, processador, informações de hardware, informações do SO Windows, informações do sistema operacional, última reinicialização
  3. Aplicativos instalados, tanto via WMI quanto registro
  4. Central de Segurança do Antivírus do Windows - antivírus padrão, estado, configuração
  5. Microsoft Defender Antivírus - todas as configurações, incluindo ASR, exclusões, proteção em tempo real, etc.
  6. Office - versão, configuração do canal de atualização, SKUs
  7. Cliente VPN - versão, produto
  8. LAPS - versão
  9. Admin By Request (terceiros) - versão
  10. Windows Update - último resultado (quando), informações da fonte de atualização do Windows (onde), atualizações pendentes, últimas instalações (o quê)
  11. BitLocker - configuração
  12. Log de eventos - procurar eventos específicos, incluindo eventos de logon, telas azuis, etc.
  13. Adaptadores de rede - configuração, adaptadores instalados
  14. Informações de IP para todos os adaptadores
  15. Associação do grupo de administradores locais
  16. Firewall do Windows - configurações para todos os 3 modos
  17. Política de Grupo - última atualização
  18. Informações do TPM - relevantes para detectar máquinas com/sem TPM

Sinta-se à vontade para adicionar mais coleções de dados interessantes para atender às suas necessidades. Se quiser participar da comunidade, envie-me um e-mail com suas coleções, se achar que podem ser benéficas para toda a comunidade.


Dados de origem - quais dados posso usar?

Você pode usar qualquer dado de origem que possa ser recuperado no PowerShell (wmi, cim, dados externos, API REST, formato xml, formato json, formato csv, etc.)

É muito importante entender que os dados normalmente precisam ser manipulados antes de serem enviados - para garantir que sejam válidos e que quaisquer dados irrelevantes tenham sido removidos.

O ClientInspector usa todas as 24 funções do módulo PowerShell AzLogDcIngestPS para lidar com a manipulação dos dados de origem, a fim de remover "ruídos" nos dados, renomear colunas proibidas em tabelas/DCR - e suportar necessidades de transparência com insights extras como UserLoggedOn, CollectionTime, Computer:

Exemplos de como usar as funções Convert-CimArrayToObjectFixStructure, Add-CollectionTimeToAllEntriesInArray, Add-ColumnDataToAllEntriesInArray, ValidateFix-AzLogAnalyticsTableSchemaColumnNames, Build-DataArrayToAlignWithSchema, Filter-ObjectExcludeProperty```js #------------------------------------------------------------------------------------------- # Collecting data (in) #-------------------------------------------------------------------------------------------

Write-Output "" Write-Output "Collecting Bios information ... Please Wait !"

$DataVariable = Get-CimInstance -ClassName Win32_BIOS

#-------------------------------------------------------------------------------------------

Preparing data structure

#-------------------------------------------------------------------------------------------

convert CIM array to PSCustomObject and remove CIM class information

$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose

add CollectionTime to existing array

$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose

add Computer & UserLoggedOn info to existing array

$DataVariable = Add-ColumnDataToAllEntriesInArray -Data $DataVariable -Column1Name Computer -Column1Data $Env:ComputerName -Column2Name UserLoggedOn -Column2Data $UserLoggedOn -Verbose:$Verbose

Remove unnecessary columns in schema

$DataVariable = Filter-ObjectExcludeProperty -Data $DataVariable -ExcludeProperty __*,SystemProperties,Scope,Qualifiers,Properties,ClassPath,Class,Derivation,Dynasty,Genus,Namespace,Path,Property_Count,RelPath,Server,Superclass -Verbose:$Verbose

Por favor, veja mais detalhes sobre funções disponíveis no AzLogDcrIngestPS - e como usá-las aqui


Dashboards de Estado Desejado - Como obter visão do meu ambiente a partir dos dados?

Como parte da implantação inicial usando ClientInSpectorV2-DeploymentKit, você terá acesso a muitos Azure Dashboards e Azure Workbooks.

Vídeo 3m 01s - Dashboards

A ideia dos dashboards é que eles mostrarão onde sua infraestrutura está se desviando do 'estado desejado'. Pense neles como KPIs, onde a infraestrutura não está sob controle.

Em vez de ter uma tarefa de aplicar patches e gerenciar antivírus, você pode considerar ter KPIs, que mostrarão onde os computadores não estão corrigidos - ou onde a proteção em tempo real do antivírus não está em execução - ou máquinas que tiveram tela azul nas últimas 24 horas.

Este é o mesmo conceito que Microsoft Secure Score.

Antivírus

Telas azuis

Mais exemplos de visualizações incluídos na solução

Antivírus

Antivírus

Antivírus

Aplicativos

Bitlocker

Bitlocker

Telas azuis

Informações do Computador

Informações do Computador

Informações do Computador

Informações do Computador

Defender

Office

Link para ver a lista completa de Azure Workbooks fornecidos

Todos os exemplos de Azure Dashboards são criados com base em partes fixadas dos Azure Workbooks, então se você quiser detalhar, pode clicar em um link e terá acesso às informações detalhadas.

Dashboards

Link para ver os Azure Dashboards fornecidos

Posso criar meus próprios workbooks e dashboards - sim, você pode 😄

Se você quiser adicionar mais dashboards ou workbooks, normalmente começará investigando os dados coletados nas tabelas de logs personalizados usando consultas KQL. Quando encontrar a consulta desejada, poderá criar novas visualizações em workbooks - e fixar suas favoritas em seus dashboards.


Como consultar os dados? - Kusto (KQL) é a resposta

Se você não conhece a linguagem Kusto, recomendo que comece a brincar com ela, pois é uma linguagem realmente poderosa.

Vídeo 1m 58s - Consultas Kusto nos dados
Vídeo 3m 01s - Dashboards

Escreva sua primeira consulta com a Linguagem de Consulta Kusto

Analise os resultados da consulta usando KQL

Abaixo estão 4 exemplos de consultas para você começar - baseados nos dados do ClientInspector.

Exemplo de consulta 1: Busca avançada usando consulta Kusto (KQL)

Se você quiser fazer busca avançada, pode usar consultas tradicionais Kusto (KQL) nas tabelas

Exemplo de consulta ```js InvClientDefenderAvV2_CL | where TimeGenerated > ago(31d) | summarize CollectionTime = arg_max(CollectionTime, *) by Computer | where ((AMRunningMode == "Not running") or (parse_version(AMProductVersion) < parse_version("4.18.2203")) or (MPComputerStatusFound == false) or (MPPreferenceFound == false) or (RealTimeProtectionEnabled == false) or (AntivirusSignatureAge > 7) or (AntispywareSignatureAge > 7) or (NISSignatureAge > 7) or (AMRunningMode == "EDR Block Mode") or (AMRunningMode == "Passive Mode") or (AntispywareEnabled == false) or ((TamperProtectionSource != "ATP") and (TamperProtectionSource != "Intune")) or (IsTamperProtected == false) ) | project Computer, UserLoggedOn, CollectionTime, MPComputerStatusFound, MPPreferenceFound, AMEngineVersion, AMProductVersion, AMRunningMode, AMServiceEnabled, AMServiceVersion, AntispywareEnabled, AntispywareSignatureAge, AntispywareSignatureLastUpdated, AntispywareSignatureVersion, AntivirusEnabled, AntivirusSignatureAge, AntivirusSignatureLastUpdated, AntivirusSignatureVersion, BehaviorMonitorEnabled, DefenderSignaturesOutOfDate, DisableAutoExclusions, DisableBehaviorMonitoring, DisableRealtimeMonitoring, DisableScanningMappedNetworkDrivesForFullScan, DisableScanningNetworkFiles, DisableScriptScanning, EnableControlledFolderAccess, EnableNetworkProtection, FullScanAge, IoavProtectionEnabled, IsTamperProtected, IsVirtualMachine, MAPSReporting, NISEnabled, NISEngineVersion, NISSignatureAge, NISSignatureLastUpdated, NISSignatureVersion, OnAccessProtectionEnabled, ProductStatus, PUAProtection, QuickScanAge, RealTimeProtectionEnabled, RealTimeScanDirection, RebootRequired, ScanAvgCPULoadFactor, SignatureUpdateCatchupInterval, SignatureUpdateInterval, SubmitSamplesConsent, TamperProtectionSource ```

Exemplo de consulta 2: Consulta Kusto para mesclar dados de 3 tabelas

Exemplo de consulta ```js InvClientComputerInfoBiosV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer | join (InvClientComputerInfoSystemV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | join (InvClientComputerOSInfoV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | project Computer, UserLoggedOn, SerialNumber, Manufacturer, PCSystemType, SystemFamily, Model, Windows=Caption2, WindowsVersion=Version1, TimeGenerated ```

Exemplo de consulta 3: Consultar dados do LogAnalytics a partir do PowerShell

Exemplo de consulta ```js Connect-AzAccount

#----------------------------------------------------------------------------------------------------------------------

Variables

#----------------------------------------------------------------------------------------------------------------------

$LogAnalyticsWorkspaceId = "e74ca75a-c0e6-4933-a4f7-e5ae943fe4ac"

#----------------------------------------------------------------------------------------------------------------------

Collecting Computer data from Azure LogAnalytics

#---------------------------------------------------------------------------------------------------------------------- $Query = @' InvClientComputerInfoBiosV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,) by Computer | join (InvClientComputerInfoSystemV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,) by Computer) on $left.Computer == $right.Computer | join (InvClientComputerOSInfoV2_CL | summarize TimeGenerated = arg_max(TimeGenerated,*) by Computer) on $left.Computer == $right.Computer | project Computer, UserLoggedOn, SerialNumber, Manufacturer, PCSystemType, SystemFamily, Model, Windows=Caption2, WindowsVersion=Version1, TimeGenerated '@

write-output "Collecting computer information from LogAnalytics" $Query = Invoke-AzOperationalInsightsQuery -WorkspaceId $LogAnalyticsWorkspaceId -Query $Query $ComputerInfoArray = $Query.Results $ComputerInfoArray

root@kitploit:~
</details>

## Consulta de exemplo 4: Integração de dados com outras fontes (verificação de garantia contra a base de dados de garantia da Lenovo)

Quando temos os dados no Azure LogAnalytics, podemos começar a integrá-los com outras fontes, como dados de garantia da Dell ou Lenovo, através de pesquisa REST API.

[Vídeo 0m 48s - Exemplo de utilização de dados - pesquisa na base de dados de garantia da Lenovo](https://youtu.be/3ZDyTwiLU0w)

Abaixo está um exemplo de resultado, criado automaticamente por um script PowerShell - extraindo uma lista de computadores e números de série - e depois pesquisando na base de dados de garantia da Lenovo para obter informações sobre quando o computador foi comprado e o seu estado de garantia.

[Exemplo de resultado de garantia (Excel), baseado nos dados recolhidos pelo ClientInspector](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/img/WarrantyInfo.xlsx)

<br>

# Arquitetura, Schema e Rede
O ClientInspector (v2) está a carregar os dados recolhidos em **logs personalizados** no **espaço de trabalho Azure LogAnalytics** - utilizando a **API de ingestão de logs**, **Regras de Recolha de Dados (DCR) do Azure** e **Pontos Finais de Recolha de Dados (DCE) do Azure**.

![Arquitetura](https://assets.kitploit.com/production/public/readmes/6097/a1f4330c4e3747c2ebe092927df32352c2c158028f239afb7617e608aa882966.png)

## Schema
Tanto a DCR como a tabela do LogAnalytics possuem um schema, que precisa de corresponder ao schema do objeto de origem. Isto é tratado utilizando funções no módulo AzLogDcrIngestPS.

[Vídeo 1m 40s - Criação automática de 2 tabelas e DCRs (modo verbose)](https://youtu.be/rIUNs3yT-eI)
[Vídeo 1m 37s - Criação automática de 2 tabelas e DCRs (modo normal)](https://youtu.be/khQMDcON6r8)
[Vídeo 1m 34s - Ver schema da DCR e tabela)](https://youtu.be/NDSNhvpa4Gs)

O AzLogDcrIngestPS suporta 2 modos para gerir o schema: **Merge** e **Overwrite**

### SchemaMode = Merge  (padrão)
Se definir SchemaMode = Merge, novas propriedades do objeto de origem serão adicionadas (mescladas) ao schema atual do log analytics. A DCR importará o schema da tabela do log analytics para garantir que são idênticos.

O modo padrão é Merge, se não definir a variável SchemaMode nas funções:
CheckCreateUpdate-TableDr-Structure
CreateUpdate-AzLogAnalyticsCustomLogTableDcr
CreateUpdate-AzDataCollectionRuleLogIngestCustomLog

### SchemaMode = Overwrite
Se definir SchemaMode = Overwrite, o schema na DCR e na tabela será substituído (atualizado) - com base no schema do objeto de origem.

## Rede
Tem 3 opções para conectividade ao Azure para carregamento de dados:

|Método de carregamento|Detalhes de conectividade|Conformidade do SO|
|:---------------------|:------------------------|:-----------------|
|Acesso público|O endpoint REST envia para DCE através do IP público da DCE|O endpoint suporta TLS 1.2|
|Acesso privado|O endpoint REST envia para DCE através do link privado da DCE|O endpoint suporta TLS 1.2|
|Log-hub|O endpoint REST envia dados através do [log-hub](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub) - um conceito que criei.|O endpoint não suporta TLS 1.2.<br>O Azure não aceitará conectividade diretamente destes dispositivos|

### Endpoints com ligação à Internet - conformidade a nível do SO
![Endpoints com ligação à Internet - conformidade a nível do SO](https://assets.kitploit.com/production/public/readmes/6097/3cc67f07297302ff59d08c95a790ec8ad417f8dbd07f566a24b154eecfecb8bb.png)

Os seguintes endpoints devem ser permitidos na sua firewall:
|Endpoint|Objetivo|Porta|Direção|Ignorar Inspeção HTTPS|
|:-------|:-------|:----|:------|:----------------------|
|global.handler.control.monitor.azure.com|Serviço de controlo de acesso|Porta 443|Saída|Sim|
|dce logs ingestion uri<br><br>exemplo<br>https://dce-log-platform-management-client-demo-p-iur0.westeurope-1.ingest.monitor.azure.com|Ingestão de dados de log|Porta 443|Saída|Sim|

<br>

### Sem acesso à Internet ou não conformidade a nível do SO, ex.: a executar TLS 1.0/1.1
[Consulte o conceito de log-hub através deste link](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub)

![Sem acesso à Internet ou não conformidade a nível do SO, ex.: a executar TLS 1.0/1.1](https://assets.kitploit.com/production/public/readmes/6097/42435b25d7c2cc8d405e62d577420fa980aef5f9267f461c56ce9a08f7f81917.png)

<br>

# Implementação
Espero que ache que é bastante fácil configurar tudo. As 3 etapas estão descritas abaixo.

Antes de começar, recomendo que leia mais detalhadamente sobre os componentes na introdução abaixo.

<details>
  <summary>Introdução dos componentes do Azure utilizados como parte do ClientInspector</summary>

<br>

Os seguintes componentes são necessários:

| Recurso do Azure          | Objetivo                                                   | Mais informações |
| :------------------------ | :--------------------------------------------------------- | :-------------   |
| Qualquer endpoint REST    | Esta é a fonte que envia dados                             |                  |
| Log Ingestion API         | Esta é a nova API que substitui a antiga API de recolha de dados HTTP | https://learn.microsoft.com/pt-pt/azure/azure-monitor/logs/logs-ingestion-api-overview |
| Data Collection Endpoint (DCE) | Este é o ponto de entrada de comunicação do endpoint. Os dados são enviados para um **URI de ingestão do Azure Data Collection Endpoint**. Um único DCE pode suportar múltiplos DCRs, por isso pode especificar um DCR diferente para diferentes fontes e tabelas de destino. | https://learn.microsoft.com/pt-pt/azure/azure-monitor/essentials/data-collection-endpoint-overview?tabs=portal |
| Data Collection Rules (DCR) | As regras de recolha de dados definem os dados recolhidos (schema) e especificam como e onde esses dados devem ser enviados ou armazenados. O DCR deve compreender a estrutura dos dados de entrada e a estrutura da tabela de destino. Se não corresponderem, pode utilizar uma transformação para converter os dados de origem para corresponderem à tabela de destino. Também pode utilizar a transformação para filtrar os dados de origem e realizar outros cálculos ou conversões. | https://learn.microsoft.com/pt-pt/azure/azure-monitor/essentials/data-collection-rule-overview |
| Espaço de trabalho Azure LogAnalytics | Os dados são enviados para logs personalizados no Azure LogAnalytics | https://learn.microsoft.com/pt-pt/azure/azure-monitor/logs/log-analytics-overview |
| Azure Workbooks           | Como parte da implementação, serão implementados workbooks de exemplo | https://learn.microsoft.com/pt-pt/azure/azure-monitor/visualize/workbooks-overview |
| Azure Dashboards          | Como parte da implementação, serão implementados dashboards de exemplo | https://learn.microsoft.com/pt-pt/azure/azure-monitor/visualize/tutorial-logs-dashboards |
| Kusto (KQL)               | Os dados podem ser analisados usando consultas Kusto (KQL) | https://learn.microsoft.com/pt-pt/azure/azure-monitor/logs/get-started-queries |

</details>

As etapas para configurar o ClientInspector no seu ambiente são:
1. [Configure o ambiente utilizando o ClientInSpectorV2-DeploymentKit](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit)

2. Execute o ClientInspector pela primeira vez (configuração inicial) - veja mais abaixo
<details>
  <summary>Como configurar a configuração inicial das tabelas do Azure LogAnalytics e Regras de Recolha de Dados (primeira vez)</summary>

<br>
Recomendo ter um computador de referência, que seja utilizado para a gestão de tabelas/DCR. Desta forma, é um processo controlado, caso sejam necessárias alterações - por exemplo, se o schema do objeto de origem mudar.

<br>
<br>
Configuração:

1. Quando executar o DeploymentKit, este preparará automaticamente o ficheiro ClientInspector para si, bastando apenas inserir as variáveis```js
$TenantId                                   = "xxxx" 
$LogIngestAppId                             = "xxxx" 
$LogIngestAppSecret                         = "xxxx" 

$DceName                                    = "xxxx" 
$LogAnalyticsWorkspaceResourceId            = "xxxx"

$AzDcrPrefixClient                          = "xxx" 
$AzDcrSetLogIngestApiAppPermissionsDcrLevel = $false
$AzDcrLogIngestServicePrincipalObjectId     = "xxx" 
$AzDcrDceTableCreateFromReferenceMachine    = @()
$AzDcrDceTableCreateFromAnyMachine          = $true
  1. Configure o trabalho de implantação para que o ClientInspector seja executado todos os dias para coletar o inventário. Você pode executar o script do ClientInspector usando sua ferramenta de implantação favorita. Scripts para Microsoft Intune e ConfigMgr são fornecidos.
Como implantar usando o Microsoft Intune ?
Você executará o script de inventário usando 'remediações proativas' no Microsoft Intune.
  1. Baixe o script de detecção ClientInspector_Detection.ps1 (clique com o botão direito e escolha 'salvar link como')

  2. Abra o arquivo com seu editor favorito. Ajuste a frequência de execução do inventário```js ##################################

VARIABLES

##################################

root@kitploit:~
$RunEveryHours    = 8
$LastRun_RegPath  = "HKLM:\SOFTWARE\ClientInspector"
$LastRun_RegKey   = "ClientInSpector_System"
root@kitploit:~
3. Agora precisamos criar o trabalho de remediação. Vá ao portal Microsoft Intune -> Relatórios -> Análise de Endpoint --> Remediações Proativas - e crie um pacote de script conforme mostrado abaixo

NOTA: Para o script de remediação, use o arquivo **ClientInspector.ps1**

![Flow](https://assets.kitploit.com/production/public/readmes/6097/c5d24f8afca4130a3a58414028120540526722b92ed5c9ae6cb029c605baf657.png)

![Flow](https://assets.kitploit.com/production/public/readmes/6097/ea200a01c92a84d801e03439891428130160b4dd8bbb11e6ecac4b2f68de18d1.png)


### Limitação do Intune

NOTA: O Intune tem uma limitação de tamanho de 200 Kb para um script de remediação.**  

![Intune-error](https://assets.kitploit.com/production/public/readmes/6097/7488505e7c4a5e3fa31e1007bf435b89aeb5ebf4fb1c1dbf133835082cce33e6.png)


Caso você atinja esse limite, proponho dividir o script em 2 scripts. 

![Intune-split](https://assets.kitploit.com/production/public/readmes/6097/3ddc7edb1bdf2a492928a0dad8487996a9166878fba20a0403d347a895fe69a3.png)

![Intune-split](https://assets.kitploit.com/production/public/readmes/6097/36f29366fa4fbf0f878a569489c59100601f5a27f8d015373497b9fd387309ec.png)

Lembre-se de incluir a seção de cabeçalho, incluindo a seção UserLoggedOn como cabeçalho do segundo arquivo. UserLoggedOn é usado para mostrar qual usuário está logado.

Eu preparei uma [configuração de script de exemplo](https://github.com/KnudsenMorten/ClientInspectorV2/tree/main/Sample%20intune%20setup%20if%20file%20size%20is%20more%20than%20200%20Kb), onde você pode ver como separá-los. Nota: o código NÃO está atualizado nesses scripts, então certifique-se de pegar as seções do arquivo mestre ClientInspector.

Basicamente, a estrutura é:

O arquivo 1 contém cabeçalho + UserLoggedOn (seção 1) + seções 2-9 + escreve a flag de verificação em HKLM\Software\ClientInspector\ClientInspector_System_1  

O arquivo 2 contém cabeçalho + UserLoggedOn (seção 1) + seções 10-18 + escreve a flag de verificação em HKLM\Software\ClientInspector\ClientInspector_System_2  


![Flow](https://assets.kitploit.com/production/public/readmes/6097/37639a721b2d45fae907e177c6cb90ea32151f1ab8bdb1262e8e2bed0f8ec354.png)

![Flow](https://assets.kitploit.com/production/public/readmes/6097/96d02fdeaf59594c29e9755b0033557a3594e33b6bf61b92fa38edebd4c5b84d.png)

![Flow](https://assets.kitploit.com/production/public/readmes/6097/070c7a1431ad3899d496cc333224c8ff58b35d523ba7c77e11ba151501039d73.png)


</details>


<details>
  <summary>Como implantar usando ConfigMgr (ou qualquer outra ferramenta que execute um arquivo CMD)?</summary>
  
<br>
Você executará o script de inventário por meio de um pacote tradicional + implantação
    
1. [Baixe o arquivo CMD ClientInspector.cmd](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/ConfigMgr/ClientInspector.cmd) (clique com o botão direito e escolha 'salvar link como')

2. Crie uma estrutura de origem no diretório de origem do seu pacote ConfigMgr, por exemplo, chamado ClientInspector. 

3. Copie os 2 arquivos necessários **ClientInspector.cmd** e **ClientInspector.ps1** para o diretório

4. Crie um pacote - e aponte o pacote para executar **ClientInspector.cmd**

5. Faça uma implantação

</details>

<br>

# Dependências

## Módulo Powershell AzLogDcringestPS - criado por mim (Morten Knudsen)

O ClientInspector requer o módulo Powershell, **AzLogDcrIngestPS**

As principais funcionalidades do módulo Powershell **AzLogDcrIngestPS** incluem:
* criar/atualizar os DCRs e tabelas automaticamente - com base no esquema do objeto de origem
* validar o esquema para problemas de convenção de nomenclatura. Se existirem, ele mitigará os problemas
* atualizar o esquema dos DCRs e tabelas, se a estrutura do objeto de origem mudar
* correção automática se algo der errado com um DCR ou tabela
* pode remover dados do objeto de origem, se houver colunas de dados que você não deseja enviar
* pode converter objetos de origem com base em objetos CIM ou PS em PSCustomObjects/array
* pode adicionar informações relevantes a cada registro, como UserLoggedOn, Computer, CollectionTime

Você pode encontrar informações mais detalhadas sobre o módulo usando os links abaixo:

[AzLogDcrIngestPS (Github)](https://github.com/KnudsenMorten/AzLogDcrIngestPS)

[AzLogDcrIngestPS (Powershell Gallery)](https://www.powershellgallery.com/packages/AzLogDcrIngestPS)

[AzLogDcrIngestPSLogHub (Github)](https://github.com/KnudsenMorten/AzLogDcrIngestPSLogHub)

<br>

## Módulos Powershell de terceiros
Prefiro recuperar informações do Windows Update usando um módulo Powershell conhecido, PSWindowsUpdate.

|Nome do Módulo|Propósito|Mais informações|Crédito|
|:---------|:------|:--------|:-----|
|NuGet|Provedor de pacotes comum usado para implantar muitos módulos Powershell, incluindo AzLogDcrIngestPS<br><br>O Provedor de Pacotes será instalado automaticamente no computador quando o script for executado|[Link](https://www.nuget.org/packages)|
|PSWindowsUpdate|Coleção de informações do Windows Update (atualizações pendentes, atualizações instaladas, etc.)<br><br>O módulo será instalado automaticamente no computador quando o script for executado|[Link](https://www.powershellgallery.com/packages/PSWindowsUpdate)|Michal Gajda

<br>

# Executando ClientInspector.ps1 - 3 modos
O ClientInspector suporta 3 maneiras de instalar/atualizar/importar o módulo Powershell necessário: **Download**, **PsGallery**, **LocalPath**

Por padrão, ele baixará a versão mais recente da PsGallery no escopo CurrentUser.

[Vídeo 3m 19s - Executando ClientInspector usando linha de comando (modo normal)](https://youtu.be/4kA4BE0zJ9g)  

## .\ClientInspector.ps1 -function:LocalPath
O ClientInspector procurará o arquivo **AzLogDcrIngest.psm1** no diretório onde o script será executado. 
Se AzLogDcrIngest.psm1 estiver faltando, o script será encerrado - caso contrário, fará um import-module.

Exemplo

.\ClientInspector.ps1 -function:LocalPath```
.\ClientInspector.ps1 -verbose:$false -function:localpath

ClientInspector | Inventory of Operational & Security-related information
Developed by Morten Knudsen, Microsoft MVP - for free community use

Using AzLogDcrIngestPS module from local path D:\scripts\ClientInspectorV2
Baixar ferramenta

Validating/fixing schema data structure of source data

$DataVariable = ValidateFix-AzLogAnalyticsTableSchemaColumnNames -Data $DataVariable -Verbose:$Verbose

Aligning data structure with schema (requirement for DCR)

$DataVariable = Build-DataArrayToAlignWithSchema -Data $DataVariable -Verbose:$Verbose

root@kitploit:~
Você pode verificar o objeto fonte executando este comando````
# Get insight about the schema structure of an object BEFORE changes. Command is only needed to verify columns in schema
Get-ObjectSchemaAsArray -Data $DataVariable -Verbose:$Verbose

Office

Office

Office

WU

WU

WU

Winfw

  1. Inicie o Powershell como administrador local

  2. Execute o script usando este comando```js C:\ClientInspector\ClientInspector.ps1 -verbose:$true

root@kitploit:~
4. ClientInspector será executado por 10-20 min e criará as tabelas necessárias e as Regras de Coleta de Dados - com base na estrutura real do seu ambiente. Por favor, revise os resultados na tela e procure por erros (vermelho)

5. Quando tudo parecer certo, execute o script novamente e ele passará muito mais rápido. Verifique se os dados estão chegando usando consultas Kusto nas diferentes tabelas. NOTA: Pode levar aproximadamente 10-15 min para o primeiro upload de dados, pois o pipeline precisa ser criado no backend

6. Como última alteração, precisamos alterar 2 parâmetros nos parâmetros para informar ao ClientInspector para fazer apenas alterações de esquema quando executado a partir da máquina de referência.```js
$AzLogDcrTableCreateFromReferenceMachine    = @("<<MyReferenceMachineComputerName>>")   # sample @("ComputerName")
$AzLogDcrTableCreateFromAnyMachine          = $false    # important so changes can only happen on reference machine
  1. Você está pronto para implantá-lo em seu grupo de teste

.\ClientInspector.ps1 -function:Download

O ClientInspector irá baixar a versão mais recente do meu repositório no Github e armazená-la no caminho local a cada execução (aproximadamente 300 kb)

Exemplo``` .\ClientInspector.ps1 -verbose:$false -function:download

ClientInspector | Inventory of Operational & Security-related information Developed by Morten Knudsen, Microsoft MVP - for free community use

Downloading latest version of module AzLogDcrIngestPS from https://github.com/KnudsenMorten/CientInspectorV2 into local path D:\scripts\ClientInspectorV2

root@kitploit:~
## .\ClientInspector.ps1 -function:PsGallery -scope [AllUsers|CurrentUser]
Este parâmetro requer outro parâmetro: -scope [AllUsers | CurrentUser]

O ClientInspector verificará se o módulo está instalado no escopo escolhido.
Se não estiver instalado, ele baixará automaticamente a versão mais recente da Galeria do PowerShell e importará o módulo.
Se o cliente estiver executando a versão mais recente, ele continuará.

Exemplo```
.\ClientInspector.ps1 -verbose:$false -function:PSGallery -scope:CurrentUser

ClientInspector | Inventory of Operational & Security-related information
Developed by Morten Knudsen, Microsoft MVP - for free community use

Powershell module was not found !
Installing in scope currentuser .... Please Wait !

  • Código aberto (MIT)
  • Aplicativo móvel
  • Suporte a 2FA
  • Sem rastreamento
  • Armazenamento de dados criptografado
  • Compartilhamento seguro
  • Importar de outros aplicativos
  • Opções de importação/exportação
  • Interface de linha de comando
  • Extensão de navegador
  • Gerador de senhas fortes
  • Preenchimento automático
  • Suporte ao formato KeePass
  • Gerador de TOTP``` .\ClientInspector.ps1 -verbose:$false -function:PsGallery -scope:currentuser

ClientInspector | Inventory of Operational & Security-related information Developed by Morten Knudsen, Microsoft MVP - for free community use

Checking latest version at PsGallery for AzLogDcrIngestPS module OK - Running latest version

root@kitploit:~
</details>

<br>

## Exemplo de saída do ClientInspector
[Vídeo 3m 19s - Executando ClientInspector usando linha de comando (modo normal)](https://youtu.be/4kA4BE0zJ9g)  


<br>

# Segurança
## Assinatura de código
Tanto o **arquivo ClientInspector.ps1** quanto o **módulo AzLogDcrIngestPS (AzLogDcrIngest.psm1)** são assinados com meu certificado de assinatura de código (2LINKIT - minha empresa). Desta forma, você pode executá-lo se exigir scripts assinados. Claro, você também pode optar por assiná-lo com seu próprio certificado de assinatura de código interno.

![Assinado](https://assets.kitploit.com/production/public/readmes/6097/95ae9fae064341feae5467ba04c909e3bab84393eb7070a304d9d9e6fd184499.png)

Por favor, [baixe o certificado de chave pública](https://github.com/KnudsenMorten/ClientInspectorV2/raw/main/Trusted_Publisher_Certificate/2LINKIT-TrustedPublisher.cer) e coloque-o no seu contêiner 'editor confiável' para confiar no editor (2LINKIT - minha empresa). Você pode implantar isso usando Intune ou Política de Grupo.

![Editor Confiável](https://assets.kitploit.com/production/public/readmes/6097/b02285397783a3495f5d1418ed716fa450b677117dd1754875354779568b0b47.png)  
![Editor Confiável](https://assets.kitploit.com/production/public/readmes/6097/740ae59eff117b8e59d56a7274440a991b7c5ceddd486894160d0248826084b2.png)  
![Editor Confiável](https://assets.kitploit.com/production/public/readmes/6097/47d1eb6b7da9ff5a341b8486c7b4bc7532b0b8ef3d05e7b710d495e183929279.png)  


### A implantação via Intune não exige que o editor confiável esteja configurado
Por padrão, o Intune usará BYPASS ao executar scripts de correção.

## Estrutura
A segurança do **ClientInspector** está dividida em 4 camadas: **dados de entrada**, **envio de dados** (para o backend) e **visualização de dados** (dashboards) - e **gerenciamento de esquema**

| Fase | Implementação de Segurança | Delegações / Permissões|
|:------|:------------------------|:------------------------|
|Dados de entrada (coleta)|Esta fase é controlada pelo método que você escolhe para realizar a coleta real (Intune, ConfigMg ou outro de terceiros)|O script precisa ser executado como administrador local (contexto do sistema) para coletar dados essenciais do hardware e do Windows
|Envio de dados|A autenticação para a API de Ingestão de Logs é realizada no DCE, que utiliza autenticação padrão do Azure Resource Manager.<br><br>Uma estratégia comum é usar um ID de aplicativo e uma chave de aplicativo, que é o método utilizado no ClientInspector.<br><br>O AppId e o Segredo do Azure são armazenados no cabeçalho do ClientInspector para simplificar<br><br>Também é possível usar o Azure Keyvault para armazenar o AppId e o Segredo|[Detalhes abordados no ClientInspectV2-DeploymentKit](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit#security-1)
|Visualização de dados|Permissões RCAC do Azure|Conceda acesso ao seu Azure LogAnalytics, Azure Workbooks e Azure Dashboards|
|Gerenciamento de esquema|Método 1: RBAC do Azure (recomendado)<br><br>Método 2: Aplicativo Azure com segredo ou certificado|[Detalhes abordados no ClientInspectV2-DeploymentKit](https://github.com/KnudsenMorten/ClientInspectorV2-DeploymentKit#azure-rbac-security-adjustment-separation-of-permissions-between-log-ingestion-and-tabledcr-management)

<br>

# Layout do conjunto de dados do ClientInspector
Cada um dos conjuntos de dados (bios, aplicativos, bitlocker, etc.) é construído com a mesma estrutura de 4 fases:

## Fase 1/4 - Variáveis (nomenclatura - para onde enviar os dados)```
#-------------------------------------------------------------------------------------------
# Variables
#-------------------------------------------------------------------------------------------
	
$TableName  = 'InvClientComputerInfoSystemV2'   # must not contain _CL
$DcrName    = "dcr-" + $AzDcrPrefixClient + "-" + $TableName + "_CL"

Fase 2/4 - Coleta de Dados```

#-------------------------------------------------------------------------------------------

Collecting data (in)

#-------------------------------------------------------------------------------------------

Write-Output "" Write-Output "Collecting Computer system information ... Please Wait !"

$DataVariable = Get-CimInstance -ClassName Win32_ComputerSystem

root@kitploit:~
## Fase 3/4 - Manipulação de Dados (garantir que os dados estejam no formato correto e que qualquer 'ruído' seja removido e informações relevantes sejam adicionadas)```
#-------------------------------------------------------------------------------------------
# Preparing data structure
#-------------------------------------------------------------------------------------------

# convert CIM array to PSCustomObject and remove CIM class information
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose

# add CollectionTime to existing array
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose

# add Computer & UserLoggedOn info to existing array
$DataVariable = Add-ColumnDataToAllEntriesInArray -Data $DataVariable -Column1Name Computer -Column1Data $Env:ComputerName  -Column2Name UserLoggedOn -Column2Data $UserLoggedOn

# Validating/fixing schema data structure of source data
$DataVariable = ValidateFix-AzLogAnalyticsTableSchemaColumnNames -Data $DataVariable -Verbose:$Verbose

# Aligning data structure with schema (requirement for DCR)
$DataVariable = Build-DataArrayToAlignWithSchema -Data $DataVariable -Verbose:$Verbose

Fase 4/4 - Saída de Dados (enviar para LogAnalytics) - funções combinadas```

#-------------------------------------------------------------------------------------------

Create/Update Schema for LogAnalytics Table & Data Collection Rule schema

#-------------------------------------------------------------------------------------------

CheckCreateUpdate-TableDcr-Structure -AzLogWorkspaceResourceId $LogAnalyticsWorkspaceResourceId -SchemaMode Merge -AzAppId $LogIngestAppId -AzAppSecret $LogIngestAppSecret -TenantId $TenantId -Verbose:$Verbose -DceName $DceName -DcrName $DcrName -TableName $TableName -Data $DataVariable -LogIngestServicePricipleObjectId $AzDcrLogIngestServicePrincipalObjectId -AzDcrSetLogIngestApiAppPermissionsDcrLevel $AzDcrSetLogIngestApiAppPermissionsDcrLevel -AzLogDcrTableCreateFromAnyMachine $AzLogDcrTableCreateFromAnyMachine -AzLogDcrTableCreateFromReferenceMachine $AzLogDcrTableCreateFromReferenceMachine

#-----------------------------------------------------------------------------------------------

Upload data to LogAnalytics using DCR / DCE / Log Ingestion API

#-----------------------------------------------------------------------------------------------

Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output -DceName $DceName -DcrName $DcrName -Data $DataVariable -TableName $TableName ` -AzAppId $LogIngestAppId -AzAppSecret $LogIngestAppSecret -TenantId $TenantId -Verbose:$Verbose

root@kitploit:~
<br>

**DICA:  erro 513 - entidade muito grande**  
Por padrão, o ClientInspector enviará os dados em lotes dependendo de um tamanho médio calculado por registro. Caso seu conjunto de registros tenha tamanho diferente, você poderá receber um erro 513. 

A causa é que você está atingindo o limite de 1 mb por upload (limitação do Azure Pipeline). A Microsoft deseja receber muitos pedaços menores de dados, pois este é um ambiente compartilhado. Já vi esse problema ao recuperar a lista de todos os aplicativos instalados. Aparentemente, os aplicativos armazenam informações com graus de tamanho muito diferentes.

Você pode mitigar esse problema adicionando o parâmetro **-BatchAmount <número de registros a enviar por lote>** ao comando Post. Se quiser ter certeza, defina-o como 1```
Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output -DceName $DceName `
                                                   -DcrName $DcrName `
                                                   -Data $DataVariable `
                                                   -TableName $TableName `
                                                   -AzAppId $LogIngestAppId `
                                                   -AzAppSecret $LogIngestAppSecret `
                                                   -TenantId $TenantId `
                                                   -BatchAmount 1 `
                                                   -Verbose:$Verbose `
												   

Fase 4/4 "nos bastidores" - Saída de Dados (enviar para o LogAnalytics)```

#-----------------------------------------------------------------------------------------------

Check if table and DCR exist - or schema must be updated due to source object schema changes

#-----------------------------------------------------------------------------------------------

Get insight about the schema structure

$Schema = Get-ObjectSchemaAsArray -Data $Data $StructureCheck = Get-AzLogAnalyticsTableAzDataCollectionRuleStatus -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -TableName $TableName -DcrName $DcrName -SchemaSourceObject $Schema -SchemaMode $SchemaMode -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId ` -Verbose:$Verbose

#-----------------------------------------------------------------------------------------------

Structure check = $true -> Create/update table & DCR with necessary schema

#-----------------------------------------------------------------------------------------------

build schema to be used for LogAnalytics Table

$Schema = Get-ObjectSchemaAsHash -Data $Data -ReturnType Table -Verbose:$Verbose

CreateUpdate-AzLogAnalyticsCustomLogTableDcr -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -SchemaSourceObject $Schema -SchemaMode $SchemaMode -TableName $TableName -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId -Verbose:$Verbose

build schema to be used for DCR

$Schema = Get-ObjectSchemaAsHash -Data $Data -ReturnType DCR

CreateUpdate-AzDataCollectionRuleLogIngestCustomLog -AzLogWorkspaceResourceId $AzLogWorkspaceResourceId -SchemaSourceObject $Schema -SchemaMode $SchemaMode -DceName $DceName -DcrName $DcrName -TableName $TableName -LogIngestServicePricipleObjectId $LogIngestServicePricipleObjectId -AzDcrSetLogIngestApiAppPermissionsDcrLevel $AzDcrSetLogIngestApiAppPermissionsDcrLevel -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId -Verbose:$Verbose

$AzDcrDceDetails = Get-AzDcrDceDetails -DcrName $DcrName -DceName $DceName -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId ` -Verbose:$Verbose

Post-AzLogAnalyticsLogIngestCustomLogDcrDce -DceUri $AzDcrDceDetails[2] -DcrImmutableId $AzDcrDceDetails[6] -TableName $TableName -DcrStream $AzDcrDceDetails[7] -Data $Data -BatchAmount $BatchAmount -AzAppId $AzAppId -AzAppSecret $AzAppSecret -TenantId $TenantId ` -Verbose:$Verbose

root@kitploit:~
<br>

# Modo Verboso e Mais Ajuda
Se quiser obter informações mais detalhadas sobre o que está acontecendo, pode ativar o modo verboso (-verbose:$true)```
.\ClientInspector.ps1 -verbose:$true -function:localpath

Se preferir testar usando o Powershell ISE, você também pode ativar o modo verbose usando a variável $Verbose.``` $Verbose = $false # can be $true or $false

root@kitploit:~
Se você quiser obter ajuda com a sintaxe e exemplos do módulo AzLogDcrLogIngestPS, você pode escrever
get-module```
PS  get-command -module AzLogDcrIngestPS

CommandType     Name                                               Version    Source                                                                         
-----------     ----                                               -------    ------                                                                         
Function        Add-CollectionTimeToAllEntriesInArray              1.1.17     AzLogDcrIngestPS                                                               
Function        Add-ColumnDataToAllEntriesInArray                  1.1.17     AzLogDcrIngestPS                                                               
Function        Build-DataArrayToAlignWithSchema                   1.1.17     AzLogDcrIngestPS                                                               
Function        CheckCreateUpdate-TableDcr-Structure               1.1.17     AzLogDcrIngestPS                                                               
Function        Convert-CimArrayToObjectFixStructure               1.1.17     AzLogDcrIngestPS                                                               
Function        Convert-PSArrayToObjectFixStructure                1.1.17     AzLogDcrIngestPS                                                               
Function        CreateUpdate-AzDataCollectionRuleLogIngestCusto... 1.1.17     AzLogDcrIngestPS                                                               
Function        CreateUpdate-AzLogAnalyticsCustomLogTableDcr       1.1.17     AzLogDcrIngestPS                                                               
Function        Delete-AzDataCollectionRules                       1.1.17     AzLogDcrIngestPS                                                               
Function        Delete-AzLogAnalyticsCustomLogTables               1.1.17     AzLogDcrIngestPS                                                               
Function        Filter-ObjectExcludeProperty                       1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzAccessTokenManagement                        1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDceListAll                                   1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDcrDceDetails                                1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDataCollectionRuleTransformKql               1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzDcrListAll                                   1.1.17     AzLogDcrIngestPS                                                               
Function        Get-AzLogAnalyticsTableAzDataCollectionRuleStatus  1.1.17     AzLogDcrIngestPS                                                               
Function        Get-ObjectSchemaAsArray                            1.1.17     AzLogDcrIngestPS                                                               
Function        Get-ObjectSchemaAsHash                             1.1.17     AzLogDcrIngestPS                                                               
Function        Post-AzLogAnalyticsLogIngestCustomLogDcrDce        1.1.17     AzLogDcrIngestPS                                                               
Function        Post-AzLogAnalyticsLogIngestCustomLogDcrDce-Output 1.1.17     AzLogDcrIngestPS                                                               
Function        Update-AzDataCollectionRuleDceEndpoint             1.1.17     AzLogDcrIngestPS                                                               
Function        Update-AzDataCollectionRuleResetTransformKqlDef... 1.1.17     AzLogDcrIngestPS                                                               
Function        Update-AzDataCollectionRuleTransformKql            1.1.17     AzLogDcrIngestPS                                                               
Function        ValidateFix-AzLogAnalyticsTableSchemaColumnNames   1.1.17     AzLogDcrIngestPS                                                               

Obter ajuda com um cmdlet específico - get-help Add-CollectionTimeToAllEntriesInArray -full``` get-help Add-CollectionTimeToAllEntriesInArray -full

NAME Add-CollectionTimeToAllEntriesInArray

SYNOPSIS Add property CollectionTime (based on current time) to all entries on the object

SYNTAX Add-CollectionTimeToAllEntriesInArray [-Data] []

DESCRIPTION Gives capability to do proper searching in queries to find latest set of records with same collection time Time Generated cannot be used when you are sending data in batches, as TimeGenerated will change An example where this is important is a complete list of applications for a computer. We want all applications to show up when queriying for the latest data

PARAMETERS -Data Object to modify

root@kitploit:~
    Required?                    true
    Position?                    1
    Default value                
    Accept pipeline input?       false
    Accept wildcard characters?  false
    
<CommonParameters>
    This cmdlet supports the common parameters: Verbose, Debug,
    ErrorAction, ErrorVariable, WarningAction, WarningVariable,
    OutBuffer, PipelineVariable, and OutVariable. For more information, see 
    about_CommonParameters (https:/go.microsoft.com/fwlink/?LinkID=113216). 

INPUTS None. You cannot pipe objects

OUTPUTS Updated object with CollectionTime

root@kitploit:~
-------------------------- EXAMPLE 1 --------------------------

PS C:\>#-------------------------------------------------------------------------------------------

# Variables
#-------------------------------------------------------------------------------------------
$Verbose                   = $true  # $true or $false

#-------------------------------------------------------------------------------------------
# Collecting data (in)
#-------------------------------------------------------------------------------------------
$DNSName                   = (Get-CimInstance win32_computersystem).DNSHostName +"." + (Get-CimInstance win32_computersystem).Domain
$ComputerName              = (Get-CimInstance win32_computersystem).DNSHostName
[datetime]$CollectionTime  = ( Get-date ([datetime]::Now.ToUniversalTime()) -format "yyyy-MM-ddTHH:mm:ssK" )

$UserLoggedOnRaw           = Get-Process -IncludeUserName -Name explorer | Select-Object UserName -Unique
$UserLoggedOn              = $UserLoggedOnRaw.UserName

$DataVariable = Get-CimInstance -ClassName Win32_Processor | Select-Object -ExcludeProperty "CIM*"

#-------------------------------------------------------------------------------------------
# Preparing data structure
#-------------------------------------------------------------------------------------------
$DataVariable = Convert-CimArrayToObjectFixStructure -data $DataVariable -Verbose:$Verbose
$DataVariable

# add CollectionTime to existing array
$DataVariable = Add-CollectionTimeToAllEntriesInArray -Data $DataVariable -Verbose:$Verbose
$DataVariable

#-------------------------------------------------------------------------------------------
# Output
#-------------------------------------------------------------------------------------------

VERBOSE:   Adding CollectionTime to all entries in array .... please wait !
Caption                                 : Intel64 Family 6 Model 165 Stepping 5
Description                             : Intel64 Family 6 Model 165 Stepping 5
InstallDate                             : 
Name                                    : Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz
Status                                  : OK
Availability                            : 3
ConfigManagerErrorCode                  : 
ConfigManagerUserConfig                 : 
CreationClassName                       : Win32_Processor
DeviceID                                : CPU0
ErrorCleared                            : 
ErrorDescription                        : 
LastErrorCode                           : 
PNPDeviceID                             : 
PowerManagementCapabilities             : 
PowerManagementSupported                : False
StatusInfo                              : 3
SystemCreationClassName                 : Win32_ComputerSystem
SystemName                              : STRV-MOK-DT-02
AddressWidth                            : 64
CurrentClockSpeed                       : 2904
DataWidth                               : 64
Family                                  : 198
LoadPercentage                          : 1
MaxClockSpeed                           : 2904
OtherFamilyDescription                  : 
Role                                    : CPU
Stepping                                : 
UniqueId                                : 
UpgradeMethod                           : 1
Architecture                            : 9
AssetTag                                : To Be Filled By O.E.M.
Characteristics                         : 252
CpuStatus                               : 1
CurrentVoltage                          : 8
ExtClock                                : 100
L2CacheSize                             : 2048
L2CacheSpeed                            : 
L3CacheSize                             : 16384
L3CacheSpeed                            : 0
Level                                   : 6
Manufacturer                            : GenuineIntel
NumberOfCores                           : 8
NumberOfEnabledCore                     : 8
NumberOfLogicalProcessors               : 16
PartNumber                              : To Be Filled By O.E.M.
ProcessorId                             : BFEBFBFF000A0655
ProcessorType                           : 3
Revision                                : 
SecondLevelAddressTranslationExtensions : False
SerialNumber                            : To Be Filled By O.E.M.
SocketDesignation                       : U3E1
ThreadCount                             : 16
Version                                 : 
VirtualizationFirmwareEnabled           : False
VMMonitorModeExtensions                 : False
VoltageCaps                             : 
PSComputerName                          : 
CollectionTime                          : 12-03-2023 16:08:33




RELATED LINKS https://github.com/KnudsenMorten/AzLogDcrIngestPS

root@kitploit:~
<br>

# Custo - Quanto custa armazenar esses dados?
Dados de **500** clientes fazendo inventário **diário** do ClientInspector custarão aproximadamente **DKK 200 por mês / USD 27 por mês**

<br>

# Bugs e descobertas, por favor, informe-me
Hoje, o ClientInspectorV1 é usado em milhares de computadores (e o ServerInspectorV1 em milhares de servidores)

Como o ClientInspectorV2 é uma reconstrução completa do V1, sendo lançado agora com, por exemplo, nova convenção de nomenclatura, não posso prometer que bugs não serão encontrados.
Mas **posso prometer a você** que irei corrigi-los tão rápido quanto meu tempo livre permitir. Por favor, envie-me um e-mail para [email protected] com suas descobertas.

Considere bifurcar o site do Github - ou fique atento a atualizações nos dashboards/workbooks ou no script do ClientInspector.

Além disso, o ClientInspector foi projetado para cobrir diferentes designs e plataformas, mas você pode ter configurações únicas que não são cobertas pelas coleções ou dashboards.
Mas a abordagem aberta permite que você ajuste tanto os dashboards, workbooks quanto o script do ClientInspector, para que funcione 100% para você. Considere-o uma demonstração para fazer mais com as tecnologias de log do Azure - não é um produto pago com suporte 24x7. É gratuito para todos!

<br>

# Contato
Se você tiver comentários sobre a solução - ou apenas quiser se conectar comigo, entre em contato através destes canais - adoraria conectar:

[Github](https://github.com/KnudsenMorten)

[Twitter](https://twitter.com/knudsenmortendk)

[Blog](https://mortenknudsen.net/)

[LinkedIn](https://www.linkedin.com/in/mortenwaltorpknudsen/)

[Perfil do Microsoft MVP](https://mvp.microsoft.com/en-us/PublicProfile/5005156?fullName=Morten%20Knudsen)

[Sessionize](https://sessionize.com/mortenknudsen/)

[E-mail](mailto:[email protected])

<br>

# Grande agradecimento às grandes pessoas nas equipes de produto da Microsoft - vocês são estrelas do rock :smile:
Por último, gostaria de dar grandes créditos a algumas pessoas com quem trabalhei na construção do módulo AzLogDcrIngestPS do PowerShell e no meu trabalho diário com as capacidades de log e visualização do Azure:

|Nome|Função|
|:---|:---|
|Ivan Varnitski|Gerente de Programa - Azure Pipeline|
|Evgeny Ternovsky|Gerente de Programa - Azure Pipeline|
|Nick Kiest|Gerente de Programa - Regras de Coleta de Dados do Azure|
|Oren Salzberg|Gerente de Programa - Azure LogAnalytics|
|Guy Wild|Redator Técnico - Azure LogAnalytics|
|John Gardner|Gerente de Programa - Azure Workbooks|
|Shikha Jain|Gerente de Programa - Azure Workbooks|
|Shayoni Seth|Gerente de Programa - Azure Monitor Agent|
|Jeff Wolford|Gerente de Programa - Azure Monitor Agent|
|Xema Pathak|Gerente de Programa - Azure VMInsight (integração ao Azure Monitor Agent)|

![MS-friends](https://assets.kitploit.com/production/public/readmes/6097/654c3844cb0324e2b53e04ebfd758652372ae0820636c3c37adc3f18ab178e8e.jpg)