Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ESEMPI PowerShell - DT PDF
ESEMPI PowerShell - DT PDF
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
Generare una lista dei primi dieci processi, ordinati in base alla loro percentuale di utilizzo del
processore. Per fare ciò, utilizzare il risultato ottenuto dall‟esercizio precedente e aggiungerci il
comando Select-Object. Ci sono due modi per raggiungere una soluzione ottimale, a seconda di
come la lista viene ordinata.
Assegna alla variabile $P la lista dell‟esercizio precedente. Visualizzare il contenuto della variabile
a video semplicemente digitando $P al prompt.
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 all‟utente 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.
Output in HTML
esempi per esplorare le varie opzioni rese disponibili dal cmdlet ConvertTo-HTML.
Get-Service | ConvertTo-HTML
Generate una pagina web più concisa e riportate solo il nome e lo stato di ciascun servizio.
Ordinare l‟output 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.
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 (:).
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.
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.
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.
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
Measure-Object
Esiste un altro utile cmdlet, al di là di Get-Member, per recuperare informazioni sugli oggetti:
Measure-Object.
Remove-Item .\*.tmp
4
Creare cartelle
New-Item. Questo cmdlet accetta il nome dell‟elemento come argomento ed il tipo come parametro,
come Directory per una cartella.
Oggetti WMI
Windows Management Instrumentation (WMI) è l’infrastruttura per la gestione dei dati e delle operazioni sui sistemi operativi
basati su Windows”. Il WMI è uno strato software che gira come servizio all’interno del sistema operativo. Questo servizio è
paragonabile a quello di un DBMS http://www.giovanniascione.it/?p=87
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.
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 .
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
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)
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.
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
10
Creazione di un account sulla macchina locale (in parte)
Input
Visualizza PWD in chiaro
Clear-Host
$Password =
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Mars
hal]::SecureStringToBSTR($Password))
$Password1 =
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Mars
hal]::SecureStringToBSTR($Password1))
get-childitem env:
[Security.Principal.WindowsIdentity]::GetCurrent().Name
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.
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 d’ambiente “Windir”); cercate
all’interno dei file di log la parola “Error”, visualizzate in output il nome del file di log e la linea con l’errore:
>
13