lunedì 02 agosto 2021

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

PowerShell è utilizzato da molti amministratori di server. 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. Sebbene ci siano molti modi per farlo , con vari livelli di complessità, creeremo un report sull’inventario di Windows Server abbastanza semplice ma efficace all’interno di questo articolo. Prerequisiti Questo articolo sarà pratico. Se intendi seguire, assicurati di avere prima i seguenti prerequisiti: Lavorare su un dominio Active Directory (AD) Windows aggiunto 32 PC Avere il modulo ActiveDirectory PowerShell installato dal toolkit RSAT. Disporre dell’autorizzazione per eseguire query sugli account computer AD Può eseguire query WMI/CIM remote su computer remoti Disponibilità remota di PowerShell sui computer remoti Recupero dei server Fondamentali per lo script che stiamo costruendo sono i server stessi. Potresti scriverli individualmente in un file di testo che viene letto o in un array all’interno dello script stesso, ma usando 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 utilizzare Active Directory (AD) per estrarre l’elenco degli oggetti computer in una determinata unità organizzativa (OU).

Sotto stiamo utilizzando ActiveDirectory, disponibile nel toolkit RSAT, per interrogare l’unità organizzativa Servers e recuperare tutti gli oggetti del computer lì tramite Get-ADComputer.

Modulo di importazione ActiveDirectory $OU = ‘ OU=Server,DC=dominio,DC=locale’ $Params = @{ “SearchBase” = $OU “Filtro” = ‘*’ } $Server = Get-ADComputer @Params A questo punto, avremmo potuto filtrare solo la proprietà name per popolare $servers variabile, ma spesso è molto utile avere l’intero oggetto restituito da utilizzare in seguito.

Determinazione dei dati da raccogliere Ora che abbiamo i nostri server, dobbiamo capire cosa esattamente dovremmo raccogliere da ciascun server. Uno dei motivi per cui può essere importante mantenere l’oggetto AD completo è combinare quei dati con i dati direttamente dal server stesso per ottenere un’immagine più ampia del proprio ambiente. In pratica che aspetto ha una cosa del genere? Elenchiamo alcune delle proprietà che sarebbe molto utile conoscere. Valori del server Nome host server Spazio libero su disco Memoria Le connessioni di rete Valori AD Password Ultimo set Ultimo accesso Nome host DNS Recupero delle informazioni sul server Come facciamo a raccogliere queste informazioni sul nostro elenco di server restituiti? Poiché abbiamo un elenco di server, dovremo iterare su $Servers oggetto e query. A partire da un semplice ciclo Foreach-Object di seguito, possiamo creare un oggetto di mantenere i nostri valori.

