Thursday, December 23, 2010

Hei blogi lugejad

Oleksin väga tänulik kui teilt oleks võimalik saada tagasisidet minu postituste kohta. Kas see informatisoon mida ma olen pakkunud on teile olnud kasulik ja mis teile on kõige rohkem meeldinud. Oleks ka tore teada millistest teemadest te olete huvitatud ja kas käsitletud teemad on olnud liialt lihtsad või keerulised.

Tänud ette ja igasugune tagasiside on oodatud Smile

Kaido

Monday, December 20, 2010

PowerShell + GUI osa 4

Mis mulle PSi juures eriti hästi meeldib on see, et lihtsaks on tehtud graafilise liidese integreerimine. Selles postituses toon välja kaks võimalust mis moodi on võimalik GUI-d (Graphical User Interface) PSi jaoks joonistada. Selleks, et selles postituses toodud näidet kasutada, peate te eelnevalt läbi lugema need postitused: http://depshare.blogspot.com/2010/12/powershell-execution-policy-osa-1.html ja http://depshare.blogspot.com/2010/04/windows-remote-management-ja-event.html .

PrimalForms Community Edition

Sapien on teinud sellise toreda asja nagu PrimalForms ja seda võib täiesti tasuta kasutada (on ka tasuline variant). Selle leiate siit: http://www.primaltools.com/downloads/communitytools/ . Sellega on teil võimalus kogu GUI valmis joonistada ja PSis funktsioonid külge panna.

primal_forms1

Ühe lihtsa nupuga saate koodi PSi

primal_forms2

Peale seda näete juba seda

primal_forms3

Kõik vajalik eksporditakse PSi ja peale seda on vaja funktsioonid kirjutada mis kasutavad graafilise liidesest võetud infot ja vastavalt sellele tegutsevad edasi. Pole enam vajadust ise seda koodi täpselt välja mõelda.

Microsoft Visual Basic 2010 Express

Teine variant on kasutada Visual Basic 2010 Expressi ja seal valmis joonistada WPF Application ja seal oleva XAML koodi kopeerida PSi ja väikeste muudatustega on võimalik see graafiline liides kasutusele võtta. Kui teil nt on selline kood:

  1. <Window x:Class="MainWindow" 
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     Title="MainWindow" Height="350" Width="525"> 
  5.     <Grid> 
  6.         <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="62,63,0,0" Name="Button1" VerticalAlignment="Top" Width="75" /> 
  7.     </Grid> 
  8. </Window> 

Siis PSis on see vaja muuta selliseks.

  1. <Window 
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  4.     Title="MainWindow" Height="350" Width="525"> 
  5.     <Grid> 
  6.         <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="62,63,0,0" Name="Button1" VerticalAlignment="Top" Width="75" /> 
  7.     </Grid> 
  8. </Window> 

Näide „Teenused“

Tegin ühe lihtsa utiliidi nagu „Teenused“ millega on võimalik teenustele restarti, käima ja kinni panna. Selle utiliidi GUI joonistasin ma Visual Basicus. Seda utiliiti on teil võimalik mu SkyDrivest hiljem ka allalaadida.

teenused_1

teenused_2

