Sei sulla pagina 1di 13

ESEMPI PowerShell

Creare la guida su file:


Get-Help * | Get-Help Detailed | Out-File C:\Powershell-Help.txt
oppure
Get-Help * | Get-Help Detailed > C:\PowerShell-Help.txt.
Bisogna avere le autorizzazioni di scrittura relative al percorso in questione (nellesempio: C:\ )

Elenco cmdlet
http://technet.microsoft.com/en-us/library/ee692945.aspx

Elenco alias
http://msdn.microsoft.com/en-us/library/windows/desktop/dd878329(v=vs.85).aspx

Lavorare con i processi


Generare la lista di tutti i processi ed ad ordinarla inversamente secondo la loro percentuale di
utilizzo del processore (propriet CPU)
(CPU non un parametro di Sort-Object ma un argomento che potete utilizzare per lordinamento.
Non ha, perci, il prefisso )

Get-Process | Sort-Object CPU

Generare una lista dei primi dieci processi, ordinati in base alla loro percentuale di utilizzo del
processore. Per fare ci, utilizzare il risultato ottenuto dallesercizio precedente e aggiungerci il
comando Select-Object. Ci sono due modi per raggiungere una soluzione ottimale, a seconda di
come la lista viene ordinata.

1) Get-Process | Sort-Object CPU Descending | Select-Object First 10

2) Get-Process | Sort-Object CPU | Select-Object Last 10

Assegna alla variabile $P la lista dellesercizio precedente. Visualizzare il contenuto della variabile
a video semplicemente digitando $P al prompt.

3) $P = Get-Process | Sort-Object CPU Descending | Select-Object First 10

Output in un file TXT, CSV o XML


Prendere la variabile $P dallesercizio 3) e memorizzare il contenuto in un file con nome
A4.txt. Poi salvare il contenuto di $P in un file CSV chiamato A4.CSV e, per finire, in

1
un file XML con nome A4.XML.
Il comando > sostituisce il pipe |, richiesto solo per gli autentici cmdlet come Out-File, Export-
CSV etc. (i file vengono salvati allutente corrente)

1) $P > .\A4.txt
2) $P | Export-CSV .\a4.csv
3) $P | Export-CLIXML .\a4.xml

Generare la lista di tutti i servizi ed ordinarla per stato (propriet Status). Consiglio:
utilizzare lo stesso metodo utilizzato per ordinare i processi per percentuale di
elaborazione ma utilizzare Get-Service e Status come argomenti per Sort-Object.

Get-Service | Sort-Object Status

Output in HTML
esempi per esplorare le varie opzioni rese disponibili dal cmdlet ConvertTo-HTML.

Convertire loutput prodotto da Get-Service in formato HTML. Utilizzare il cmdlet


ConvertTo-HTML, che pu lavorare direttamente con una lista di oggetti.
se la lista impiega troppo tempo ad essere generata annullate lelaborazione con CTRL+C.

Get-Service | ConvertTo-HTML

memorizzare loutput dellesercizio precedente in un file di nome .\A10.html


Suggerimento: Usare Invoke-Item .\a10.html per lanciare il browser web
predefinito ed aprire il file direttamente da PowerShell. Non dimenticare di indicare il
percorso corretto di A10.html

Get-Service | ConvertTo-HTML > .\a10.html

Generate una pagina web pi concisa e riportate solo il nome e lo stato di ciascun servizio.
Ordinare loutput per stato prima della conversione.
Suggerimento: la linea di comando utilizzer quattro comandi distinti:
lista di tutti i servizi, ordina per stato, conversione in HTML, memorizzazione su file.

Get-Service | Sort-Object Status | ConvertTo-HTML Name, Status > .\a11.htm

Lavorare con i file

Windows PowerShell considera tutti i file come fossero oggetti. La dimensione di un file pu essere
recuperata direttamente e non deve essere estrapolata da una stringa. Windows PowerShell, inoltre,
non lavora con il file system classico; utilizzando il cmdlet Get-PSDrive visualizzate tutti i
percorsi a cui Windows PowerShell consente di accedere direttamente. I drive sono individuabili
dal fatto che terminano con il carattere due punti (:).

