Powershell Martin Čuchran cuchran@muni.cz Definícia u„PowerShell is an automation platform and scripting language for Windows and Windows Server that allows you to simplify the management of your systems. Unlike other text-based shells, PowerShell harnesses the power of the .NET Framework, providing rich objects and a massive set of built-in functionality for taking control of your Windows environments.“ u Microsoft uSúčasti: uPowershell uPowershell ISE uPowershell Desired State Configuration (DSC) Obsah prednášky uBackground jobs uRunspaces uDebuging uRemote management uNovinky v Powershell 5.0 u Motivácia uMáte v správe 500 zamestnaneckých PC. Dostali ste hlásenie, že pri včerajších aktualizáciach SW sa korektne nenainštaloval požadovaný SW a naniektorých spravovaných PC chýbajú konfiguračné súbory. Ako zaistíte nápravu? u uZabezpečujete správu identít v cloudovom prostredí Microsoft Office365 pre 500 zamestnancov. Všetkym užívateľom potrebujete nastaviť novú e-mailovu adresu pre ich účet. Aké možnosti máte? Motivácia uMáte v správe 500 zamestnaneckých PC. Dostali ste hlásenie, že pri včerajších aktualizáciach SW sa korektne nenainštaloval požadovaný SW a na niektorých spravovaných PC chýbajú konfiguračné súbory. Ako budete postupovať pri oprave? u1. Zistím, na ktorých PC chýbajú požadované súbory: uPowershell remoting + Background jobs / runspaces u2. Zaistím opravu uGPO + Powershell Remoting uZabezpečujete správu identít v cloudovom prostredí Microsoft Office365 pre 500 zamestnancov. Všetkym užívateľom potrebujete nastaviť novú e-mailovu adresu pre ich účet. Aké možnosti máte? Motivácia uMáte v správe 500 zamestnaneckých PC. Dostali ste hlásenie, že pri včerajších aktualizáciach SW sa korektne nenainštaloval požadovaný SW a na niektorých spravovaných PC chýbajú konfiguračné súbory. Ako budete postupovať pri oprave? u1. Zistím, na ktorých PC chýbajú požadované súbory: uPowershell remoting + Background jobs / runspaces u2. Zaistím opravu uGPO + Powershell Remoting uZabezpečujete správu identít v cloudovom prostredí Microsoft Office365 pre 500 zamestnancov. Všetkym užívateľom potrebujete nastaviť novú e-mailovu adresu pre ich účet. Aké možnosti máte a ako budete postupovať? uPoužijem Web GUI a uklikam sa k smrti uNaskriptujem zmeny a použijem Powershell remoting pre komunikáciu s cloudom Powershell Background jobs uUvedené vo verzii Powershell 2.0 (Windows server 2008r2<) uUmožňuje asynchronný beh skriptov u„Náhrada“ za vlákna uSamostatná session pre každý job – vlastný proces uPrístup len z rodičovského procesu Powershell Background jobs uUvedené vo verzii Powershell 2.0 (Windows server 2008r2<) uUmožňuje asynchronný beh skriptov u„Náhrada“ za vlákna uSamostatná session pre každý job – vlastný proces uPrístup len z rodičovského procesu u uPríklad: u Start-job –name Test –scriptBlock {Get-Process | select name} u Invoke-Command –computerName dc1 –scriptBlock {Get-Process} -asJob Powershell Background jobs – cmdlety uSpustenie jobu uStart-Job -Name "Test Job" -ScriptBlock {Write-Output $args[0] > C:\output.txt} uSprostredkovanie argumentov pomocou „–argumentList“ uZískanie informácií o existujúcich Background job-och uGet-Job -State …. uPrístup k výstupu z Background job-u uReceive-Job uDeštruktívne čítanie – $data = Receive-Job –Job …. uOdstránenie Background job-u uRemove-Job uBackground job pomocou parametru „-asJob“ uInvoke-Command -ScriptBlock {….} -AsJob -ComputerName .... u Powershell Background jobs – Príklad uZistite s využitím Powershell Background jobs prítomnosť súboru C:\file.txt na počítačoch zo zoznamu C:\computers.csv. u #1 Get-Content C:\computers.csv | %{ Invoke-Command -ComputerName $_ -ScriptBlock {Write-output $args[0];Test-Path C:\file.txt} –ArgumentList $_ -AsJob } while((Get-Job -State Running).count -gt 0){ Start-Sleep -Seconds 1 } Get-Job -State Completed | %{Receive-Job -Id $_.Id} Powershell Background jobs – úloha uZaložte 5 skupín s názvom group, kde x je z rozsahu <1,5> v Active Directory s využitím Powershellu background jobs. Výstup z operácie zapíšte do súboru C:\output.txt u uZistite, či existujú súbory zo zoznamu files.csv na lokálnom PC s využitím Background-jobs. Powershell Background jobs – úloha uZaložte 5 skupín s názvom group, kde x je z rozsahu <1,5> v Active Directory s využitím Powershellu background jobs. Výstup z operácie zapíšte do súboru C:\output.txt u u u u uZistite, či existujú súbory zo zoznamu files.csv na lokálnom PC s využitím Background-jobs. 1..5 | %{ Start-Job -ScriptBlock {New-ADGroup -Name $groupName -GroupCategory Security -GroupScope Global -Path "CN=Users,DC=pv176,DC=local"} –ArgumentList “group$($_)” } while((Get-Job -State Running).count -gt 0){ Start-Sleep -Seconds 1 } Get-Job -State Completed | %{Receive-Job -Id $_.Id} > C:\output.txt Powershell Background jobs – úloha uZaložte 5 skupín s názvom group, kde x je z rozsahu <1,5> v Active Directory s využitím Powershellu background jobs. Výstup z operácie zapíšte do súboru C:\output.txt u u u u uZistite, či existujú súbory zo zoznamu files.csv na lokálnom PC s využitím Background-jobs. 1..5 | %{ Start-Job -ScriptBlock {New-ADGroup -Name $groupName -GroupCategory Security -GroupScope Global -Path "CN=Users,DC=pv176,DC=local"} –ArgumentList “group$($_)” } while((Get-Job -State Running).count -gt 0){ Start-Sleep -Seconds 1 } Get-Job -State Completed | %{Receive-Job -Id $_.Id} > C:\output.txt Get-Content C:\files.csv | %{ Start-Job -ArgumentList $_ -ScriptBlock {Write-Output $args[0]; Test-Path $args[0]} } while((Get-Job -State Running).count -gt 0){ Start-Sleep -Seconds 1 } Get-Job -State Completed | %{Receive-Job -Id $_.Id} Literatúra uhttps://msdn.microsoft.com/en-us/library/dd878288(v=vs.85).aspx uhttps://msdn.microsoft.com/powershell/reference/5.1/Microsoft.PowerShell.Core/about/about_Jobs uhttps://www.howtogeek.com/138856/geek-school-learn-how-to-use-jobs-in-powershell/ u Powershell runspaces uAlternatíva k Background jobs uVýhody: uRýchlejšia inicializácia uMenšie nároky na zdroje uAlternatíva k vláknam uNevýhody: uNie je plnohodnotná Powershell session – nepodporuje všetky funkcie PS uZložitosť – monitoring vlákna, ošetrenie chýb Powershell runspaces – ukážka $Runspace = [runspacefactory]::CreateRunspace() $PowerShell = [powershell]::Create() $PowerShell.runspace = $Runspace $Runspace.Open() [void]$PowerShell.AddScript({ Get-Date Start-Sleep -Seconds 10 }) $AsyncObject = $PowerShell.BeginInvoke() Literatúra uhttps://blogs.technet.microsoft.com/heyscriptingguy/2015/11/26/beginning-use-of-powershell-runspac es-part-1/ uhttps://thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/ u Powershell debugging uPráca s výstupom uWrite-Host, Write-Verbose, Write-Output, Write-Debug, Write-Error, Write-Warning uOdchytávanie chýb uTry-Catch-Finally uLogovanie uStart-transcript, Stop-transcript uPowershell logs u Powershell debugging - Práca s výstupom uPráca s výstupom uWrite-Host uWrite-Verbose uWrite-Output uWrite-Debug uWrite-Error uWrite-Warning uWrite-Information (PS 5.0) uAký je rozdiel medzi skupinami cmdletov “Write-host, Write-error, Write-warning” a “Write-Debug, Write-Verbose” ? Powershell debugging - Práca s výstupom u$DebugPreference uContinue uStop uSilentlyContinue uInquire u$VerbosePreference uContinue uStop uSilentlyContinue uInquire u$ErrorActionPreference - > Viac v ďalšej časti prednášky uAký je rozdiel medzi jednotlivými hodnotami? uMôžeme zabezpečiť zobrazovanie debug a verbose výstupu aj iným spôsobom? u Powershell debugging - Práca s výstupom u uPríklad .\debugging.ps1 uČo vypíše na štandardný výstup zadaný script? u Powershell debugging - Práca s výstupom u uPríklad .\debugging.ps1 uČo vypíše na štandardný výstup zadaný script? uAko zabezpečím aby sa na štandardný výstup vypísali všetky definované reťazce? u Literatúra uhttps://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_pr eference_variables uhttps://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/write-host u Powershell debugging - Odchytávanie chýb uTry-Catch-Finally u Try { $AuthorizedUsers = Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop } Catch [System.OutOfMemoryException] { Restart-Computer localhost } Catch { $ErrorMessage = $_.Exception.Message $FailedItem = $_.Exception.ItemName Send-MailMessage -From ExpensesBot@MyCompany.Com -To WinAdmin@MyCompany.Com -Subject "HR File Read Failed!" -SmtpServer EXCH01.AD.MyCompany.Com -Body "We failed to read file $FailedItem. The error message was $ErrorMessage" Break } Finally { $Time=Get-Date "This script made a read attempt at $Time" | out-file c:\logs\ExpensesScript.log -append } Powershell debugging - Odchytávanie chýb uPowershell pracuje s 2 typmi chýb uTerminating errors uNon-Terminating errors uTry-Catch-Finally vyžaduje pre správnu funkčnosť aby cmdlety vyhadzovali Terminating errors u uAko zabezpečíte, aby konštrukcia try-catch-finally vedela reagovať na akékoľvek chyby v rámci vášho skriptu? Powershell debugging - Odchytávanie chýb uPowershell pracuje s 2 typmi chýb uTerminating errors uNon-Terminating errors u uAko zabezpečíte, aby konštrukcia try-catch-finally vedela reagovať na akékoľvek chyby v rámci vášho skriptu? uKonverzia Non-Terminating errors na Terminating errors u$ErroActionPreference uContinue uStop uSilentlyContinue uInquire uSuspend u-ErrorAction Powershell debugging - Odchytávanie chýb uPríklad .\Try-catch-finally.ps1 uČo vypíše na štandardný výstup zadaný script? u u Powershell debugging - Odchytávanie chýb uPríklad .\Try-catch-finally.ps1 uČo vypíše na štandardný výstup zadaný script? uAko zabezpečím aby konštrukcia try-catch-finally fungovala správne? u u u Literatúra uhttps://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_pr eference_variables uhttps://www.vexasoft.com/blogs/powershell/7255220-powershell-tutorial-try-catch-finally-and-error- handling-in-powershell u Powershell debugging - Logovanie u uS 5 kolegami spravujete 5000 PC. Ako zabezpečíte logovanie bezobslužných skriptov, ktoré sa spúšťajú na PC vo vašej správe? Powershell debugging - Logovanie u uS 5 kolegami spravujete 5000 PC. Ako zabezpečíte logovanie bezobslužných skriptov, ktoré sa spúšťajú na PC vo vašej správe? uVyužijem Write-* cmdlety, poriadne ošetrým odchytávanie výnimiek a donútim takéto riešenie používať všetkých kolegov Powershell debugging - Logovanie u uS 5 kolegami spravujete 5000 PC. Ako zabezpečíte logovanie bezobslužných skriptov, ktoré sa spúšťajú na PC vo vašej správe? uVyužijem Write-* cmdlety, poriadne ošetrým odchytávanie výnimiek a donútim takéto riešenie používať všetkých kolegov uPoužijem Powershell Transcript Powershell debugging - Logovanie u uS 5 kolegami spravujete 5000 PC. Ako zabezpečíte logovanie bezobslužných skriptov, ktoré sa spúšťajú na PC vo vašej správe? uVyužijem Write-* cmdlety, poriadne ošetrým odchytávanie výnimiek a donútim takéto riešenie používať všetkých kolegov uPoužijem Powershell Transcript uZapnem logovanie pre Powershell pomocou GPO Powershell debugging - Logovanie u uPowershell Transcript uZaznamenáva užívateľsky vstup a výstup z Powershell session do textového súboru. Záznam obsahuje aj aktuálne nastavenie Powershell session uPowershell Transcript cmdlety uStart-Transcript uStop-Transcript uPowershell Transcript môže byť hromadne vynútený cez GPO uOd verzie Powershell 5.0 dostupné aj v Powershell ISE u Powershell debugging - Odchytávanie výstupu u uPríklad: .\Transcript.ps1 u Powershell debugging - Logovanie u uNastavenie Powershell Transcript cez GPO u\Computer Configuration\ Administrative Templates\Windows Components\Windows PowerShell u u Powershell debugging - Logovanie u uÚloha 1: Nastavte vytváranie transcript logov pre všetky PC v doméne pomocou GPO do adresáru C:\Transcript bez zaškrtnutej možnosti „IncludeInvocationHeader“ uOverte funkčnosť nastavenia pomocou spustenia Powershell príkazu na jednom z PC v doméne. uÚloha 2: Nastavte vytváranie transcript logov pre všetky PC v doméne pomocou GPO do adresáru C:\TranscriptWithHeaders so zaškrtnutou možnosťou „IncludeInvocationHeader“ uOverte funkčnosť nastavenia pomocou spustenia Powershell príkazu na jednom z PC v doméne. u uAký je rozdiel vo vytvorených logoch? u u u Powershell debugging - Logovanie u uSpracovanie Powershell príkazov je možné logovať aj pomocou systémoveho logu (Event viewer) uLogovanie prebieha na 2 úrovniach: uLogovanie modulov (Event ID 4103) uLogovanie scriptov (Event ID 4104) uLogy sú umiestnené v časti „Applications and Services Logs\Microsoft\Windows\PowerShell\Operational” uZapnutie pomocou GPO v \Computer Configuration\ Administrative Templates\Windows Components\Windows PowerShell uTurn on Module Logging uTurn on PowerShell Script Block Logging uZapnuté logovanie generuje netriviálne množstvo udalostí Powershell debugging - Logovanie u uÚloha: Nastavte logovanie Powershell príkazov pre PC v doméne na úrovni modulov a scriptov pomocou GPO. Overte funkčnosť nastavenia. Powershell debugging - Logovanie u uÚloha: Nastavte logovanie Powershell príkazov pre PC v doméne na úrovni modulov a scriptov pomocou GPO. Overte funkčnosť nastavenia. Literatúra uhttps://www.fireeye.com/blog/threat-research/2016/02/greater_visibilityt.html uhttps://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.host/start-transcri pt u Powershell remote management uV rámci prostredia Microsoft Powershell-u môžete využiť viacero technológií uRPC – Get-Service –ComputerName … uWMI – GetWMIObject –ComputerName … uWS-Management – Invoke-Command -ComputerName ….. (Powershell Remoting) u u Powershell Remoting uVyužíva WS-Management uHTTP – TCP/5985 uHTTPs – TCP/5986 uAutentizácia uBasic Auth uDigest uKerberos uUmožňuje vytvoriť uPersistentné spojenia uInteraktívne 1:1 spojenia uSpúšťať skripty na viacerých PC u„Obdoba“ SSH Powershell Remoting - Konfigurácia uPowershell Remoting sprostredkováva služba WinRM uWinRM pozostáva z klientskej a serverovej časti uWinRM môžeme konfigurovať: uLokálne pomocou Powershellu - Enable-PSRemoting a winrm uPomocou GPO - Policies > Administrative Templates > Windows Components > Windows Remote Management (WinRM) uZobrazenie aktuálnej konfigurácie cez Powershell: u winrm get winrm/config uZákladna konfigurácia uwinrm quickconfig a winrm set winrm/config/…. u Powershell Remoting - Konfigurácia uwinrm quickconfig u uwinrm get winrm/config u uwinrm set winrm/config/client '@{AllowUnencrypted="true"}' Powershell Remoting - Konfigurácia uPomocou GPO – Client + Service uPotrebné zabezpečit automatické spúšťanie služby WinRM pri štarte PC uPolicies > Administrative Templates > Windows Components > Windows Remote Management (WinRM) u Powershell Remoting - Ukážka uInteraktívna Powershell session: u Enter-PSSession -ComputerName dc1 uPersistentná Powershell session: u $session = New-PSSession -ComputerName dc1 uInformácie o existujúcich Powershell sessions: u Get-PSSession uUkončenie spojenia v prípade persistentnej Powershell session: u Remove-PSSession –Session $session uSpustenie scriptbloku v Powershell session: u Invoke-Command -Session $session -ScriptBlock {get-service -name dhcp} Powershell Remoting - Úloha uZistite, či je na vašich doménovych radičoch povolený Powershell Remoting uZistite pomocou Powershell Remotingu z doménoveho radiča 1 aké služby bežia na doménovom radiči 2 uZmeňte hodnotu „MaxConcurrentoperationsPerUser“ na 500 pre WinRM server na jednom z vašich radičov uVytvorte persistentné spojenie na PC v doméne pomocou Powershell Remotingu a doménového názvu PC. Zistite ako procesy bežia na vzdialenom PC uVytvorte persistentné spojenie na PC v doméne pomocou Powershell Remotingu a IP adresy PC. Na aký problém môžete naraziť? u Literatúra uhttps://msdn.microsoft.com/en-us/library/aa384372(v=vs.85).aspx uhttps://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.core/Enable-PSRemoting uhttps://blogs.technet.microsoft.com/josebda/2010/03/31/experimenting-with-powershell-v2-remoting/ u Novinky v Powershell 5.0 uhttps://msdn.microsoft.com/en-us/powershell/scripting/whats-new/what-s-new-in-windows-powershell-5 0#BKMK_new50 u