Praktikum 13 - Skriptimine Windowsis
Skriptimiseks nimetatakse kergesti käivitatava lühikese koodi programmeerimist, mille eesmärk on enamasti korduvate tegevuste automatiseerimine. Skriptimise kasu avaldub tihti alles siis, kui peate suurt kogust (üle 10) arvuteid üksinda haldama. Võtame lihtsa näite – ainuüksi TÜ Arvutiteaduse instituudis on umbes 500 statsionaarset arvutit + umbes 1000 sülearvutit ning kui IT-administraator tahaks teada, millist operatsioonisüsteemi nad kasutavad ja kas olemasoleva arvuti riistvara on sobiv uusima Windowsi versiooni paigaldamiseks, võtaks iga arvuti läbi käimine ja vajaliku informatsiooni üles tähendamine mitu kuud aega. Käesolevas ja järgnevas praktikumis näitame teile, kuidas antud ülesande lahendamist oluliselt kiirendada.
Eelmises praktikumis tutvusime Linuxi skriptidega. Varem oleme Windowsis pigem graafilist liidest kasutanud. Samas on ka Microsoft alates 2006. aastast oma skriptimise vahenditesse oluliselt investeerinud, mis on muutnud nende pakutava lahenduse tõsiseltvõetavamaks alternatiiviks graafilisele liidesele. Lähenemine on küll natuke teine kui Linuxi terminali puhul – meie jaoks võib-olla kõige olulisem on see, et Powershell kasutab tekstitöötluse asemel objekte. Kui need erinevused rohkem huvi pakuvad, siis näiteks siin lingi taga on üks suhteliselt vana (2007), aga huvitav võrdlusartikkel.
Nii mõnelegi teist on ilmselt tuttav must Command Prompt'i (CMD) ekraan, mis on mitmes mõttes juba vananenud, mistõttu keskendume oma lahendustes Powershelli kasutamisele. Selle praktikumi eesmärk on anda ülevaatlik sissejuhatus antud töövahendi eripäradesse ja kasutamisse.
Töövahendid
- Powershell (Lühend: PS)
- Powershell ISE (Lühend: PS ISE või lihtsalt ISE)
- Command Prompt (Lühend: cmd)
Ettevalmistavad tööd
- Avage Powershell tavakasutaja õigustes.
- Enne tööle asumist lugeda Urmas Tamm'e ja Alo Peets'i koostatud detailset
Powershelli
juhendit siit: Powershelli Ülevaade PDF.
Versioonid
Powershellist on kasutusel päris mitu versiooni. Windows 10-ga aastast 2016 tuleb kaasa versioon 5.1 Sama versioon 5.1.* on siiani kasutusel ka meie praktikumis kasutatavas Windows 11 virtuaalmasinas. Et kontrollida, milline täpne versioon on paigaldatud teie operatsioonisüsteemi, saate kasutada süsteemset objekti $PSVersionTable
. Sarnaselt objektidega tavalises programmeerimises on võimalik ka siin punkti (.
) abil vaadata konkreetse välja väärtust: ($PSVersionTable.[väljanimi]
).
Käsud
- Käskude nimekirja saamiseks on käsk
Get-Command
. Kui selle sisestate, näete, et nimekiri on pikk. Käskude nimed koosnevad üldiselt tegusõna-nimisõna-paaridest, mis viitavad vastavalt sellele, mida ja millega te teha saate. Et leida endale huvipakkuvaid käske, saab kasutada filtreid. - Näiteks võime välja filtreerida kõik käsud, mille tegevus on "get":
Get-Command -Verb Get
. Sarnaselt saame leida ka kõik süsteemsete teenustega seotud käsud:Get-Command -Noun Service
. - Juba varem õpitud man-käsu asemel saab siin abi saamiseks kasutada käsku
Get-Help
, mille argumendiks tuleb anda käsk, mille kohta abi tahetakse.- Näiteks uurime abiinfot käsu
Get-Process
kohta. Selgub, et selle käsu dokumentatsioon ei ole täielik. - Nüüd on meil kaks võimalust: kas kasutame lisaparameetrit
-Online
, mis viib meid vastava veebiallikani, või kasutame käskuUpdate-Help
, mis uuendab käskude dokumentatsiooni. Viimane käsk võtab esimest korda jooksutades tavaliselt omajagu aega ja koormab ketast, mistõttu jääme siin veebis oleva dokumentatsiooni juurde. - Uuri dokumentatsioonist, kuidas leida protsess, mille id on 0.
- Näiteks uurime abiinfot käsu
- Käivitame programmi
notepad
ja leiame dokumentatsiooni abiga käsu selle protsessi sulgemiseks. (Otsingu puhul võiks tegusõnana kasutadastop
i.)
Powershell ja skriptifailid
Kui soovime oma koostatud keerukamaid käske korduvalt kasutada, siis tasub neist (analoogiliselt Linuxiga) luua skriptifailid, mida saab ka hiljem kasutada.
- Liikuge PSi kasutades oma kodukataloogi.
- Loome sinna faili ja avame selle:
notepad tere_maailm.ps1
. - Faili sisu peaks olema alltoodud kujul. (Tasub märgata, et reavahetuse sümbol on tavapärasest erinev.)
Write-Host Write-Host 'Tere, maailm!' Write-Host "Kena päeva... `n"
- Käivitame skripti, kasutades käsku
.\tere_maailm.ps1
. - Kui faili käivitamine õnnestus, siis see tähendab, et te olete ka varem mingeid skriptifaile jooksutanud. Üldiselt tuleb see aga otseselt lubada. Tegu on vaikimisi turvaseadete osaga, et kasutaja kogemata oma arvutis pahatahtlikke skripte käivitada ei saaks.
- Käivitamise lubamiseks kasutame alljärgnevat süsteemi.
- Kõigepealt uurime, milline turvatase on hetkel süsteemis seatud:
Get-ExecutionPolicy
. - Märgime selle väärtuse omale üles, et saaks selle hiljem taastada. Et ei peaks selleks käsi klaviatuurilt tõstma, võime väärtuse lihtsalt faili suunata:
Get-ExecutionPolicy > execution_policy.txt
(käsu väljundi faili suunamine töötab samamoodi nagu Linuxis). - Sisestage käsk
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
. - Ka nüüd võiks selguda, et õiguste muutmistel tekkis probleem, kui te jooksutasite seda käsku tavakasutaja õigustes.
- Avage PS administraatori õigustes (paremklikk Powershelli ikoonil stardimenüüs ja käivitada administraatori õigustes).
- Jooksutage käsk ja sulgege admin-õigustes olev PSi aken.
- Kõigepealt uurime, milline turvatase on hetkel süsteemis seatud:
- Nüüd proovime uuesti oma skripti käivitada – seekord võiks see ilusasti õnnestuda.
Powershell ISE
Nagu nägime, siis võime skriptide loomiseks ka tavalist tekstiredaktorit kasutada ja käsud lihtsalt .ps1-laiendiga faili kirjutada. Pikemate skriptide loomisel on aga analoogiliselt programmeerimisega mugavam kasutada mõnda keskkonda, kus on võimalused nii kirjutamiseks kui kirjutatu testimiseks.
- PowerShell ISEt on kõige lihtsam avada järgnevate tegevustega:
- Liigume Windows-klahvi kasutades Start-menüüsse.
- Kirjutage "Powershell ISE".
- Kuvatud vastustest teeme parema kliki Powershell ISE peal ja valime "Run as Administrator".
- Avanenud tarkvaras valime menüüst
View -> "Show Script Pane"
. - Nüüd avame varem tehtud skripti:
File -> Open -> tere_maailm.ps1
. - Skripti jooksutamiseks kasutame rohelist noolekest.
Näide
Kogu Windowsi konfiguratsiooniinfole on võimalik juurde pääseda, kasutades WMI (Windows Management Instrumentation) liidest. WMI ei ole pelgalt informatsiooni pärimise liides, vaid selle abil on võimalik ka süsteemi konfiguratsiooni muuta. WMIle ligi pääsemiseks kasutame PowerShelli ja selles olevat käsku Get-WmiObject. Kõikide WMI klasside kuvamiseks kasutage käsku Get-WmiObject -list
(klasside nimekirja saab filtreerida, lisades käsu lõppu *märksõna*, näiteks Get-WmiObject -list *user* ). Konkreetse klassi tagastatavate andmete uurimiseks saab kasutada käsku Get-WmiObject -class Win32_klassinimi
näiteks Get-WmiObject Win32_NetworkAdapterConfiguration
. Kuna osad klassid ei tagasta vaikimisi kõiki võimalikke parameetreid, siis kõikide klassi parameetrite nägemiseks lisa käsu lõppu vastavalt vajadusele Powershelli käsklus select *
, Format-List *
või Format-Table *
. Andmete filtreerimiseks võib kasutada -Filter
-parameetrit. Näiteks võrrelge käske Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'"
ja Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'" | select *
.
Siin on näide vormindatud ja filtreeritud väljundiga käsust, mis kirjutab väljundi faili. Harjutamiseks on soovitatav eemaldada käsu lõpust järjest pipe
(toru, |
) ja vaadata kuidas väljund muutub.
Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'" | Select-Object PSComputername, Description, IPAddress, IPSubnet, DefaultIPGateway | Sort-Object DHCPEnabled | Format-List | Out-File -FilePath "C:\FailiNimi.txt" -Append
Iseseisev ülesanne
Tähelepanu! – Enne käesoleva töö juurde asumist tööta kindlasti tähelepanelikult läbi tööjuhendi juurde kuuluv PDF-dokument: Powershelli ülevaade.
Soovitatav on aluseks võtta alus.ps1 (eemalda faililaiend ".txt"). Siin Powershelli failis on realiseeritud tulemuse väljastamise funktsioon ning tehtud ka paar näidiskasutust. Soovi korral võite kõike muuta.
Koostage ja esitage skript, mis kirjutab testarvuti kohta järgneva info faili:
Masina nimi
(hostname),PowerShelli versioon
jaWindowsi versioon
- Võrgu konfiguratsioon (
IP-aadress
,võrgumask
(network mask),gateway
, kasDHCP on lubatud
jaMAC-aadress
(Vihje: vaata näidet juhendist) - Arvuti
protsessori
kirjeldus ja põhimäluRAM
kogus (leiab:Win32_ComputerSystem
) Graafikakaardi nimi
,draiveri versioon
,kuupäev
jaekraani lahutus
(märksõnaVideoController
)- Arvuti kõvaketaste informatsioon (
partitsioonitabel
,mitu GB on arvuti kettad mahutavuselt
, mitu GB vaba ruumi onC:
-kettal) - PCI-siinil olevate seadmete draiverite info (
kirjeldus
,tootja
javersioon
) (Vihje: vaata pikka PDF-juhendit, seal on näide olemas) - Arvutis olevad kasutajad (
nimi
,kirjeldus
, kas on lokaalne kasutaja (LocalAccount
) ja kas on keelatud (Disabled
)) Käimasolevate protsesside arv
10 viimasena käivitatud protsessi
(nimi
,PID
jakäivitamise aeg
(StartTime
)). Sorteerimise aluseks võtta parameeterStartTime
.- Arvuti
kuupäev
jakellaaeg
NB! Iga küsimuse vastus peaks olema töödeldud mõistlikule inimloetavale kujule ja info peab olema vastusest kergesti leitav. Kogu peaklassi või näiteks kogu käsu Get-Process
väljund küsimuse Käimasolevate protsesside arv
vastuseks ilma täiendava töötlemiseta (ridade arvu kokku lugemiseta) ei ole piisav.
Tulemus
Lahenduseks esitada Github/Gitlab-lehel Powershelli skripti väljundi fail ja aruande lehele kopeerige skript ning kirjeldage olulisemaid käske/käsu osasid skriptist. Moodle esitamise otselink: https://moodle.ut.ee/mod/assign/view.php?id=1224222