I comandi dir, ls e Get-ChildItem hanno la stessa funzionalit.


2
Get-ItemProperty.
Questo comando consente di recuperare i valori delle chiavi di registro.

Creare un nuovo drive


Creare un nuovo drive con il comando:
New-PSDrive name FK psprovider FileSystem root c:\CartellaDiTest

Utilizzare poi cd FK: per passare a quella cartella e verificare di essere nella cartella giusta.
Rimuovere il drive appena creato utilizzando Remove-PSDrive FK e riprovare.

Passare al drive di test utilizzando cd FK: (utilizzando la sintassi PowerShell usare


Set-Location fk:).
Visualizzare il contenuto utilizzando Get-ChildItem.
Escludere tutti i file temporanei: Get-ChildItem * exclude *.tmp, *.temp

Visualizzare solo il nome del file e la dimensione, escludendo sempre i file temporanei
con estensione tmp o temp. Suggerimento: usate la tecnica impiegata per i processi e i
servizi.

Get-ChildItem * -Exclude *.tmp | Select-Object Name, Length

Digitare Get-Alias | Sort-Object Definition (una lista di possibili varianti riconosciute per i
Comandi).
Get-ChildItem * Exclude *.tmp | Select-Object Name, Length
Pu diventare:
ls * ex *.tmp | select n, le (molto piu sintetico)

Ordinate i file per dimensione (length), e per nome (name). Suggerimento: usate lo
stesso metodo impiegato per i processi negli esempi precedenti.

Get-ChildItem * -Exclude *.tmp | Select-Object Name, Length | Sort-Object Length, Name

Recuperare informazioni sugli oggetti usando Get-Member


Con Get-Member si ottiene una panoramica su tutte le propriet ed i metodi di un oggetto. Per
usare questa funzionalit passare a Get-Member un oggetto tramite pipe. Si puo fornire a Get-
Member una lista di oggetti simili.

Creare una lista di tutti i possibili attributi per un file utilizzando il cmdlet Get-Member.
Ordinare tutti i file per la data di ultimo accesso.
Get-ChildItem | Get-Member
Get-ChildItem | Get-Member | Sort-Object

3
Il cmdlet Group-Object

Il cmdlet Group-Object pu suddividere una lista di oggetti in gruppi.


Get-Service | Group-Object status genera perci una nuova lista contenente due (o pi) elementi.
utile anche il fatto che venga visualizzato il numero di servizi ed il loro stato corrispondente:
Get-Service | Group-Object status (genera una lista di 2 gruppi: running e stopped)

Raggruppare i file in base alla loro estensione.


Poi ordinare il risultato in base al numero di file per ciascuna estensione. Suggerimento: recuperate i
file, raggruppateli e poi ordinate la nuova lista in base al numero di elementi trovati (usare
largomento Count).
Get-ChildItem | Group-Object Extension | Sort-Object Count

Measure-Object
Esiste un altro utile cmdlet, al di l di Get-Member, per recuperare informazioni sugli oggetti:
Measure-Object.

Get-ChildItem | Measure-Object Length Average Sum Maximum -Minimum

Eliminate tutti i file TMP usando il cmdlet Remove-Item

Remove-Item .\*.tmp

4
Creare cartelle
New-Item. Questo cmdlet accetta il nome dellelemento come argomento ed il tipo come parametro,
come Directory per una cartella.

Create una nuova cartella di nome Test come segue:


New-Item .\test type Directory

Rimuove tutto senza conferma


PS Z:\> remove-item nomeFile/nomecartella -recurse (Senza recurse chiede la conferma)

Oggetti WMI
Windows Management Instrumentation (WMI) linfrastruttura per la gestione dei dati e delle operazioni sui sistemi operativi
basati su Windows. Il WMI uno strato software che gira come servizio allinterno del sistema operativo. Questo servizio
paragonabile a quello di un DBMS http://www.giovanniascione.it/?p=87

