Un cliente mi ha chiesto di spegnere ogni sera, ad orari programmati, i PC del suo dominio
e così ho pensato di creare uno script Powershell che leggesse il nome del computer e l’orario da un file CSV editabile dal cliente con Excel.
Ecco come ho fatto:
Create col Blocco note un file Lista_PC_da_spegnere.csv così formattato (nome computer; ora spegnimento senza minuti):
PC;ORA-SPEGNIMENTO PC01;18 PC02;18 PC03;20 PC04;22
Se ora provate ad aprire il file con Excel otterrete:
Ricordate di salvare sempre in formato CSV quando richiesto!
Ora create il file “Spegni_PC.ps1”
Write-Host "Controllo PC accesi" $PC_accesi = Import-CSV -delimiter ';' 'C:\ServerFolders\Lista_PC_da_spegnere.csv' | Where { Test-Connection $_.PC -count 1 -quiet } $PC_accesi | ft -AutoSize $IntestazioneSpegnimento=0 $PC_accesi | foreach { $PC = New-Object Object $PC | Add-Member Noteproperty Nome -value $_.PC $LAN=gwmi -ComputerName $PC.Nome -Class Win32_NetworkAdapterConfiguration | Where-Object {$_.DefaultIPGateway} $PC | Add-Member Noteproperty MAC -value $LAN.MacAddress $PC | Add-Member Noteproperty Gateway -value $LAN.DefaultIPGateway $PC | Add-Member Noteproperty DNS -value $LAN.DNSServerSearchOrder $PC | Add-Member Noteproperty IP -value ($LAN.ipaddress | Where-Object {($_).SubString(0,5) -eq ($LAN.DefaultIPgateway).SubString(0,5)}) $OraOFF=$_.'ora-spegnimento' New-EventLog "Spegnimento remoto PC" -Source "Verifica stato" -ErrorAction SilentlyContinue $paramsEventoAcceso = @{ LogName = 'Spegnimento remoto PC' Source = 'Verifica stato' EntryType = 'Information' EventId = 1001 Message = 'Il PC '+$PC.Nome+' è acceso. Spegnimento previsto per le '+$OraOFF+":00." } Write-EventLog @paramsEventoAcceso if ((get-date).hour -eq $OraOFF) { $IntestazioneSpegnimento++ if ($IntestazioneSpegnimento=1) { Write-Host "ESECUZIONE SPEGNIMENTO PC" Write-Host "-------------------------" } Write-Host -ea silentlycontinue ('Spengo '+$PC.Nome) New-EventLog "Spegnimento remoto PC" -Source "Spegnimento computer" -ErrorAction SilentlyContinue $paramsEventoSpengo = @{ LogName = 'Spegnimento remoto PC' Source = 'Spegnimento computer' EntryType = 'Warning' EventId = 1000 Message = 'Lancio spegnimento PC.'+($PC|Out-String) } Write-EventLog @paramsEventoSpengo Stop-Computer -ErrorAction SilentlyContinue -ComputerName $_.PC -Force } }
Poi create una Operazione pianificata da eseguire ogni mezz’ora con i seguenti parametri:
Programma o script C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe e come parametro -file “C:\ServerFolders\Spegni_PC.ps1”.



Basterà quindi editare il file con Excel per stabilire nome del PC ed orario di spegnimento.