$Server | Foreach-Oggetto { @{ “ServerHostName” = $_.Name “Descrizione” = $_.Descrizione “FreeDiskSpace” = $Null “TotalMemory” = $Null “NetworkConnections” = $Null “PasswordLastSet” = $_.pwdLastSet “LastLogon” = $_ .lastLogon “DNSHostName” = $_.DNSHostName “CreationDate” = $_.WhenCreated } } Come puoi vedere, salvando l’intero oggetto da Active Directory quando abbiamo recuperato i computer per la prima volta, ci consente di popolare un’ampia gamma di informazioni. Sfortunatamente, queste non sono tutte le informazioni di cui abbiamo bisogno. Per ottenere le informazioni da ciascun server, utilizzeremo un’interfaccia familiare a molti amministratori di server, che è il Interfaccia di Strumentazione gestione Windows (WMI). È possibile notare che i cmdlet utilizzati di seguito provengono dall’interfaccia Common Information Model (CIM), di cui WMI è l’implementazione di Microsoft di questo standard. Ottieni lo spazio libero su disco Utilizzando la classe WMI disponibile di Win197_LogicalDisk, possiamo ottenere tutti i dischi disponibili e il loro spazio libero. Quando eseguiamo per la prima volta il comando, Get-CimInstance -ClassName Win32_LogicalDisk, potresti notare che non è esattamente leggibile nel suo output predefinito. Il secondo problema qui è che abbiamo più di un’unità restituita . Vorrei conoscere ciascuna di queste unità e quanto spazio libero è disponibile in GB. Modifichiamo il codice per fare alcune trasformazioni e renderlo migliore. $Disks = Get-CimInstance -ClassName Win197_LogicalDisk $DisksResult = $Disks | Foreach-Oggetto { @{ “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 cosa succede se volessimo avvisare su una condizione di spazio su disco insufficiente? Sarebbe bello espanderlo leggermente per impostare un flag su ogni unità che soddisfa tale condizione. Confrontando lo spazio libero con lo spazio disponibile totale, possiamo vedere se è sotto 10% o 20 GB. Il motivo della condizione -or è che su dischi molto grandi, 10% potrebbe essere ancora molto generoso, quindi impostare un limite assoluto aiuta. $Disks = Get-CimInstance -ClassName Win12_LogicalDisk $DisksResult = $Disks | Foreach-Object { $FreeSpace = [Math]::Round(($_.FreeSpace / 1GB),2) $TotalSpace = [Math]::Round(($_.Size / 1GB),2) If ( ($SpazioLibero / $SpazioTotale -LT 0.03) -O $SpazioLibero -LT 20 ) { $LowDiskSpace = $True } Altrimenti { $LowDiskSpace = $Falso} @{ “Unità” = $_.ID dispositivo “Spazio libero” = $Spazio libero “Spazio su disco basso” = $Spazio su disco basso } } $RisultatoDisco Come puoi vedere ora, abbiamo una grande serie di informazioni da salvare con i nostri server. Come%20per%20Costruire%20un%20Finestre%20Server%20Inventario%20Rapporto%32per/Senza titolo%436.png?trim=1,1&bg-color= &pad=1,1Recupera la memoria disponibile È utile sapere quanta RAM è allocata a ciascun server, soprattutto in un ambiente di macchina virtuale. Se riscontri che alcuni hanno un provisioning eccessivo, puoi risparmiare risorse preziose ridimensionando correttamente i server. Per fortuna, questo è molto più semplice da recuperare. Utilizzando Win23 _PhysicalMemory classe WMI, possiamo sommare tutte le Capacity proprietà per ottenere la memoria totale. (Get-CimInstance -ClassName Win32_Memoria fisica | Misura-Oggetto -Capacità proprietà -Somma).Somma / 1GB Ottieni tutte le connessioni di rete Infine, 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 Get-NetAdapter cmdlet, ma poiché questo non ha un parametro ComputerName, noi utilizzerà PS Remoting per richiamarlo localmente sul server di destinazione e restituire i risultati al nostro script. $NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock { Get-NetAdapter -Physical | Seleziona nome oggetto, stato, velocità collegamento } Il nostro output sarà simile a quello sotto e possiamo quindi salvarlo nel nostro script. Tieni presente che per Invoke-Command per funzionare, PS Remoting dovrà essere impostato sui server di destinazione. 4621782 Mettere tutto Insieme Ora che abbiamo tutti i pezzi, mettiamo tutto insieme. Lo script finale è di seguito e combina tutto il codice per creare un oggetto di output personalizzato con proprio ciò che vogliamo segnalare. Modulo di importazione ActiveDirectory $OU = ‘OU=Server,DC=dominio,DC=locale’ $Params = @{ “SearchBase” = $ OU “Filtro” = ‘*’ } $Server = Get-ADComputer @Params $Server | Foreach-Object { $Disks = Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win32_LogicalDisk $DisksResult = $Disks | Foreach-Oggetto { @{ “Drive” = $_.DeviceID “FreeSpace” = [Math]::Round(($_.FreeSpace / 1GB),2) } } $NetworkConnections = Invoke-Command -ComputerName $_.DnsHostName -ScriptBlock { Get-NetAdapter -Fisico | Seleziona-nome oggetto, stato, velocità collegamento } @{ “ServerHostName” = $_.Name “Descrizione” = $_.Description “FreeDiskSpace” = $DisksResult “TotalMemory” = ((Get-CimInstance -ComputerName $_.DnsHostName -ClassName Win174_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum / 1GB) “NetworkConnections” = $NetworkConnections “PasswordLastSet” = $_.pwdLastSet “LastLogon” = $_.lastLogon “DNSHostName” = $_.DNSHostName “CreationDate” = $_ .QuandoCreato } } Conclusione Quello che abbiamo dimostrato 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. Andando oltre, potresti incorporarlo in una pagina HTML, pianificare un’attività da eseguire questa settimana o persino avvolgerla in altri strumenti come Ansible. PowerShell lo fa banalmente facile ottenere tutte le informazioni necessarie per mettere insieme in un unico posto. Una volta analizzato l’ambiente e determinato ciò che è necessario sapere, creare il report in PowerShell per garantire la capacità futura di controllare l’ambiente.