Get-WmiObject Class Win32_ComputerSystem

Alcune informazioni di base sul sistema. Al contrario di VBScript e altri linguaggi,


Windows PowerShell non richiede lutilizzo di una sintassi complessa, riducendo linput al minimo
assoluto.
cmdlet Get-WmiObject per definire che vuoi lavorare con WMI
classe WMI con cui vuoi lavorare (es. -Class Win32_ComputerSystem)

Visualizzate lattributo del nome utente (User name) del sistema.

(Get-WmiObject -Class Win32_ComputerSystem).UserName

Recuperare informazioni sul desktop del PC:

Get-WmiObject -Class Win32_Desktop -ComputerName .


Il punto finale fa parte del comando ed indica che volete recuperare i dati del computer locale. In
altri casi possibile utilizzare il nome di un altro computer (server1, server2.mycompany.it, etc.).

Informazioni sul BIOS del sistema:


Get-WmiObject Class Win32_Bios

5
Elencare tutti gli hotfix installati nel sistema:
Get-WmiObject Class Win32_QuickfixEngineering

Script

Criteri di esecuzione
Gli script sono estremamente potenti, purtroppo per possono anche essere utilizzati per
danneggiare un sistema. In PS esistono una serie di funzionalit di protezione, tra cui i criteri di
esecuzione che determinano se gli script possono essere eseguiti ed eventualmente se devono essere
firmati.

Il criterio pu assumere 4 valori:


- Restricted: quello impostato quando installiamo la PS, non consente l'esecuzione di script n il
caricamento di file di configurazione;
- AllSigned: consente l'esecuzione di script, ma questi devono essere firmati digitalmente (con
certificato rilasciato da una CA riconosciuta), sia che siano scaricati da internet, sia che siano creati
sul computer locale;
- RemoteSigned: consente l'esecuzione di script, che devono essere firmati digitalmente (con
certificato rilasciato da una CA riconosciuta) se sono stati scaricati da internet, o dalla posta
elettronica, o da software di messaggistica; possono invece venire eseguiti tranquillamente quelli
creati sul computer locale;
- Unrestricted: permette l'esecuzione di script non firmati.

Creo un semplice file hello.ps1 contenente la sola riga


Write-Output "Hello World"
e poi lo eseguo, avremo il seguente errore:

Verifico quindi il criterio di protezione tramite il cmdlet Get-ExecutionPolicy e verifico che sia
effettivamente Restricted. Modifico quindi con il cmdlet Set-ExecutionPolicy RemoteSigned
(questa l'impostazione che uso io attualmete). Proviamo ora a rilanciare lo script e verifichiamone il
corretto funzionamento.
Non molto intuitivo ricordarselo, ma per lanciare gli script bisogna indicare il path di esecuzione

6
(nel mio caso il ./ prima del nome dello script); un modo facile per non dimenticarselo utilizzare
l'autocomplete attivato sul tasto tab, che ci completa la stringa digitata a mano .

Esempio di script che genera una lista dei servizi "running"

# RunningServices.ps1 PowerShell Cmdlet


# Questo script genera una lista dei servizi "running"
# D.Talamonti
#
# Inserisce una linea
Report del: + (get-date)
# Inserisce una linea
Servizi che sono running
get-service | where-object { $_.status -eq running}

7
Esercizio velocita di download e upload
http://powershell.it/Snippet/Monitorare-la-velocita-di-download-ed-upload.aspx

$machineName = '.'
$perfCategory = New-Object System.Diagnostics.PerformanceCounterCategory('Network
Interface')
$perfData = New-Object System.Collections.ArrayList

$perfCategory.GetInstanceNames() |
ForEach-Object {
$perfReceived = New-Object System.Diagnostics.PerformanceCounter('Network Interface',
'Bytes Received/sec', $_, $machineName)
$perfSent = New-Object System.Diagnostics.PerformanceCounter('Network Interface', 'Bytes
Sent/sec', $_, $machineName)

$perfData.Add(@{
'Interface' = $_;
'PerfReceived' = $perfReceived;
'PerfSent' = $perfSent;
'Received' = $perfReceived.RawValue;
'Sent' = $perfSent.RawValue
})
}

Start-Sleep 1

$perfData |
ForEach-Object {
'Interfaccia: ' + $_.Interface

'Spediti: ' + ($_.PerfSent.RawValue - $_.Sent) / 1KB


'Ricevuti: ' + ($_.PerfReceived.RawValue - $_.Received) / 1KB
}

Risultato
0
1
2
3
Interfaccia: VirtualBox Host-Only Ethernet Adapter
Spediti: 0
Ricevuti: 0
Interfaccia: Intel[R] 82578DC Gigabit Network Connection
Spediti: 0.041015625
Ricevuti: 0.7724609375
Interfaccia: isatap.itisap.it
Spediti: 0
Ricevuti: 0
Interfaccia: isatap.{40C55133-5FD5-439E-8412-B70D321540DF}
Spediti: 0
Ricevuti: 0
8
Visualizza in modo ricursivo il contenuto delle cartelle
Get-ChildItem -Path $_. <# Commento #> -Recurse
($_. Significa dir corrente)

Eta del BIOS


Con questo esempio vengono visualizzati il nome e l'et del BIOS in un computer remoto, dt (mio
PC). Risultato in ore min,sec

In Strumentazione gestione Windows (WMI) Windows Management Instrumentation (WMI) viene utilizzato
un oggetto data/ora diverso dall'oggetto data/ora di .NET Framework restituito da Get-Date. Per
utilizzare le informazioni relative a data e ora restituite da WMI in un comando in cui tali
informazioni vengono restituite da Get-Date, necessario utilizzare il metodo ConvertToDateTime
per convertire gli oggetti CIM_DATETIME di WMI in oggetti DateTime di .NET Framework.

Nel primo comando viene utilizzato il cmdlet Get-WmiObject per ottenere un'istanza della classe
Win32_BIOS in dt che viene memorizzata nella variabile $a.

Nel secondo comando viene utilizzato l'operatore pipeline (|) per inviare l'oggetto WMI archiviato
in $a al cmdlet Format-List. Viene quindi utilizzato il parametro Property di Format-List per
specificare due propriet da visualizzare nell'elenco, ovvero "Name" e "BIOS Age". La propriet
"BIOS Age" viene specificata in una tabella hash. Tale tabella include la chiave Label, in cui
specificato il nome della propriet, e la chiave Expression, che include l'espressione per il calcolo
dell'et del BIOS. Nell'espressione viene utilizzato il metodo ConvertToDateTime per convertire
ogni istanza di ReleaseDate in un oggetto DateTime di .NET Framework. Il valore viene quindi
sottratto da quello del cmdlet Get-Date, che, senza parametri, consente di ottenere la data corrente.

Il carattere di apice inverso (`) il carattere di continuazione della riga in Windows PowerShell.

$a = get-wmiobject win32_bios -computer dt


$a | format-list -property Name, @{Label="Eta' del BIOS PC_Donatella"; `
Expression={(get-date) - $_.ConvertToDateTime($_.ReleaseDate)}}

Rinominare una cartella


Il nuovo nome deve essere uguale al nome vecchio pi la data-ora.

Rename-Item d:\tmp\aaa ("aaa-{0:yyyyMMddHHmmss}" -f (Get-Date))

(-f significa formato breve)

Provare: get-date -format g


9
Shutdown di n pc dalla cattedra del laboratorio
(Get-WmiObject Win32_OperatingSystem -ComputerName LABAPC1).Shutdown()
(Get-WmiObject Win32_OperatingSystem -ComputerName LABAPC2).Shutdown()
(Get-WmiObject Win32_OperatingSystem -ComputerName LABAPC3).Shutdown()

Oppure per 10 PC:


1..10 | % {
(gwmi Win32_OperatingSystem -ComputerName "LABAPC$_").Shutdown()
}

Tenere presente che la variabile ExecutionPolicy deve essere impostata per consentire
l'esecuzione di script non firmati, per cui prima di eseguire lo script (se non gi stato
fatto) lanciare il comando

Set-ExecutionPolicy Unresticted

Importante
Tornando all'esecuzione dello script, per eseguilo sui PC remoti in dominio bisogna avere
le autorizzazioni ad eseguire comandi WMI, per cui l'utenza locale non va bene: bisogna
utilizzare un utenza di dominio con le giuste autorizzazioni.

Per lanciare gli script esterni da PowerShell specificare anche il path, per ragioni di sicurezza ( sufficiente il
path relativo):

.\shutdown.ps1

Disconnessione della sessione corrente


shutdown.exe -l

possibile utilizzare WMI. La classe Win32_OperatingSystem include un metodo


Win32Shutdown. sufficiente richiamare il metodo con il flag 0 per avviare la disconnessione:

(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown(0)

Per spegnere il computer, utilizzare il metodo Win32Shutdown con il flag 1.

(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown(1)

Per riavviare il sistema operativo, utilizzare il metodo Win32Shutdown con il flag 2.

(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown(2)

10
Creazione di un account sulla macchina locale (in parte)
Input
Visualizza PWD in chiaro

Clear-Host

# Prede i dati da un utente.

$UserName = Read-Host "Nome utente da creare"


$FullName = Read-Host "Nome completo utente"
$Password = Read-Host "Password utente" -AsSecureString
$Password1 = Read-Host "Verifica password utente" -AsSecureString
$GroupName = Read-Host "Inserire il gruppo di appartenenza dell'utente"

# Converte in chiaro le due password criptate.

$Password =
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Mars
hal]::SecureStringToBSTR($Password))
$Password1 =
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Mars
hal]::SecureStringToBSTR($Password1))

