Come creare gratuitamente un report di inventario di Windows Server con PowerShell

Contenuti

Logo Powershell

Molti amministratori di server utilizzano PowerShell. Naturalmente, una delle attività più utilizzate è la capacità di creare script e funzioni per inventariare i tuoi server e capire cosa ha il tuo ambiente.

Anche se ci sono molte alternative per raggiungere questo obiettivo, con diversi livelli di complessità, creeremo un rapporto sull'inventario di Windows Server abbastanza semplice ma efficace in questo post.

Prerequisiti

Questo post sarà pratico. Se hai intenzione di andare avanti, prima assicurati di soddisfare i seguenti prerequisiti:

  • Lavora su un PC Windows 10 unito a un dominio Active Directory (ANNO DOMINI)
  • Avere il modulo ActiveDirectory PowerShell installato dal Toolkit RSAT.
  • Avere l'autorizzazione per visualizzare gli account del computer AD
  • Può eseguire query WMI / CIM remoti su computer remoti
  • Io ho Comunicazione remota PowerShell disponibile su computer remoti

Ripristino dei server

Fondamentali per lo script che stiamo costruendo sono i server stessi. Puoi scriverli singolarmente in un file di testo che viene letto, o in un array all'interno dello script stesso, ma con PowerShell possiamo fare di meglio. Per rendere lo script più dinamico e non richiederci di modificarlo ogni volta che viene aggiunto un nuovo server, possiamo usare Active Directory (ANNO DOMINI) per estrarre l'elenco degli oggetti computer in un'unità organizzativa (DOVE) determinato.

Prossimo, stiamo usando il ActiveDirectory modulo, disponibile in Toolkit RSAT, consultare il Servers OU e recuperare tutti gli oggetti del computer lì tramite Get-ADComputer.

Import-Module ActiveDirectory

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

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

$Servers = Get-ADComputer @Params

A questo punto, avremmo potuto semplicemente filtrare la proprietà name per completare il $servers variabile, ma spesso è molto utile che l'intero oggetto venga restituito per un uso successivo.

Determinazione dei dati da raccogliere

Ora che abbiamo i nostri server, dobbiamo capire cosa esattamente dovremmo raccogliere da ciascun server. Una ragione per cui potrebbe essere importante mantenere l'intero oggetto AD è combinare quei dati con i dati direttamente dal server per ottenere un'immagine più ampia del tuo ambiente.

In pratica, Che aspetto ha qualcosa del genere?? Elenchiamo alcune delle proprietà che sarebbe molto utile conoscere.

Impostazioni del server

  • Nome host del server
  • Spazio libero su disco
  • Memoria
  • Le connessioni di rete

I valori di AD

  • Ultima impostazione della password
  • Ultimo accesso
  • Nome host DNS

Recupero di informazioni dal server

Come possiamo raccogliere queste informazioni sul nostro elenco di server restituiti?? Dal momento che abbiamo un elenco di server, dovremo iterarci sopra $Servers oggetto e interrogazione. Iniziando con un semplice Foreach-Object loop sotto, possiamo creare un oggetto personalizzato per mantenere i nostri valori.

$Servers | Foreach-Object {
    [PSCustomObject]@{
        "ServerHostName"     = $_.Name
        "Description"        = $_.Description
        "FreeDiskSpace"      = $Null
        "TotalMemory"        = $Null
        "NetworkConnections" = $Null
        "PasswordLastSet"    = $_.pwdLastSet
        "LastLogon"          = $_.lastLogon
        "DNSHostName"        = $_.DNSHostName
        "CreationDate"       = $_.WhenCreated
    }
}

Come potete vedere, quando si salva l'intero oggetto di Active Directory quando abbiamo ripristinato per la prima volta i computer, ci permette di completare una vasta gamma di informazioni. Sfortunatamente, queste non sono tutte le informazioni di cui abbiamo bisogno.

Per ottenere le informazioni di ciascun server, useremo un'interfaccia familiare a molti amministratori di server, Che cos'è l'interfaccia di Strumentazione amministrazione Windows? (WMI). Puoi vedere che i cmdlet utilizzati di seguito provengono dall'interfaccia Common Information Model (CIM), di cui WMI è l'implementazione di questo standard da parte di Microsoft.

