Programowanie Aplikacji Lokalnych .NET WMI
Co to jest WMI: Komponenty Windows które zapewniają ujednolicony interfejs do zarządzania danymi MS-owa implementacja Desktop Management Task Force's Web Based Enterprise Management
Powody użycia WMI: Działa zdalnie i lokalnie Łatwy ujednolicony interfejs Dostępny z PSH i jezykow skryptowych Monitorowanie stanu systemu i aplikacji Zarządzanie i konfiguracja aplikacji Ujednolicony dostęp do danych i operacji na nich Automatyzacja lokalnych i zdalnych operacji administracyjnych
Hierarchia: Namespace Class Property Method Static Methot Event Root\CimV2 Class Win32_Share Property Name, Path Method Delete Static Methot Create Event
Narzędzia WMI Explorer WBEMTest Starsze: WMITools.exe VS WMIC CIM Studio, Object browser, Event viewer, Event registration VS WMIC Języki skryptowe Js/VB Powershell Scriptomatic2.exe
Windows Management Instrumentation
WMI przykład skryptu w JS var ServiceSet = GetObject( "winmgmts:{impersonationLevel=impersonate}"). InstancesOf("Win32_Service"); for (e = new Enumerator(ServiceSet); !e.atEnd(); e.moveNext()) { WScript.Echo( e.item().Description ); }
WMI przykład skryptu w VB Set ServiceSet = GetObject( "winmgmts:{impersonationLevel=impersonate}"). InstancesOf("Win32_Service") for each Service in ServiceSet WScript.Echo Service.Description Next
WMI tryb pracy tryb okienkowy: tryb commandline-owy: wscript //h:wscript tryb commandline-owy: cscript //h:cscript
.NET vs WMI Namespace: System.Management.Instrumentation InstrumentedAttribute InstrumentationClassAttribute Instance BaseEvent DefaultManagementProjectInstaller, ManagementInstaller
Power Shell
włączony jako część releasu XP SP3, Server 2003 Sp2, Vista SP1 Windows 2008R2 Server, W7 MSSQL 2008 PowerShell v. 1 -> November 2006 PowerShell v. 5 -> December 2015
Power Shell interaktywne środowisko PowerShell, PowerShell ISE możliwość hostowania w aplikacji Rozszerzalny system typów, możliwość korzystania z .NET, COM, WMI możliwość operwania na obiektach i napisach, zunifikowane formatowanie, przekierowywanie wyników definiowanie własnych funkcji, aliasów możliwość utrwalenia środowiska - za pośrednictwem profilu
PSh - Podstawowe koncepcje cmdlet : Get-, Set-, Out-, Start-, Stop-, Restart-, Add- ... Help, Command, Service, Computer, ChildItems ... get-service get-service –name *sched* get-service *sched* get-service *sched* | format-table get-service *sched* | format-list Name : Schedule DisplayName : Task Scheduler Status : Running DependentServices : {} ServicesDependedOn : {RpcSs} CanPauseAndContinue : True CanShutdown : True CanStop : True ServiceType : Win32ShareProcess, InteractiveProcess
PSh - dokumentacja get-command –verb "get" get-command –noun "service„ help execution Get-help about_Execution_Policies
PSh - dokumentacja get-help get-help get-service get-help get-service –detailed get-help get-service –parameter *excl* get-help get-service –examples get-help about_assignment_operators get-help about* Get-ChildItem ? Get-Command -Name Get-ChildItem -Syntax
PSh - dokumentacja get-service *sched* | get-member TypeName: System.ServiceProcess.ServiceController Name MemberType Definition ---- ---------- ---------- Name AliasProperty Name = ServiceName add_Disposed Method System.Void add_Disposed(EventHandle... Close Method System.Void Close() Continue Method System.Void Continue() CreateObjRef Method System.Runtime.Remoting.ObjRef Creat... ...
PSh – ALIASY Alias może dotyczyć: polecenia, funkcji, atrybutu, instrukcji Np.: dir, pwd get-help, man, help get-alias get-alias | where-object {$_.definition -eq "set-location"} CommandType Name Definition ----------- ---- ---------- Alias ac Add-Content Alias asnp Add-PSSnapin Alias clc Clear-Content Alias cli Clear-Item Alias clp Clear-ItemProperty Alias clv Clear-Variable Alias cpi Copy-Item ... CommandType Name Definition ----------- ---- ---------- Alias sl Set-Location Alias cd Set-Location Alias chdir Set-Location
PSh – Modyfikowanie aliasów Dodawanie: set-alias gh get-help set-alias np c:\windows\notepad.exe Usuwanie: remove-item alias:ls Alias nie obejmuje parametrów – mozna jednak zdefiniować własną funkcję: function bootini {notepad c:\boot.ini} Sprawdzenie aliasu Get-Alias dir
PSh - formatowanie format-list [property pattern] format-table [property pattern] [-GroupBy attribute] format-custom format-wide get-service *sched* | format-table -property *name* Name DisplayName MachineName ServiceName ---- ----------- ----------- ----------- Schedule Task Scheduler . Schedule
PSh – odwołania do obiektów własności i funkcje: <obiekt>.property <obiekt>.function() (get-service sched*).Stop() Zmienne: $zm = (get-service sched*) $zm.Start() $zm.Stop() WMI: get-wmiobject win32_bios -computername server01
PSh – przekierowywanie polecenie > plik | more Out-File -FilePath my_file Out-Null Out-Printer
PSh – polecenia cmdlety get-command zewnętrzne: zabezpieczenia: c:\test.ps1 dir c:\ | format-table -property name,creationtime notepad.exe zabezpieczenia: polityka uruchamiania: Get-Executionpolicy Set-ExecutionPolicy Unrestricted podpis cyfrowy: get-help about_signing
PSh – polecenia Dostępne moduły Get-PSSnapin Get-PSSnapin –Registered Załadowanie modułów Add-PSSnapin Sql*
PSh – profil test istnienia profilu: test-path $profile tworzenie profilu użytkownika: new-item -path $profile -itemtype file -force user\My Documents\WindowsPowerShell\Microsoft. PowerShell_profile.ps1 edycja: notepad $profile alias do edycji: function pro { notepad $profile }
PSh – profile profil dla wszystkich użytkowników i shell-i: %windir%\system32\WindowsPowerShell\v1.0\profile.ps1 profil dla wszystkich użytkowników powerShella: %windir%\system32\WindowsPowerShell\v1.0\ Microsoft.PowerShell_profile.ps1 profil dla wszystkich shell-i bieżącego użytkownika %UserProfile%\My Documents\WindowsPowerShell\profile.ps1 profil dla MS Power Shell i bieżącego użytkownika %UserProfile%\\My Documents\WindowsPowerShell\ Microsoft.PowerShell_profile.ps1
PSh – drives get-psdrive Name Provider Root ---- -------- ---- A FileSystem A:\ Alias Alias C FileSystem C:\ cert Certificate \ D FileSystem D:\ E FileSystem E:\ Env Environment F FileSystem F:\ Function Function G FileSystem G:\ HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE S FileSystem S:\ Variable Variable
PSh – drives dir c: Get-ChildItem d: Get-ChildItem function: dir variable: New-PSDrive -Name Office –PSProvider FileSystem -Root "C:\Program Files\Microsoft Office\OFFICE11”
PSh – operacje na elementach Get-ChildItem -Path C:\Windows\*.dll –Recurse -Exclude [a-y]*.dll New-Item -Path c:\temp\New.Directory -ItemType Directory Remove-Item C:\New.Directory Rename-Item –Path C:\temp\New.Directory\ file1.txt fileOne.txt Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru
PSh vs WMI Lista klas WMI: Get-WmiObject -List Get-WmiObject -List -ComputerName 192.168.1.29 Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 SystemDirectory : C:\WINDOWS\system32 Organization : PG BuildNumber : 2600 RegisteredUser : KM SerialNumber : 55274-015-0779426-22987 Version : 5.1.2600
Wszystkie commandlety WMI Get-WmiObject Invoke-WmiMethod Remove-WmiObject Register-WmiEvent Set-WmiInstanc Wmi to obiekty COM zawiniete we wrapery .Net System.Management.ManagementObject System.Management.ManagementClass System.Management.ManagementObjectsearcher
PSh vs .NET New-Object –TypeName System.Diagnostics.EventLog New-Object –TypeName System.Diagnostics. EventLog –ArgumentList Application $AppLog = New-Object –TypeName System.Diagnostics.EventLog –ArgumentList Application $AppLog.Clear()
PSh vs .COM $WshShell = New-Object –ComObject WScript.Shell $lnk = $WshShell.CreateShortcut ("$Home\Desktop\PSHome.lnk") $lnk.TargetPath = $PSHome $lnk.Save() $ie = New-Object -ComObject InternetExplorer.Application $ie.Visible = $true $ie.Navigate("http://www.microsoft.com /technet/scriptcenter/default.mspx") $ie.Document.Body.InnerText | more $ie.Quit()
PSh vs. static statyczna klasa - System.Environment [System.Environment] | Get-Member [System.Environment] | Get-Member –Static [System.Environment]::Commandline [System.Math]::Sqrt(9)
PSh - filtrowanie FilterScript: 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3} 1 2 operatory: -eq, -ne, -lt, -le, -gt, -ge, -like, -notlike, -contains, -notcontains Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}
PSh – zmienne Deklaracja: $a = “abc” Typy dotnetowe. $a.GetType() Nie maja stałego typu $a = 5 Można wymusić typ przy deklaracji [System.Int32]$i = 5 .Net – oznacza pełny zestaw możliwości np:. “to text”.ToUpper().Contains(“TE”) Wypisywanie na konsole. $t Write-Host “t:’ $t
PSh – zmienne Operatory -lt, -gt, -eq, -le, -ge, -ne -Like, -NotLike, -Match, -NotMatch “abcde” -Like “a*e” “abcde” -Like “a*[b-d]e” Konwersja (prawy typ jest konwertowany do lewego) “042” –eq 42 42 –eq “042”
PSh – zmienne Operacje wykonywane na wybranych obiektach: Get-Command -Noun Variable | Format-Table -Property Name,Definition -AutoSize -Wrap Clear-Variable Get-Variable New-Variable Remove-Variable Set-Variable Np.: $w = 3 New-Variable –Name “w” –Value 3 Czyszczenie wszystkich zmiennych: Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
PSh – napisy ‘ i “ można zagnieżdzać ”to ’tekst’” Działa teź podwójne użycie ’to ’’tekst’’’ Escapowanie znaków przez prawy apostrof ` ’pierwsza linia`ndruga linia’ Długie teksty @”linia Linia Linia”@ Interpolacja (wymaga “) “tekst $tekst $(1+2)” Formatowanie jak w .Net “tekst {0} {1:0.00}” –f $t, 1/3
PSh – tablice Pusta tablica Tablice są indeksowane od 0, Tablice można tworzyc przez przypisywanie elemetntów $a = 1,2,3,4 $a = @(1,2,3,4) $a = 1..4 Pusta tablica $a = () Tablice są indeksowane od 0, $a[0] Operatory na tablicach -Contains, -NotContains $a –Contains 3
PSh – hashe Składnia “obiektowa” Inne Hashe można tworzyc przez przypisywanie elemetntów $hash = @{"key1"=1;"key2"="value"} $hash[“key3”] = 114 Składnia “obiektowa” $k = "key4" | $hash."key3" $hash.$k | $hash.$($k) $hash.$("key"+"3") Inne $hash.Remove("key3") $hash.Contains("key3")|$hash -Contains("key3") $hash.ContainsValue(114) $hash.“key3” = 114
PSh – wbudowane zmienne $true $false $null $pwd $Home $host $PID $PSVersionTable $_ $hash.“key3” = 114
PSh – środowisko cmd.exe listowanie: Get-ChildItem env: $env:SystemRoot
PSh - warunek Clear-Host $test = “abc” if($test –eq “abc”) { “if active” } else “else active”
PSh - switch Clear-Host $test = "abc" switch($test) { "a" { "result a" } 12 { "result 12" } "12" { "result 12" } "abc" { "result abc" } default { "default" } } Uwaga: 12 zostanie znalezione 2x, aby temu zapobiec należy zastosować { "result 12"; break }
PSh - switch Switch można wykonać dla kolekcji switch("abc",12,"a",7) { "a" { "result a" } 12 { "result 12" } "12" { "result 12" } "abc" { "result abc" } default { "default" } } porownania są domyślnie case insensitive switch –casesensitive("abc") { } switch –wildcards("abc") { }
PSh - while, do while, do until while($i –le 6) { "`$i = $i" $i ++ } do } while($i –le 6)
PSh - for $i=0 for(; $f –le 3; $i++) { "`$i = $i" } for($i=0; $f –le 3; $i++) Dostępne są również: break, continue
PSh - foreach foreach($item in 11..13) { “`$item = $item” } Set-Location "e:\" foreach($file in Get-ChildItem) if ($file.Name –like "*.exe"){ $file.Name
PSh - bloki Definicja { Clear-Host; "hello from block" } $b = { Clear-Host; "hello from block" } uruchomienie & { Clear-Host; "hello from block" } & $b Odbiór wartości $b = { 1+5 } $w = 3 + & $b
PSh - bloki Przekazanie parametrów & { $args[0]+$args[1] } 2 7 & { param($p1,$p2); $p1+$p2 } 2 7 Parametry nazwane & { param($p1,$p2); $p1+$p2 } –p1 2 –p2 7 Weryfikacja czy podano parametr if (!$p1) Domyślne wartości param($p1,$p2=7) Silne typowanie param([int]$p1,[int]$p2=7)
PSh – bloki + potoki $filterFiles = { begin { $ret = “result:” } process { if ($_.Name –like “*.exe”) { $ret = $ret + “`t” + $_.Name +”`r`n” } } end { return $ret } Get-ChildItem | &filterFiles
PSh – bloki + potoki + parametry $filterFiles = { param ($mask) begin { $ret = “result:” } process { if ($_.Name –like $mask) { $ret = $ret + “`t” + $_.Name +”`r`n” } } end { return $ret } Get-ChildItem | &filterFiles “*.exe”
PSh – zasięg zmiennych Zmienne zdefiniowane w bloku slokalne Zmienne są przesłaniane, ale można się dostać do przesłoniętych przez Get/Set-Variable z parametrem -scope $v = 10 &{ $v = 5 Write-Host “inside $v” Write-Host “same “ (Get-Variable v –valueOnly -scope 0) Write-Host “parent “ (Get-Variable v –valueOnly -scope 1) } Write-Host “outside $v”
PSh – Funkcje Funkcja to blok z nazwi parametrami w nagłówku function TestMask ($name, $mask) { if ($name –like $mask) Write-Host “$name matches $mask” } TestMask “abc” “a??”
PSh – Funkcje + potoki Function FilterFiles ($mask) { begin { $ret = “result:” } process { if ($_.Name –like $mask) { $ret = $ret + “`t” + $_.Name +”`r`n” } } end { return $ret } Get-ChildItem | FilterFiles “*.exe”
PSh – Funkcje + parametry ref Function TestRef([ref] $var) { $var.Value = 100 } $v = 5 TestRef ([ref] $v) $v
PSh – Filtry Function FilterExeFiles() { if ($_.Name –like “*.exe”) { Brak składania wyniku, Zwracane są poszcze- gólne obiekty Function FilterExeFiles() { if ($_.Name –like “*.exe”) { return $_ } Get-ChildItem | FilterExeFiles
PSh - filtrowanie cd Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName Operatory: -and, -or, -not, !
PSh - teksty 7: Split The split operator splits a text string based on a character you designate. For example, suppose that you want to break a sentence into an array consisting of each individual word in the sentence. You could do so by using a command like this one: "This is a test" -split " " The result would look like this: This is a test 8: Join Just as split can split a text string into multiple pieces, the join operator can combine multiple blocks of text into one. For example, this line will create a text string consisting of my first name and last name: "Brien","Posey" -join " " The space between the quotation marks at the end of the command tells Windows to insert a space between the two text strings.
PSh – przetwarzanie obiektów Operacje wykonywane na wybranych obiektach: Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0} Sortowanie: Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name -Descending | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap
PSh – przykłady listowanie: zamykanie procesów o określonych nazwach: Get-Process -Id 99 Get-Process -Name explore Get-Process –Name ex* Get-Process -Name exp*,power*,NotAProcess zamykanie procesów o określonych nazwach: Stop-Process -Name t*,e* -Confirm zamykanie nieodpowiadajacych procesów: Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process zamykanie procesów z innej sesji: Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process zamykanie innych PSh: Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process –PassThru
PSh – przykłady Powolne scrollowanie: function EasyView { process { $_; Start-Sleep -seconds 0.6} } Get-ChildItem | EasyView Listowanie urezadzen usb (via WMI) gwmi Win32_USBControllerDevice -computername localhost |fl Antecedent,Dependen
Hostowanie Power Shell-a
PSh – linki https://msdn.microsoft.com/en-us/powershell/mt173057.aspx https://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx http://technet.microsoft.com/en-us/scriptcenter/ee861518.aspx https://www.powershellgallery.com/ http://powershell.com/cs/ BLOGI: http://blogs.technet.com/b/heyscriptingguy/ https://blogs.msdn.microsoft.com/powershell/ NARZEDZIA: http://social.technet.microsoft.com/wiki/contents/articles/2969.windows-powershell-ise-add-on-tools.aspx http://www.powergui.org/index.jspa http://www.idera.com/Free-Tools/PowerShell-Plus/