Kõigepealt ma disainisin GUI valmis ja kopeerisin selle PS ISE-se. Selleks, et PS oskaks seda lugeda peab koodi muutma selliseks. Kasutan eelnevat näidet siin

  1. [void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')  
  2. [xml]$XAML = @'  
  3. <Window      
  4.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  5.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  6.     Title="MainWindow" Height="350" Width="525">  
  7.     <Grid>  
  8.         <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="62,63,0,0" Name="Button1" VerticalAlignment="Top" Width="75" />  
  9.     </Grid>  
  10. </Window>  
  11. '@  

Kui see on olemas on vaja lugeda seda $XAMLi

  1. #Loeme XMAL  
  2. $reader=(New-Object System.Xml.XmlNodeReader $xaml)   
  3. $Form=[Windows.Markup.XamlReader]::Load( $reader

Ja kui see lisada koodi lõppu ja PS kood käima lasta saame sellise pildi

  1. #Näitame Formi  
  2. $Form.ShowDialog() | out-null 

Visual

Selleks, et selle formi peal olevaid elemente kasutada nagu nt: nupud, tekstid jne peame me need otsima. „Teenuste“ utiliidis olen otsinud järgnevad elemendid, et neid oleks funktsioonides võimalik kasutada.

  1. #Leiame elemendid XAMList  
  2. $Connect = $form.FindName('Connect')  
  3. $Restart = $form.FindName('Restart')  
  4. $Stop = $form.FindName('Stop')  
  5. $Start = $form.FindName('Start')  
  6. $ListView1 = $form.FindName('ListView1')  
  7. $Computer = $form.FindName('Computer')  
  8. $Messages = $form.FindName('Messages'

Selles utiliidis kasutatakse kolme funktsiooni FillListView mis täidab tabeli, Pingi-Arvutit mis kontrollib kas arvuti on võrgus või mitte ja kolmandaks on nupu funktsioonid mis on põhiliselt sama sugused aga erinevused on kas Start, Stop või Restart.

Funktsioon FillListView

Kõigepealt olen defineeriud tühja jada mida pärast kasutame foreach käsus

  1. $script:emptyarray = New-Object System.Collections.ArrayList 

$strServices muutujas hoian arvuti teenused mida küsitakse Get-Service käsuga

  1. $strServices = Get-Service -ComputerName $strComputer 

ForEachi sees olen teinud ajutise objekti ja sellele olen määranud neli property ja ForEachi sees antakse neile väärtused ja salvestatakse tühja jadasse, et hiljem me saaksime neid kasutada

  1. foreach ($item in $strServices)  
  2.   {  
  3.       $tmpObject = Select-Object -InputObject "" IsChecked, Name, Status, DisplayName  
  4.       $tmpObject.IsChecked = $false 
  5.       $tmpObject.Name = $item.Name  
  6.       $tmpObject.Status = $item.Status  
  7.       $tmpObject.DisplayName = $item.DisplayName  
  8.       $script:emptyarray += $tmpObject 
  9.   } 

Viimases käsus näitame ette tabeli allika

  1. $ListView1.ItemsSource = $script:emptyarray 

Funktsioon Pingi-Arvutit

Selles funktsioonis kontrollime kas arvuti on võrgus või mitte. Kui väärtus on 0, siis arvuti on võrgus, kui väärtus on midagi muud, siis arvuti pole võgus

  1. Get-WmiObject -Class Win32_PingStatus -Filter "Address = '$strComputer'" 

Stop, Restart ja Stop funktsioon

Selles funktsioonis kõigepealt käime $script:emptyarray jada läbi ja kontrollime millised read meie tabelis on märgitud või mitte. Need read mis on märgitud käivitatakse järgmised käsud.

  1. $strService = $AddedItem.Name  
  2. #Laseme käsu käima teises arvutis  
  3. Invoke-Command -ComputerName $Computer.Text -ArgumentList $strService -ScriptBlock {param ($strService) Restart-Service $strService}  
  4. #teeme 3 sekundilise pausi  
  5. Start-Sleep 3  
  6. #Täidame uuesti tabeli  
  7. FillListView -strcomputer $Computer.Text 

Teenuste utiliidi leiate siit: http://cid-030bc1ea09f784f6.office.live.com/browse.aspx/.Public

Thursday, December 16, 2010

PowerShelli funktsiooni parameetrid osa 3

Jätkan eelmises osas pooleni jäänud PSi parameetritega.

Näide 1

Tegin uue funktsiooni nimega Arvuti-info

  1. Function Arvuti-info  
  2. {  
  3.     Param(  
  4.     [Parameter(Mandatory = $true)]  
  5.     [String[]]$computer=$env:computername 
  6.       
  7.     )  
  8.     Get-WmiObject -Class Win32_Bios -ComputerName $computer 
  9.  

Siia funktsiooni olen lisanud [Parameter(Mandatory = $true)] ja see tähendab, et parameeter $computer on kohustuslik ja PS konsoolis funktsiooni käivitades palutakse sisestada arvuti nimi.

arvuti_info1

Ja kui te muudate selle rea [String]$computer=$env:computername selliseks [String[]]$computer=$env:computername on teil võimalus sisestada nii palju arvuteid kui soovite.

arvuti_info2

Täitsa vägev Smile, just selle pärast mulle PS meeldibki, et asjad on tunduvalt lihtsamaks läinud.

arvuti_info3

Näide2
  1. Function Arvuti-info2  
  2. {  
  3.     Param(  
  4.     [Parameter(Mandatory = $true,HelpMessage="Sisesta arvuti nimi:")]  
  5.     [Alias("Arvuti")]  
  6.     [String]$computer=$env:computername 
  7.       
  8.     )  
  9.     Get-WmiObject -Class Win32_Bios -ComputerName $computer 
  10.  

Kasutades eelmist funktsiooni lisasin sellele kaks asja. Juurde lisasin HelpMessage="Sisesta arvuti nimi") ja [Alias("Arvuti")]. HelpMessage argument lisab parameetri juurde kirjelduse, et mida tuleks nt sisestada.

arvuti_info2

Kui te lisate ka parameetri juurde [Alias("Arvuti")] on teil võimalus seda funktsiooni käima lasta Arvuti-info2 –computer Localhost või Arvuti-info2 –arvuti Localhost ja mõlemat pidi saate sama tulemuse

arvuti_info2_2

Näide 3
  1. Function Arvuti-info3  
  2. {  
  3.     [CmdletBinding()]  
  4.     Param(  
  5.     [String]$computer=$env:computername 
  6.       
  7.     )  
  8.     Get-WmiObject -Class Win32_Bios -ComputerName $computer 
  9.  

Sellesse funktsiooni olen lisanud juurde [CmdletBinding()] ja mida see funktsioonile juurde annab on see, et kui te soovite funktsiooni käima lasta rohkemate parameetritega kui funktsioonis defineeritud on saate te veateate.

arvuti_info3

Ja kui te eemaldate selle [CmdletBinding()] funktsioonist on teil võimalus üleliigsete parameetritega funktsioon käima lasta.

arvuti_info3_2

Näide 4
  1. Function Sisestuse-Kontroll  
  2. {  
  3.  
  4.     [CmdletBinding()]  
  5.     Param(  
  6.     [ValidateRange(1,10)]  
  7.     [int]$arv 
  8.       
  9.     )  
  10.     $number = 0;  
  11.  
  12.     while ($number -lt $arv)  
  13.     {  
  14.           $number++  
  15.           Write-host "$number" 
  16.     }  
  17.  

Tegin uue funktsiooni nimega Sisestuse-Kontroll ja sellesse funktsiooni olen lisanud [ValidateRange(1,10)]. ValidateRange kontrollib kas sisestatud arv jääb ette antud vahemikku või mitte. Kui sisestatud number on suurem kui 1 ja väiksem kui 10 käivitab see While Loop käsu.

Sisestuse_kontroll

Ja kui te sisestate suurema numbri kui 10 saate te veateate

Sisestuse_kontroll2

Näide 5
  1. Function Sisestuse-Kontroll2  
  2. {  
  3.  
  4.   Param(  
  5.       [Parameter(Mandatory = $true,HelpMessage = "Sisesta IP aadress nt 192.168.1.2")]  
  6.       [ValidatePattern("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")]  
  7.       $IP 
  8.       )  
  9.     
  10.   Test-Connection $IP 

Sellesse funktsiooni olen sisse toonud [ValidatePattern("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")]. ValidatePattern kontrollib kas sisestatud tekst/arv vastab ette defineeritud nõutele. Enne kui selles funktsioonis Test-Connection käima lastakse kontrollitakse kas sisestatud IP aadress vastab nõuetel või mitte.

Sisestuse_kontroll3_1

Ja kui ei vasta tingimustele saate te veateate

Sisestuse_kontroll3_2

See oli siis väike ülevaade PSi funktsioonide parameetritest. Enne kui hakkate funktsioone kirjutama, siis uurige järgi kas on olemas sisseehitatud valideerimis lahendus, et te ei peaks ise neid kirjutama hakkama. Neid parameetrite valideerimisi on veelgi.

Nendes osades toodud parameetrite näited on minu Windows Live dokumentidest alla laetav.

http://cid-030bc1ea09f784f6.office.live.com/self.aspx/.Public/PowerShell

Wednesday, December 15, 2010

PowerShelli funktsiooni parameetrid osa 2

PSis on võimalik kolme moodi funktsiooni parameetreid defineerida ja võrreldes VBSiga on asi lihtsamaks läinud ja hulka võimekamaks. Nt: VBSis käib skripti parameetrite defineerimine nii:

  1. 'Defineerime argumendid scripti jaoks.  
  2. If WScript.Arguments.Named.Exists("File") Then iArgs = iArgs + 1  
  3.     If iArgs <> 1 Then 
  4.         WScript.Echo "Lase skript käima laiendiga /File nt: script.exe /Fail:c:\users\desktop\kasutaja\servers.txt" 
  5.         WScript.Quit  
  6.     End If 
  7. If WScript.Arguments.Named("File") <> "" Then 
  8.     TakeAction WScript.Arguments.Named("File")  

Vaatame esimest varianti mis moodi on võimalik PSis parameetreid määratleda.

  1. Function Liidame-numbrid($number1,$number2)  
  2. {  
  3.     $kokku = $number1 + $number2 
  4.     "Tulemus:" + $kokku 
  5. }  

Olen teinud funktsiooni nimega „Liidame-numbrid ja selle taha pannud sulgudesse $number1 ja $number2. $number1 ja $number2 on parameetrite nimed. Kui te funktsioone kirjutate, siis oleks hea kui te kasutate nimelisi parameetreid, et kood oleks ka teistel loetav ja saate hiljem ise ka aru milliseid väärtusi funktsioon kasutab. Kui PS konsoolis vastav funktsioon käima lasta Liidame-numbrid 30 40 saate tulemuseks 70.

Liidame_numbrid

Kui lasete sama funktsiooni käima Liidame-numbrid –number1 30 –number2 40, saate tulemuseks jälle 70.

Liidame_numbrid_2

Teine variant kuidas parameetreid määrata oleks funktsioon sellisena kirjutada.

  1. Function Liidame-numbrid2  
  2. {  
  3.     Param($number1,$number2 
  4.     )  
  5.     $kokku=$number1+$number2 
  6.     "Tulemus:" + $kokku 
  7. }  

Kui Liidame-numbrid2 funktsioon käima lasta sama moodi nagu eelminegi funktsioon, saame tulemuseks 70

Liidame_numbrid2

Liidame_numbrid2_2

Pärast tuleme selle funktsiooni juurde tagasi ja näitan miks just see variant on igati asjalik.

Kolmas variant kuidas parameetreid funktsioonis kasutada käib järgnevalt

  1. Function Liidame-numbrid3  
  2. {  
  3.     $kokku=$ARGS[0]+$ARGS[1]  
  4.     "Tulemus:" + $kokku 
  5.     "Argumendid on " + $ARGS 
  6. }  

Kui Liidame-numbrid3 funktsioon käima lasta saame tulemuseks ikka 70

Liidame_numbrid3

Kui te nt Liidame-numbrid3 funktsiooni lasete käima Liidame-numbrid3 30 40 50

Liidame_numbrid3_2

Saate tulemuseks jälle 70. Tulemuse 70 saate selle pärast, et liitmise valemis on kirjas $ARGS[0] mis on 30, $ARGS[1] on 40 ja $ARGS[2] on 50 ja seda pole valemisse kirjutatud.

 

Teeme asja veel keerulisemaks

PSi parameetrite väärtusi on võimalik ka ette defineerida, et kas teistel oleks arusaada mida tuleks parameetrite väärtusesse panna või teatud aja tagant peate ise mingit toimingut tegema ja vaike väärtused on vastvalt sellele paika pandud. Muutsin Liidame-Numbrid2 funktsiooni järgnevaks

Näide1
  1. Function Liidame-numbrid2  
  2. {  
  3.     Param(  
  4.     $number1 = 30,  
  5.     $number2 = 40  
  6.     )  
  7.     $kokku=$number1+$number2 
  8.     "Tulemus:" + $kokku 
  9. }  

Kui te selle funktsiooni käima lasete, saate te tulemuseks 70

Liidame_numbrid2_keerulisem

Aga kui te näiteks käivitate selle funktsiooni järgnevalt Liidame-numbrid2 50 60 saate tulemuseks 110

Liidame_numbrid2_keerulisem2

Vaike väärtusi kasutatakse alles, siis kui te funktsiooni käivitamisel ei kasuta ühtki parameetrit

Näide2

Muudame Liidame-numbrid2 järgnevaks

  1. Muudame Liidame-numbrid2 järgnevaks  
  2. Function Liidame-numbrid2  
  3. {  
  4.     Param(  
  5.     [int]$number1 = 30,  
  6.     [int]$number2 = 40,  
  7.     [String]$arvuti$env:computername 
  8.     )  
  9.     $kokku=$number1+$number2 
  10.     "Tulemus:" + $kokku 
  11.     Write-Host "Arvuti nimi on: "$arvuti 
  12. }  

Sellesse funktsiooni olen ma parameetri ette defineerinud andmetüübi, et $number1 ei saa olla nt: –number1 üks vaid peab olema arv. Kui te $number1 ja $number2 ette [int] andme tüüpi ei pane on võimalik see funktsioon käima lasta ja te saate järgmise tulemuse

Liidame_numbrid2_keerulisem3

Kui teie funktsioon eeldab numbreid ja parameetri tüüpi täpselt ei määratle ei tööta teie funktsioon korrektselt ja võib asju valesti teha. Kui teie $number1 ja $number2 parameetri ette on defineeritud [int] ja te proovite seda funtksiooni käima lasta, siis saate te veateate

Liidame_numbrid2_keerulisem4

Liidame_numbrid2_keerulisem5

$env:computername - tähendab lokaalse arvuti nime

Selleks korraks hetkel kõik ja järgmises osas jätkan funktsiooide parameetritega

Monday, December 13, 2010

PowerShell Execution Policy osa 1

Viimasel ajal pole oma blogisse midagi õieti jõudnud kirjutada kuna olen usinasti Powershelli õppinud ja kirjutanud liidest Configuration Managerile, et üles panna pakette, advertisemente ja lisada distribution pointe. Arvatavasti uue aasta alguses postitan oma blogisse selle ülesse.

Selleks, et oma arvutis powershelli koodi üldse jooksutada on vaja seadistada Powershell Script Execution Policy. PS Execution poliitikat on võimalik seadistada mitut moodi. Selles postituses toon välja kõik erinevad variandid.

Mis on PS Execution poliitika?
PS Execution poliitika on loodud selleks, et kaitsta kasutaja arvutit viiruste eest, et need ei käivitaks kasutaja arvutis erinevaid skripte ja vältida olukordi kus sa ise lased mingi asja valesti käima. Kui *.VBS faili võid lihtsalt käivitada vajutades faili peal, siis Powershelli skriptiga nii lihtsalt ei lähe. Vaikimisi ei lubata käima lasta ühtki PSi faili ja kui proovid avada PS skripti, siis avatakse see Notepadis. Endalgi on juhtnud, et kogematta VBSi käima lasknud ja skript on alustanud mingit toimingut. Minule igatahes meeldib, see sisseehitatud turvalisuse element. Kui ma lugesin Microsofti PowerShelli Best Practice raamatut, siis seal öeldakse PS Execution poliitika kohta, et see ei ole turvalisuse element vaid mugavuse. Lisaks mainiti ka, et see poliitika on loodud selleks, et tõsta teadlikkust kuidas PSi skripte käivitatakse. Siit tekib aga küsimus, et mis mõttes mugavuse element?
Vaikimisi on arvutis PS Execution poliitika RESTRICTED. Kokku on viis erinevat poliitikat:

RESTRICED
· Default script execution policy
· Runs commands interactively from the Windows PowerShell Console
· Pipiline commands permitted
· Creating Functions in the Windows PowerShell Console permitted
· Use of script blocks in commands allowed
· All files with the extension of (*.ps1) are blocked from executing, including all six of the various Windows PowerShell profiles
· Modules are blocked (*.psm1file extension)
· Windows PowerShell Configuration files are blocked (*.ps1xml)
ALLSIGNED
· Scripts, profiles, modules, and configuration files run when signed by trusted publisher
· Requires all scripts to be signed, including scripts written on local computer
· Prompts before running scripts signed by publishers that are not trusted
· Prompts before running scripts from trusted publishers the first time the script is run
REMOTESIGNED
· Local scripts, profiles, modules, and configuration files run when not signed
· Scripts received from the internet zone must be signed by a trusted publisher prior to running
· Prompts before running scripts downloaded from the internet zone from trusted publishers
UNRESTRICED
· All unsigned scripts, profiles, modules, and configuration files run when not signed
· Prompts before running scripts received from the internet zone
BYPASS
· Nothing is blocked and no warning prompts
Kui te avate PS konsooli ja proovite *.ps1 faili käivitada saate te sellise veateate:
error_1
Veateate saate selle pärast, et alguses on Execution poliitika RESTRICTED. Pärast tulen selle juurde tagasi kuidas me saame selle faili käima lasta.
Interneti tsoonid
PSi Execution poliitika tugineb Internet Exploreri tsoonidel. Nt kui te laete alla skripti internetist lisatakse sellele külge märge, et fail on internetist. Selleks, et seda märget näha tuleb kasutada sellist utiliiti nagu Streams.exe. Seda on võimalik laadida siit: http://technet.microsoft.com/en-us/sysinternals/bb897440. Streams.exe tuleb käima lasta argumendiga –S nt: Streams.exe –s C:\Scripts ja peale seda peaksite nägema midagi taolist:
stream
Selleks, et eemaldada see märge tuleb Streams.exe käima lasta –D nt: Streams.exe –d c:\scripts\ script.ps1
Kui see märge faili küljest ära kustutada, siis arvuti arvab, et see fail pärineb sellest arvutist.
stream_delete
Execution poliitika seadistamise variandid
 

1. Otse registrist

PSi execution poliitika seadistus asub registris [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
PS_registri

2. Läbi PS konsooli

Selleks, et execution poliitikat läbi PS konsooli seadistada tuleb PS konsool käima lasta „Run As Administrator“. Käsk mida sisestada tuleb on Set-ExecutionPolicy nt: Set-ExecutionPolicy 1.
0 - Unrestricted
1 - RemoteSigned
2 – AllSigned
3 – Restricted
4 – Bypass
Set-Execution

3. Läbi Logon skripti

Tehke üks VBS fail ja käsk mida sinna sisestada võite nt:
Set WshShell = CreateObject(“Wscript.Shell“)
WshShell.Run(„PowerShell.exe –NoInteractive –command &{Set-ExecutionPolicy RemoteSigned}“)
 

4. Läbi grupi poliitika

Kui teil on AD DS domeen, siis oleks seda kõige õigem läbi grupipoliitika teha. Poliitika mida seadistama peate on Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell ja sealt Turn on Script Execution (See käib Server 2008 R2 kohta)



















Selleks korraks hetkel kõik. Järgmises osas räägin PowerShelli argumentidest.