Automatizace Windows, naplánované úlohy a Powershell PowerShell a režim bez interakce Patrik Malina www.patrikmalina.eu O čem bude řeč Skripty v Powershellu jako naplánované úlohy Možnosti a úskalí spouštění Powershellu Volání externích programů s parametry Ovládání plánovače úloh Powershellem Zachycení a zpracování událostí ve Windows Výběr novinek Powershellu 3 20. 2. 2012 Patrik Malina 2
Naplánované úlohy Powershell a dávkové zpracování powershell.exe /? powershell.exe -Command powershell.exe -File powershell.exe -EncodedCommand 20. 2. 2012 Patrik Malina 3 Naplánované úlohy Powershell a dávkové zpracování powershell.exe -Command powershell.exe -command get-date powershell.exe -command get-process powershell powershell.exe -command get-date ; get-host powershell.exe -command {get-date} powershell.exe -command {get-date ; get-service} powershell.exe -command "&{get-date}" 20. 2. 2012 Patrik Malina 4
Naplánované úlohy Powershell a dávkové zpracování powershell.exe -File powershell.exe.\script.ps1 powershell.exe D:\data\script.ps1 powershell.exe -file D:\data\script.ps1 powershell.exe -File 20. 2. 2012 Patrik Malina 5 Naplánované úlohy Powershell a vstupní parametry powershell.exe D:\data\script.ps1 powershell.exe -file D:\data\script.ps1 1 powershell.exe D:\data\script.ps1 1 abc 20. 2. 2012 Patrik Malina 6
Naplánované úlohy Powershell a bezpečnostní politiky powershell.exe -ExecutionPolicy ByPass Unrestricted Signed AllSigned 20. 2. 2012 Patrik Malina 7 Naplánované úlohy Externí komponenty: Snap-In Try {add-pssnapin Microsoft.Exchange.Management.PowerShell.Admin -ErrorAction Stop; #2007 } Catch {Write-host "Exchange 2007 snap-in load failed"} 20. 2. 2012 Patrik Malina 8
Naplánované úlohy Externí komponenty: Module try { import-module grouppolicy -ErrorAction Stop } Catch { Write-Host "Group Policy management module import failed; check GPMC module availability." } 20. 2. 2012 Patrik Malina 9 Naplánované úlohy Externí komponenty: Console File PowerShell -PSConsoleFile xx.psc1 <?xml version="1.0" encoding="utf-8"?> <PSConsoleFile ConsoleSchemaVersion="1.0"> <PSVersion>1.0</PSVersion> <PSSnapIns> <PSSnapIn Name="Quest.ActiveRoles.ADManagement" /> </PSSnapIns> </PSConsoleFile> 20. 2. 2012 Patrik Malina 10
Naplánované úlohy Powershell a proměnné prostředí (dir env:username).value Get-Content env:username $env:username 20. 2. 2012 Patrik Malina 11 Možnosti a úskalí Potřebujeme hesla I. Read-Host -AsSecureString $secure_string_pwd = convertto-securestring "P@ssW0rD!" -asplaintext -force 20. 2. 2012 Patrik Malina 12
Možnosti a úskalí Potřebujeme hesla II. $pass = cat pass.txt $secure_string_pwd = convertto-securestring $pass -asplaintext -force 20. 2. 2012 Patrik Malina 13 Možnosti a úskalí Potřebujeme hesla III. function Get-EncryptedText($text) { $Ptr = [System.Runtime.InteropServices.Marshal ]:: SecureStringToCoTaskMemUnicode($text) $result = [System.Runtime.InteropServices.Marshal]:: PtrToStringUni($Ptr) [System.Runtime.InteropServices.Marshal]::ZeroFreeCoT askmemunicode($ptr) $result } 20. 2. 2012 Patrik Malina 14
Možnosti a úskalí Potřebujeme hesla III. Get-EncryptedText $secure_string_pwd 20. 2. 2012 Patrik Malina 15 Možnosti a úskalí Potřebujeme hesla IV. Get-WmiObject win32_share -ComputerName stroj1 -Credential admin $cred = New-Object System.Management.Automation.PSCredential( "Admin",$secure_string_pwd) Get-WmiObject win32_share -ComputerName stroj1 -Credential $cred 20. 2. 2012 Patrik Malina 16
Možnosti a úskalí Potřebujeme hesla V. $cred1 = New-Object System.Net.NetworkCredential $cred1.domain = "domena" $cred1.username = "Admin" $cred1.securepassword = $secure_string_pwd $cred1 fl * 20. 2. 2012 Patrik Malina 17 Možnosti a úskalí Tok výstupních dat $VerbosePreference = "continue" $DebugPreference = "continue" $WarningPreference = "continue" $ErrorActionPreference = "continue" Write-Verbose "Start" Write-Output "Startuji..." Write-Verbose "Ctu data" $verze = (Get-Host).version Write-Verbose "Chystam vypis" Write-Debug "Verze nactena" Write-Warning "Pozor, zobrazime verzi PowerShellu!" Write-Verbose "Vypis" Write-Output $verze Writte-Host $verze #zamerna chyba Write-Verbose "Hotovo" Write-Debug "Konec uspesne" 20. 2. 2012 Patrik Malina 18
Možnosti a úskalí Tok výstupních dat $blok = [powershell]::create() $script = ((cat.\streams.ps1) -join "`n" ) $scriptobjekt = $executioncontext.invokecommand.newscriptblock($scrip t) $blok.addscript($scriptobjekt) Out-Null $blok.streams $blok.invoke() $blok.streams 20. 2. 2012 Patrik Malina 19 Možnosti a úskalí Joby I. $myjobs = @() $maxconcurrentjobs = 4 $waittimeforstart = 300 $waittimeforcollect = 1800 while (-not (($myjobs where {$_.state -like "Run*"} measure).count -lt $maxconcurrentjobs)) { Start-Sleep -Seconds $waittimeforstart } 20. 2. 2012 Patrik Malina 20
Možnosti a úskalí Joby II. $myjobs += Start-Job -InputObject $_ -ScriptBlock {} $myjobs where {($_.state -like "Complet*") -and ($_.HasMoreData)} Receive-Job while (($myjobs where {$_.state -like "Run*"} Measure-Object).count -gt 0) {} 20. 2. 2012 Patrik Malina 21 Externí programy Základní provedení ipconfig /all & 'C:\Program Files (x86)\log Parser 2.2\LogParser.exe' 20. 2. 2012 Patrik Malina 22
Externí programy Základní provedení & 'C:\Program Files (x86)\log Parser 2.2\LogParser.exe' -i:evt -fulltext:of F -o:csv -tabs:off "SELECT * INTO output.csv FROM SYSTEM" 20. 2. 2012 Patrik Malina 23 Externí programy Základní provedení $arg1 = "-i:evt" $arg2 = "-fulltext:off" $arg3 = "-o:csv" $arg4 = "-tabs:off" $arg5 = "SELECT * INTO output.csv FROM SYSTEM" $allargs = @($arg1,$arg2,$arg3,$arg4,$arg5) & 'C:\Program Files (x86)\log Parser 2.2\LogParser.exe' $allargs 20. 2. 2012 Patrik Malina 24
Externí programy Základní provedení $cmd = "ipconfig.exe" & $cmd $cmd = "ipconfig.exe /all" Invoke-Expression -Command $cmd 20. 2. 2012 Patrik Malina 25 Externí programy Základní provedení [management.automation.psparser]::tokenize('p ing 127.0.0.1', [ref]$null) 20. 2. 2012 Patrik Malina 26
Externí programy Základní provedení [management.automation.psparser]::tokenize('p ing 127.0.0.1', [ref]$null) 20. 2. 2012 Patrik Malina 27 Ovládání plánovače úloh Schtasks.exe $taskname = $myinvocation.mycommand.definition -replace '\W','_' schtasks /create /sc MINUTE /MO 5 /tn "$taskname" /tr "powershell -c $($myinvocation.mycommand.definition)" return; #switch to directory where the script lives pushd (split-path -parent $myinvocation.mycommand.definition) #insert useful code here write-host "Hello World" popd 20. 2. 2012 Patrik Malina 28
Ovládání plánovače úloh Schtasks.exe #nazev ulohy $TN = "Nocni udrzba" #ucet pro ulohu -- lokalni system $RU = "SYSTEM" #plan spousteni -- denne $SC = "Jen jednou" #cas spusteni - od ted za 10 minut $ST = "{0:HH:mm:ss}" -f ((get-date).addminutes(3)) #datum spusteni - tento den $SD = get-date -UFormat "%d/%m/%y" #uloha $TR = "calc.exe" schtasks.exe /Create /TN $TN /RU $RU /SC $SC /ST $ST /SD $SD /TR $TR 20. 2. 2012 Patrik Malina 29 Ovládání plánovače úloh Rozhraní COM http://taskscheduler.codeplex.com/ 20. 2. 2012 Patrik Malina 30
Ovládání plánovače úloh Rozhraní COM $agent = New-Object -ComObject "Scheduler.SchAgent" $agent.refresh() $uloha = $agent.createtask('moje uloha') $uloha.applicationname = 'calc.exe' $uloha.creator = 'Patrik' $uloha.setaccountinformation('stroj1\patrik','*** *****') $uloha.save() $uloha.run() 20. 2. 2012 Patrik Malina 31 Ovládání plánovače úloh Rozhraní COM $spoust = $uloha.triggers.add() $spoust.triggertype = 1 $spoust.beginday = get-date $spoust.starttime = ((get-date).addminutes(5)) $spoust.update() $uloha.save() $agent.refresh() 20. 2. 2012 Patrik Malina 32
Ovládání plánovače úloh Rozhraní COM Win 7 & spol. $scheduler = New-Object -ComObject Schedule.Service $scheduler.connect() $scheduler 20. 2. 2012 Patrik Malina 33 Ovládání plánovače úloh Rozhraní COM Win 7 & spol. http://archive.msdn.microsoft.com/powershellpack 20. 2. 2012 Patrik Malina 34
Ovládání plánovače úloh Rozhraní COM Win 7 & spol. New-Task Add-TaskTrigger -At "3:00 PM" -DayOfMonth 1,2,3,4,5 -MonthOfYear January, April, December Add-TaskAction -Path calc.exe Register-ScheduledTask (Get-Random) 20. 2. 2012 Patrik Malina 35 Události v Powershellu Sledování a reakce na události z.net Frameworku z rozhraní WMI Princip předplatného registrace subscription Hromadění událostí ve frontě není nutná bezprostřední reakce 20. 2. 2012 Patrik Malina 36
Události v Powershellu WMI postaru $a = 0 $timespan = New-Object System.TimeSpan(0, 0, 1) $scope = New-Object System.Management.ManagementScope("\\.\root\cimV2") $query = New-Object System.Management.WQLEventQuery ` (" InstanceDeletionEvent",$timespan, "TargetInstance ISA 'Win32_Process'" ) $watcher = New-Object System.Management.ManagementEventWatcher($scope,$query) do { $b = $watcher.waitfornextevent() $b.targetinstance.name } while ($a -ne 1) 20. 2. 2012 Patrik Malina 37 Události v Powershellu WMI nově Register-WmiEvent -query "SELECT * FROM ` InstanceDeletionEvent WITHIN 3 ` WHERE TargetInstance ISA 'Win32_Process'" ` -SourceIdentifier procesy ` -Action {$global:udalost=$event} 20. 2. 2012 Patrik Malina 38
Události v Powershellu WMI nově Register-WmiEvent -query "SELECT * FROM ` InstanceDeletionEvent WITHIN 3 ` WHERE TargetInstance ISA 'Win32_Process'" ` -SourceIdentifier procesy ` -Action {$global:udalost=$event} Get-Event Get-Event -SourceIdentifier procesy 20. 2. 2012 Patrik Malina 39 Novinky jazyka PSH 3.0 Implementace modulů Odkazování Automatické natahování $psmoduleautoloadingpreference = "all" Get-Process fox* foreach kill 20. 2. 2012 Patrik Malina 40
Novinky jazyka PSH 3.0 Joby rovnou jako plánované úlohy $trigger = New-JobTrigger Daily At 4am Register-ScheduledJob Name MyScheduledJob ScriptBlock { DoSomething } Trigger $trigger Get-ScheduledJob 20. 2. 2012 Patrik Malina 41 Novinky jazyka PSH 3.0 Přesměrování datových proudů Pipeline 1 Error 2 Warning 3 Verbose 4 Debug 5 3> 4>> 5>&1 6>&4 Get-Service 11111 2> error.txt Import-Module bitstransfer -Verbose 4>verbose.txt 20. 2. 2012 Patrik Malina 42
Zdroje informací PowerShellPack http://archive.msdn.microsoft.com/powershellpack Task Scheduler Managed Wrapper http://taskscheduler.codeplex.com/ Invoke-CmdScript.ps1 http://www.leeholmes.com/blog/2006/05/11/nothing-solves-ev 20. 2. 2012 Patrik Malina 43 Zdroje informací PowerShellPack http://archive.msdn.microsoft.com/powershellpack Task Scheduler Managed Wrapper http://taskscheduler.codeplex.com/ Invoke-CmdScript.ps1 http://www.leeholmes.com/blog/2006/05/11/nothing-solves-ev 20. 2. 2012 Patrik Malina 44
Zdroje informací Jak vyzrát na Windows PowerShell 2.0 http://knihy.cpress.cz/ knihy/pocitacovaliteratura/administrace /jak-vyzrat-na- windows-powershell- 2-0/ http://patrikmalina.cz 20. 2. 2012 Patrik Malina 45 Dotazy a diskuse 20. 2. 2012 Patrik Malina 46
Další informace Autor www.patrikmalina.eu Kontat it@patrikmalina.eu 20. 2. 2012 Patrik Malina 47