In questo snippet vediamo come sia possibile, mediante Windows PowerShell e WMI, effettuare lo shutdown di un sistema operativo, sia nel caso questo comporti l'arresto o il riavvio della macchina, sia nel caso si tratti di una semplice disconessione dell'utente corrente.
Le tre operazioni indicate sono accessibili utilizzando alcuni dei metodi della classe WMI Win32_OperatingSystem, classe che ha la funzionalità di rappresentare il sistema operativo installato in un computer.
Lanciando questo script:
Get-WmiObject Win32_OperatingSystem |
Get-Member -MemberType Method
Possiamo dare una sbirciatina ai metodi esposti da questa classe, notandone un paio il cui nome svela le finalità: Reboot() e Shutdown().
Un semplice riavvio della macchina locale, ad esempio, è facile come eseguire questo script (attenzione!):
(Get-WmiObject Win32_OperatingSystem).Reboot()
Analogamente, spegnere la macchina Server01 richiederà uno script del genere:
(Get-WmiObject Win32_OperatingSystem -ComputerName Server01).Shutdown()
La classe Win32_OperatingSystem, però, espone un altro metodo più completo ed interessante: Win32Shutdown(). Sulle orme della funzionalità di basso livello, esposta dall'API ExitWindowsEx, infatti, questo metodo consente non solo di effettuare anche il log off dell'utente corrente ma anche di specificare se forzare l'operazione richiesta, evitando, quindi, l'attesa della chiusura dei processi in esecuzione.
Invocare il metodo Win32Shutdown() di Win32_OperatingSystem richiede di specificare un valore, determinato dalla combinazione bit a bit tra l'operazione desiderata e l'eventuale bit che determina la forzatura dell'operazione.
Vediamo i possibili valori utilizzabili:
| Operazioni |
| Log off | 0 |
| Arresto del sistema | 1 |
| Riavvio | 2 |
| Arresto con spegnimento | 8 |
| Opzioni |
| Forzatura | 4 |
Nel caso in cui sia necessario riavviare forzatamente la macchina
Server01, quindi, andremmo ad utilizzare uno script simile a questo:
# $flags => riavvio e forzatura => 2 + 4
$flags = 2 -bor 4
(Get-WmiObject Win32_OperatingSystem -ComputerName Server01).Win32Shutdown($flags, 0)
Il secondo parametro passato a Win32Shutdown(), nel caso ve lo steste chiedendo, è un valore riservato per utilizzi futuri ed è attualmente ignorato.