Como criar um relatório de inventário do Windows Server gratuitamente com o PowerShell

O PowerShell é usado por muitos administradores de servidor. Naturalmente, uma das tarefas mais usadas é a capacidade de criar scripts e funções para inventariar seus servidores e entender o que seu ambiente tem.
Embora haja muitas maneiras de fazer isso, com vários níveis de complexidade, vamos construir um Relatório de Inventário do Windows Server bastante simples, mas eficaz, neste artigo.
Pré-requisitos
Este artigo será prático. Se você pretende acompanhar, certifique-se de ter os seguintes pré-requisitos em vigor primeiro:
- Trabalho em um PC com Windows 10 associado ao domínio do Active Directory (AD)
- Instale o módulo ActiveDirectory PowerShell do kit de ferramentas RSAT.
- Ter permissão para consultar contas de computador AD
- Pode executar consultas WMI / CIM remotas em computadores remotos
- Ter PowerShell Remoting disponível em computadores remotos
Recuperando servidores
A base do script que estamos construindo são os próprios servidores. Você pode escrevê-los individualmente em um arquivo de texto que é lido ou em uma matriz dentro do próprio script, mas usando o PowerShell podemos fazer um melhor. Para tornar o script mais dinâmico e não exigir que o modifiquemos sempre que um novo servidor for adicionado, podemos usar o Active Directory (AD) para obter a lista de objetos de computador em uma determinada unidade organizacional (UO).
Abaixo, estamos utilizando o módulo ActiveDirectory, disponível no kit de ferramentas RSAT, para consultar a UO de servidores e recuperar todos os objetos de computador lá por meio de Get-ADComputer.
Import-Module ActiveDirectory $ OU = 'OU = Servidores, DC = domínio, DC = local' $ Params = @ {"SearchBase" = $ OU "Filter" = '*'} $ Servers = Get- ADComputer @Params Publicidade
Neste ponto, poderíamos ter filtrado apenas a propriedade name para preencher a variável $ servers, mas geralmente é muito útil ter todo o objeto retornado para utilizar mais tarde.
Determinando os dados a serem coletados
Agora que temos nossos servidores, precisamos descobrir o que exatamente devemos coletar de cada servidor. Um motivo pelo qual pode ser importante manter o objeto AD completo é combinar esses dados com os dados diretos do próprio servidor para obter uma visão mais ampla do seu ambiente.
Na prática, como se parece algo assim? Vamos listar algumas das propriedades que seriam muito úteis saber.
Valores do servidor
- Nome do host do servidor
- Espaço livre em disco
- Memória
- Conexões de rede
Valores do AD
- Último conjunto de senha
- Último logon
- Nome do host DNS
Recuperando informações do servidor
Como coletamos essas informações em nossa lista de servidores devolvidos? Como temos uma lista de servidores, teremos que iterar sobre o objeto $ Servers e a consulta. Começando com um loop Foreach-Object simples abaixo, podemos criar um objeto personalizado para conter nossos valores.
$ Servidores | Foreach-Object {[PSCustomObject] @ {"ServerHostName" = $ _. Name "Description" = $ _. Description "FreeDiskSpace" = $ Null "TotalMemory" = $ Null "NetworkConnections" = $ Null "PasswordLastSet" = $ _. pwdLastSet "LastLogon" = $ _. lastLogon "DNSHostName" = $ _. DNSHostName "CreationDate" = $ _. WhenCreated}} Como você pode ver, ao salvar o objeto completo do Active Directory quando recuperamos os computadores pela primeira vez, podemos preencher uma ampla gama de informações. Infelizmente, essas não são todas as informações de que precisamos.
Para obter as informações de cada servidor, utilizaremos uma interface familiar para muitos administradores de servidor, que é a interface do Windows Management Instrumentation (WMI). Você pode notar que os cmdlets usados abaixo são da interface Common Information Model (CIM), da qual o WMI é a implementação desse padrão pela Microsoft.
Obtenha o espaço livre em disco
Usando a classe WMI disponível de Win32_LogicalDisk, podemos obter todos os discos disponíveis e seu espaço livre. Quando executamos pela primeira vez o comando Get-CimInstance -ClassName Win32_LogicalDisk, você pode notar que ele não é exatamente legível em sua saída padrão.

Publicidade
O segundo problema aqui é que temos mais de uma unidade sendo devolvida. Eu gostaria de saber sobre cada uma dessas unidades e quanto espaço livre está disponível em GBs. Vamos modificar o código para fazer algumas transformações e torná-lo melhor.
$ Disks = Get-CimInstance -ClassName Win32_LogicalDisk $ DisksResult = $ Disks | Foreach-Object {[PSCustomObject] @ {"Drive" = $ _. DeviceID "FreeSpace" = [Math] :: Round (($ _. FreeSpace / 1GB), 2)}} $ DisksResult Depois de executar os comandos, nossa saída é muito mais limpa e agora pode ser usada em nosso script.

