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 powershell.exe powershell.exe
/? -Command -File -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
1.0
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 $arg2 $arg3 $arg4 $arg5
= = = = =
"-i:EVT" "-fullText:OFF" "-o:CSV" "-tabs:OFF" "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 Error Warning Verbose Debug
1 2 3 4 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-everything-%E2%80%93-p
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-everything-%E2%80%93-p
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-nawindows-powershell2-0/ http://patrikmalina.cz
20. 2. 2012
Patrik Malina
45
Patrik Malina
46
Dotazy … a diskuse
20. 2. 2012
Další informace
Autor www.patrikmalina.eu
Kontat
[email protected]
20. 2. 2012
Patrik Malina
47