Ottieni spazio libero su disco

Utilizzo della classe WMI disponibile da Win32_LogicalDisk, possiamo ottenere tutti i dischi disponibili e il loro spazio libero. Quando eseguiamo il comando per la prima volta, Get-CimInstance -ClassName Win32_LogicalDisk, potresti notare che non è esattamente leggibile nel suo output predefinito.

Il secondo problema qui è che abbiamo restituito più di un'unità. Vorrei conoscere ciascuna di queste unità e quanto spazio libero è disponibile in GB. Modifichiamo il codice per fare alcune trasformazioni e migliorarlo.

$Disks = Get-CimInstance -ClassName Win32_LogicalDisk

$DisksResult = $Disks | Foreach-Object {
    [PSCustomObject]@{
        "Drive"     = $_.DeviceID
        "FreeSpace" = [Math]::Round(($_.FreeSpace / 1GB),2)
    }
}

$DisksResult

Dopo aver eseguito i comandi, il nostro output è molto più pulito e ora può essere utilizzato nel nostro script.

Ma, E se volessimo avvisare di una condizione di spazio su disco insufficiente?? Sarebbe bello espandere questo solo un po' per determinare una bandiera in ogni unità che soddisfa tale condizione. Confrontando lo spazio libero con lo spazio disponibile totale, possiamo vedere se è sotto il 10% oh 10 GB. Il motivo per -or La condizione è che su dischi molto grandi, il 10% può essere ancora molto generoso, quindi determinare un limite assoluto aiuta.

$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

Come puoi vedere ora, abbiamo una vasta serie di informazioni da archiviare sui nostri server.

How% 20to% 20Build% 20a% 20Windows% 20Server% 20Inventory% 20Report% 20for / Senza titolo% 202.png? Taglia = 1,1 & bg-colore = 000 & pad = 1,1

Ottieni memoria disponibile

È utile sapere quanta RAM è allocata a ciascun server, soprattutto in un ambiente di macchina virtuale. Se trovi che alcuni hanno un provisioning eccessivo, puoi risparmiare risorse preziose regolando la dimensione corretta dei server. fortunatamente, questo è molto più facile da recuperare.

Usando il Win32_PhysicalMemory Classe WMI, possiamo aggiungere tutti i restituiti Capacity proprietà per ottenere la memoria totale.

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

Ottieni tutte le connessioni di rete

In conclusione, vogliamo recuperare tutte le connessioni di rete insieme. Questo è utile per sapere se un determinato server ha più interfacce di cui preoccuparsi. Usando un meccanismo leggermente diverso questa volta, stiamo usando il Get-NetAdapter cmdlet, ma dal momento che questo non ha un ComputerName , useremo PS Remoting per invocarlo localmente sul server di destinazione e restituire i risultati al nostro script.

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

Il nostro output sarà simile a quello qui sotto e quindi possiamo salvarlo nel nostro script.

Si prega di notare che per Invoke-Command Per farlo funzionare, sarà necessario configurare PS Remoting sui server di destinazione.

Mettere tutto insieme

Ora che abbiamo tutti i pezzi, mettiamo insieme tutto questo. Lo script finale è di seguito e combina tutto il codice per creare un oggetto di output personalizzato con ciò che vogliamo segnalare.

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
    
}

conclusione

Quello che abbiamo mostrato qui è solo la punta dell'iceberg in termini di ciò che può essere costruito per un rapporto di inventario.. Ci sono molte altre proprietà utili che puoi aggiungere a questo rapporto. Prendendo questo ulteriormente, puoi costruirlo in una pagina HTML, pianificare un'attività da eseguire settimanalmente o persino incorporarla in altri strumenti come Ansible.

PowerShell rende banalmente facile ottenere tutte le informazioni necessarie per raccogliere in un unico posto. Una volta analizzato il tuo ambiente e determinato ciò che devi sapere, crea il report in PowerShell per aiutarti a preparare la tua capacità di controllare il tuo ambiente in futuro.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.