Mas e se quiséssemos alertar sobre uma condição de pouco espaço em disco? Seria bom expandir isso apenas ligeiramente para definir um sinalizador em cada unidade que atenda a essa condição. Comparando o espaço livre com o espaço total disponível, podemos ver se é inferior a 10% ou 10 GB. A razão para a condição -or é que em discos muito grandes, 10% ainda pode ser muito generoso, portanto, definir um limite absoluto ajuda.
$ Disks = Get-CimInstance -ClassName Win32_LogicalDisk $ DisksResult = $ Disks | Foreach-Object {$ FreeSpace = [Math] :: Round (($ _. FreeSpace / 1GB), 2) $ TotalSpace = [Math] :: Round (($ _. Size / 1GB), 2) If (($ FreeSpace / $ TotalSpace -LT 0.10) -Ou $ FreeSpace -LT 10) {$ LowDiskSpace = $ True} Outra coisa {$ LowDiskSpace = $ False} [PSCustomObject] @ {"Drive" = $ _. DeviceID "FreeSpace" = $ FreeSpace "LowDiskSpace" = $ LowDiskSpace}} $ DisksResult Como você pode ver agora, temos um grande conjunto de informações a serem salvas com nossos servidores.
How% 20to% 20Build% 20a% 20Windows% 20Server% 20Inventory% 20Report% 20for / Untitled% 202. png? trim = 1,1 & bg -color = 000 & pad = 1,1
Obtenha a memória disponível
É útil saber a quantidade de RAM alocada para cada servidor, especialmente em um ambiente de máquina virtual. Se você descobrir que alguns estão superprovisionados, poderá economizar recursos valiosos dimensionando corretamente os servidores. Felizmente, isso é muito mais simples de recuperar.
Publicidade
Usando a classe Win32_PhysicalMemory WMI, podemos somar todas as propriedades de Capacidade retornadas para obter a memória total.
(Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum) . Sum / 1GB
Obtenha todas as conexões de rede
Finalmente, queremos recuperar todas as conexões de rede juntas. Isso é útil para saber se um determinado servidor tem várias interfaces para se preocupar. Usando um mecanismo ligeiramente diferente desta vez, estamos usando o cmdlet Get-NetAdapter, mas como este não tem um parâmetro ComputerName, usaremos PS Remoting para invocar isso localmente no servidor de destino e retornar os resultados para nosso script.
$ NetworkConnections = Invoke-Command -ComputerName $ _. DnsHostName -ScriptBlock {Get-NetAdapter -Physical | Selecione-Nome do objeto, Status, LinkSpeed}
Nossa saída será semelhante à abaixo e podemos salvá-la em nosso script.

Lembre-se de que para que o Invoke-Command funcione, o PS Remoting precisará ser configurado nos servidores de destino.
Juntando tudo
Agora que temos todas as peças, vamos juntar tudo. O script final está abaixo e combina todo o código para criar um objeto de saída personalizado apenas com o que queremos relatar.
Import-Module ActiveDirectory $ OU = 'OU = Servidores, DC = domínio, DC = local' $ Params = @ {"SearchBase" = $ OU "Filter" = '*'} $ Servers = Get- ADComputer @Params $ Servers | Foreach-Object {$ Disks = Get-CimInstance -ComputerName $ _. DnsHostName -ClassName Win32_LogicalDisk $ DisksResult = $ Disks | Foreach-Object {[PSCustomObject] @ {"Drive" = $ _. DeviceID "FreeSpace" = [Math] :: Round (($ _. FreeSpace / 1GB), 2)}} $ NetworkConnections = Invoke-Command -ComputerName $ _. DnsHostName -ScriptBlock {Get-NetAdapter -Physical | Select-Object Name, Status, LinkSpeed} [PSCustomObject] @ {"ServerHostName" = $ _. Name "Description" = $ _. Description "FreeDiskSpace" = $ DisksResult "TotalMemory" = ((Get-CimInstance -ComputerName $ _. DnsHostName -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum) . Sum / 1GB) "NetworkConnections" = $ NetworkConnections "PasswordLastSet" = $ _. PwdLastSet "LastLogon" = $ _. LastLogon "DNSHostName" = $ _. DNSHostName "= $ _. CreationDate "= $ _. WhenCreated}}
Conclusão
O que demonstramos aqui é apenas a ponta do iceberg em termos do que pode ser construído para um relatório de inventário. Existem muitas outras propriedades úteis que você pode adicionar a este relatório. Levando isso adiante, você pode construir isso em uma página HTML, agendar uma tarefa para executar semanalmente ou até mesmo envolvê-lo em outras ferramentas, como Ansible.
Publicidade
O PowerShell torna trivialmente fácil obter todas as informações de que você precisa para reunir em um só lugar. Depois de analisar seu ambiente e determinar o que você precisa saber, crie o relatório no PowerShell para ajudá-lo a preparar sua capacidade de auditar seu ambiente para o futuro.
Nenhum comentário