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.
