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