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

Conteúdo

Logotipo de Powershell

Muitos administradores de servidor usam PowerShell. Claro, uma das tarefas mais usadas é a capacidade de criar scripts e funções para inventariar seus servidores e entender o que seu ambiente tem.

Mesmo que existam muitas alternativas para conseguir isso, com diferentes níveis de complexidade, vamos criar um Relatório de Inventário do Windows Server bastante simples, mas eficaz nesta postagem.

Pré-requisitos

Esta postagem será prática. Se você pretende seguir em frente, primeiro certifique-se de atender aos seguintes pré-requisitos:

  • Trabalhe em um PC com Windows 10 ingressou em um domínio do Active Directory (DE ANÚNCIOS)
  • Ter o módulo ActiveDirectory PowerShell instalado a partir do RSAT Toolkit.
  • Ter permissão para visualizar contas de computador AD
  • Pode executar consultas WMI / CIMs remotos em computadores remotos
  • eu tenho Remoto PowerShell disponível em computadores remotos

Recuperando servidores

Fundamentais para o script que estamos construindo são os próprios servidores. Você pode gravá-los individualmente em um arquivo de texto que é lido, ou em uma matriz dentro do próprio script, mas com o PowerShell podemos fazer 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 (DE ANÚNCIOS) para extrair a lista de objetos de computador em uma unidade organizacional (ONDE) determinado.

A seguir, estamos usando o ActiveDirectory módulo, disponível no RSAT Toolkit, consultar o Servers OU e recupere todos os objetos de computador lá via Get-ADComputer.

Import-Module ActiveDirectory

$OU = 'OU=Servers,DC=domain,DC=local'

$Params = @{
    "SearchBase" = $OU
    "Filter"     = '*'
}

$Servers = Get-ADComputer @Params

Neste ponto, poderíamos ter apenas filtrado a propriedade name para completar o $servers variável, mas geralmente é muito útil ter todo o objeto retornado para uso posterior.

Determinação dos dados a serem coletados

Agora que temos nossos servidores, precisamos descobrir o que exatamente devemos coletar de cada servidor. Uma razão pela qual pode ser importante manter todo o objeto AD é combinar esses dados com os dados diretamente do servidor para obter uma imagem maior de seu ambiente.

Na prática, Como é que algo assim parece? Vamos listar algumas das propriedades que seria muito útil saber.

Configurações do servidor

  • Nome do host do servidor
  • Espaço livre em disco
  • Memória
  • Conexões de rede

Os valores de AD

  • Última configuração de senha
  • Último Login
  • Nome de host DNS

Recuperando informações do servidor

Como vamos coletar essas informações em nossa lista de servidores devolvidos?? Já que temos uma lista de servidores, teremos que iterar sobre isso $Servers objeto e consulta. Começando com um simples Foreach-Object laço abaixo, podemos criar um objeto personalizado para manter nossos valores.

$Servers | 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 todo o objeto do Active Directory quando recuperamos os computadores pela primeira vez, nos permite completar uma ampla gama de informações. Infelizmente, esta não é toda a informação de que precisamos.

Para obter as informações de cada servidor, vamos usar uma interface familiar para muitos administradores de servidor, O que é a interface do Windows Administration Instrumentation? (WMI). Você pode ver que os cmdlets usados ​​abaixo são da interface do Modelo de Informação Comum (CIM), do qual WMI é a implementação da Microsoft deste padrão.

Obtenha espaço livre em disco

Usando a classe WMI disponível em Win32_LogicalDisk, podemos obter todos os discos disponíveis e seu espaço livre. Quando executamos o comando pela primeira vez, Get-CimInstance -ClassName Win32_LogicalDisk, você pode notar que não é exatamente legível em sua saída padrão.

O segundo problema aqui é que temos mais de uma unidade devolvida. Eu gostaria de saber sobre cada uma dessas unidades e quanto espaço livre está disponível em GB. Vamos modificar o código para fazer algumas transformações e melhorá-lo.

$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 um pouco para determinar 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 está abaixo do 10% o 10 GB. O motivo do -or A condição é que em discos muito grandes, a 10% ainda pode ser muito generoso, então determinar 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) -Or $FreeSpace -LT 10 ) {
    $LowDiskSpace = $True
  } Else {
    $LowDiskSpace = $False
  }

    [PSCustomObject]@{
        "Drive"        = $_.DeviceID
    "FreeSpace"    = $FreeSpace
    "LowDiskSpace" = $LowDiskSpace
    }
}

$DisksResult

Como você pode ver agora, temos um grande conjunto de informações para armazenar em nossos servidores.

Como% 20to% 20Build% 20a% 20Windows% 20Server% 20Inventory% 20Report% 20for / % 202.png sem título? Trim = 1,1 & bg-color = 000 & pad = 1,1

Obtenha memória disponível

É útil saber quanta RAM está alocada para cada servidor, especialmente em um ambiente de máquina virtual. Se você achar que alguns estão superprovisionados, você pode economizar recursos valiosos ajustando o tamanho correto dos servidores. Por sorte, isso é muito mais fácil de recuperar.

Usando o Win32_PhysicalMemory Classe WMI, podemos adicionar todos os retornados Capacity propriedades para obter memória total.

(Get-CimInstance -ClassName Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB

Obtenha todas as conexões de rede

Em conclusão, 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 Get-NetAdapter cmdlet, mas como este não tem um ComputerName , usaremos PS Remoting para invocá-lo localmente no servidor de destino e retornar os resultados para o nosso script.

$NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock  Select-Object Name, Status, LinkSpeed

Nossa saída será semelhante à abaixo e então podemos salvá-la em nosso script.

Por favor, note que para Invoke-Command Para fazer funcionar, será necessário configurar o PS Remoting nos servidores de destino.

Juntando tudo

Agora que temos todas as peças, vamos colocar tudo isso junto. O script final está abaixo e combina todo o código para criar um objeto de saída personalizado com o que queremos relatar.

Import-Module ActiveDirectory

$OU = 'OU=Servers,DC=domain,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  Select-Object Name, Status, LinkSpeed
  

    [PSCustomObject]@ Measure-Object -Property Capacity -Sum).Sum / 1GB)
        "NetworkConnections" = $NetworkConnections
        "PasswordLastSet"    = $_.pwdLastSet
        "LastLogon"          = $_.lastLogon
        "DNSHostName"        = $_.DNSHostName
        "CreationDate"       = $_.WhenCreated
    
}

conclusão

O que mostramos 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 construí-lo em uma página HTML, agende uma tarefa para ser executada semanalmente ou até mesmo incorpore-a em outras ferramentas como o Ansible.

O PowerShell torna muito 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 no futuro.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.