Programowanie Aplikacji Lokalnych.NET WMI
Co to jest WMI: Komponenty Windows które zapewniają ujednolicony interfejs do zarządzania danymi MSowa 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 Root\CimV2 Class Win32_Share Property Name, Path Method Delete Static Methot Create Event
Narzędzia WBEMTest WMITools.exe CIM Studio, Object browser, Event viewer, Event registration SAPIEN Technologies WMI Explorer WMIC WMIExplorer (PSH) WMI Extension for VS Języki skryptowe 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: wscript //h:wscript tryb commandline-owy: cscript //h:cscript
.NET vs WMI Namespace: System.Management.Instrumentation Instrumentation InstrumentedAttribute InstrumentationClassAttribute Instance BaseEvent DefaultManagementProjectInstaller, ManagementInstaller
Power Shell
Windows Management Framework * Windows Remote Management (WinRM) 2.0 * Windows PowerShell 2.0 * Background Intelligent Transfer Service (BITS) 4.0 włączony jako część releasu XP SP3, Server 2003 Sp2, Vista SP1 Windows 2008R2 Server, W7 MSSQL 2008
Power Shell interaktywne środowisko 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"
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-Aliasdir
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:.property.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: 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 variables: 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 Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 SystemDirectory : C:\WINDOWS\system32 Organization : PG BuildNumber : 2600 RegisteredUser : KM SerialNumber : Version :
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(" /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 –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 Linia Interpolacja (wymaga “) “tekst $tekst $(1+2)” Formatowanie jak w.Net “tekst {0} {1:0.00}” –f $t, 1/3
PSh – tablice Tablice można tworzyc przez przypisywanie elemetntów $a = 1,2,3,4 $a $a = 1..4 Pusta tablica $a = () Tablice są indeksowane od 0, $a[0] Operatory na tablicach -Contains, -NotContains $a –Contains 3
PSh – hashe Hashe można tworzyc przez przypisywanie elemetntów $hash $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)
PSh – wbudowane zmienne $true $false $null $pwd $Home $host $PID $PSVersionTable $_
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 $i = 3 while($i –le 6) { “`$i = $i” $i ++ } do { “`$i = $i” $i ++ } while($i –le 6)
PSh - for $i=0 for(; $f –le 3; $i++) { “`$i = $i” } for($i=0; $f –le 3; $i++) { “`$i = $i” } Dostępne są również: break, continue
PSh - foreach foreach($item in ) { “`$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”) { return $_ } Get-ChildItem | FilterExeFiles Brak składania wyniku, Zwracane są poszcze- gólne obiekty
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: 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