Ai giorni d’oggi in cui è fondamentale l’automazione IT e la manutenzione proattiva dei sistemi, PowerShell è un ottimo alleato per creare potenti script che possono ridurre il tempo necessario per le attività di amministrazione. In questo breve articolo vedremo come poter estrarre la lista dei servizi Windows impostati con “avvio automatico” e riavviarli in caso fossero non in esecuzione. Tutti i comandi che sono riportati devono essere eseguiti da una PowerShell aperta con diritti amministrativi.
Iniziamo con il comando
PS C:\> Get-CimInstance Win32_Service -Filter "StartMode = 'Auto' AND State != 'Running'" | Format-Tableche permette di recuperare la lista dei servizi con avvio automatico -Filter “StartMode = ‘Auto’ ma che non sono avviati State != ‘Running’. Questo un esempio di output del comando, una tabella strutturata che elenca solo i servizi che soddisfano i criteri, permettendo all’amministratore di sistema di identificare immediatamente quali servizi automatici sono attualmente fermi.
ProcessId Name StartMode State Status ExitCode
--------- ---- --------- ----- ------ --------
0 edgeupdate Auto Stopped OK 0
0 GoogleUpdaterInternalService144.0.7547.0 Auto Stopped OK 0
0 GoogleUpdaterService144.0.7547.0 Auto Stopped OK 0
0 MapsBroker Auto Stopped OK 0
0 wuauserv Auto Stopped OK 0Vediamo ora come poter sfruttare questa lista per fare automaticamente un riavvio dei servizi. Il comando è strutturato come una pipeline, dove l’output di un cmdlet (comando) diventa l’input per il successivo, collegato dal carattere barra verticale ( | ).
Get-CimInstance Win32_Service | Where-Object {$_.StartMode -eq 'Auto' -and $_.State -ne "Running"} | ForEach-Object {
Write-Host "Tentativo di riavviare il servizio: $($_.Name)";
Restart-Service -Name $_.Name -ErrorAction SilentlyContinue;
}- Get-CimInstance Win32_Service recupera informazioni dettagliate (istanze CIM/WMI) su tutti i servizi installati sul sistema locale
- | Where-Object {$_.StartMode -eq ‘Auto’ -and $_.State -ne “Running”} seleziona solo gli oggetti che soddisfano condizioni specifiche
- | ForEach-Object { … } esegue un blocco di script specifico per ogni singolo oggetto che ha superato il filtro precedente visualizzando un messaggio descrittivo nella console con il nome del servizio e provando a fare il riavvio. Il parametro -ErrorAction SilentlyContinue impedisce che lo script si interrompa se un servizio non può essere riavviato (ad esempio, a causa di dipendenze o autorizzazioni insufficienti).
Per eseguire lo stesso comando su un server remoto, possiamo sfruttare le capacità di gestione remota di PowerShell. Il modo più semplice per eseguire un singolo comando o una pipeline su un computer remoto è utilizzare il cmdlet Invoke-Command. Questo cmdlet stabilisce una sessione temporanea, esegue il codice fornito e restituisce i risultati.
Invoke-Command -ComputerName NomeServerRemoto -ScriptBlock {
Get-CimInstance Win32_Service | Where-Object {$_.StartMode -eq 'Auto' -and $_.State -ne "Running"} | ForEach-Object {
Write-Host "Tentativo di riavviare il servizio: $($_.Name)";
Restart-Service -Name $_.Name -ErrorAction SilentlyContinue;
}
}Nota: Sostituisci NomeServerRemoto con il nome di rete effettivo o l’indirizzo IP del server di destinazione.
Se si prevede di eseguire più comandi in sequenza sullo stesso server remoto, è più efficiente creare una sessione persistente e utilizzarla per tutti i comandi. Riprendendo il comando precedente i passaggi sono:
Creo la sessione
$session = New-PSSession -ComputerName NomeServerRemotoEseguo il comando utilizzando la sessione creata
Invoke-Command -Session $session -ScriptBlock {
Get-CimInstance Win32_Service | Where-Object {$_.StartMode -eq 'Auto' -and $_.State -ne "Running"} | ForEach-Object {
Write-Host "Tentativo di riavviare il servizio: $($_.Name)";
Restart-Service -Name $_.Name -ErrorAction SilentlyContinue;
}
}Chiudo la sessione al termine (importante per liberare risorse)
Remove-PSSession -Session $sessionAffinché questi comandi per la gestione remota funzionino, devono essere soddisfatti alcuni prerequisiti:
- Credenziali amministrative: va eseguita la console PowerShell locale come amministratore
- WS-Management abilitato: il servizio Windows Remote Management (WinRM) deve essere in esecuzione sia sul computer locale che sul server remoto
- Configurazione remota: se la gestione remota non è mai stata configurata, potrebbe essere necessario eseguire Enable-PSRemoting -Force una volta sul server remoto
- Firewall: le regole del firewall devono consentire il traffico WinRM (porta HTTP 5985) tra i due computer
