ESEMPI PowerShell_dt

Transcript

ESEMPI PowerShell_dt
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 (nell‟esempio: 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 l‟ordinamento.
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 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.
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 dell‟esercizio 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 dall‟esercizio 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, ExportCSV 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.
Get-Service | Sort-Object Status
Output in HTML
esempi per esplorare le varie opzioni rese disponibili dal cmdlet ConvertTo-HTML.
Convertire l’output 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 l‟elaborazione con CTRL+C.
Get-Service | ConvertTo-HTML
memorizzare l’output dell’esercizio 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 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.
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 GetMember 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
l‟argomento 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 dell‟elemento 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) è 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
Get-WmiObject –Class Win32_ComputerSystem
Alcune informazioni di base sul sistema. Al contrario di VBScript e altri linguaggi,
Windows PowerShell non richiede l‟utilizzo di una sintassi complessa, riducendo l‟input al minimo
assoluto.
• cmdlet Get-WmiObject per definire che vuoi lavorare con WMI
• classe WMI con cui vuoi lavorare (es. -Class Win32_ComputerSystem)
Visualizzate l’attributo 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
$FullName
$Password
$Password1
$GroupName
= Read-Host "Nome utente da creare"
= Read-Host "Nome completo utente"
= Read-Host "Password utente" -AsSecureString
= Read-Host "Verifica password utente" -AsSecureString
= 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 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:
>
dir $env:windir\*.log | Select-String -List Error |
Format-Table Path,LineNumber –AutoSize
13