Visualizzare i valori di tutte le variabili di ambiente:

get-childitem env:

get-childitem env: | sort name


gci env: | sort name

Utente corrente e dominio

[Security.Principal.WindowsIdentity]::GetCurrent().Name

Ricavabile anche cos:

[Environment]::UserDomainName + "\" + [Environment]::UserName

Il primo elemento dell'array, cio quello con indice 0, restituir lo userdomainname, il secondo elemento il
solo username.

In questo caso sei costretto a manipolare la stringa per ottenere ci che desideri.
Tramite la classe environment invece puoi ottenere direttamente le singole variabili. (vedi Visualizzare i valori
di tutte le variabili di ambiente:

[Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")[0]
[Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")[1]

11
Listare i file appartenenti ad un certo utente

per recuperare l'owner dei file usare il cmdlet Get-Acl, associandolo, naturalmente, a Get-ChildItem per
recuperare ricorsivamente il contenuto della directory che interessa.

Get-ChildItem -Path C:\temp -Recurse |


Get-Acl |
Where-Object { $_.Owner -like 'Alkaid\ikmju' } |
Convert-Path

In questo caso parto da C:\temp e filtro il risultato in base all'owner, che nel mio caso ALKAID\Ikmju. Nel
caso te lo chiedessi, il cmdlet Convert-Path serve per ritornare un percorso legato al provider utilizzato (nel
nostro caso il filesystem).

Esempio:
Get-ChildItem -Path z:\ -Recurse |
Get-Acl |
Where-Object { $_.Owner -like 'BUILTIN\Administrators' } |
Convert-Path

Get-Acl

Il cmdlet Get-Acl ottiene oggetti che rappresentano il descrittore di sicurezza di un file o di una risorsa. Tale
descrittore contiene gli elenchi di controllo di accesso (ACL, Access Control List) della risorsa. L'elenco di
controllo di accesso specifica le autorizzazioni di cui devono disporre utenti e gruppi di utenti per accedere
alla risorsa.

12
Analisi dei file di log

Create una lista di tutti i file di log nella cartella di Windows (variabile dambiente Windir); cercate
allinterno dei file di log la parola Error, visualizzate in output il nome del file di log e la linea con lerrore:
>

dir $env:windir\*.log | Select-String -List Error |


Format-Table Path,LineNumber AutoSize

13