Windowsissa ja PowerShellissä on sisäänrakennetut tietoturvaominaisuudet ja oletusasetukset, joiden tarkoituksena on estää loppukäyttäjiä vahingossa käynnistämästä komentosarjoja päivittäisten toimintojensa aikana. Kuitenkin, jos jokapäiväisessä toiminnassasi käytetään rutiininomaisesti oman PowerShell-skriptien kirjoittamista ja suorittamista, tämä voi olla enemmän haittaa kuin hyötyä. Seuraavassa kerromme, miten näitä ominaisuuksia voidaan käsitellä vaarantamatta täysin turvallisuutta.
PowerShell on tehokkaasti komentojohto ja komentosarjakieli, joka on tarkoitettu korvaamaan CMD- ja sarjaskriptit Windows-järjestelmissä. Sellaisena PowerShell-skripti voi olla melko paljon konfiguroitu tekemään mitä tahansa manuaalisesti komentoriviltä. Tämä tarkoittaa käytännössä mahdollisten mahdollisten muutosten tekemistä järjestelmässäsi aina käyttäjän tilillesi asetettuihin rajoituksiin asti. Joten, jos voisit vain kaksoisnapsauttaa PowerShell-skriptiä ja käyttää sitä täysiä järjestelmänvalvojan oikeuksia, yksinkertainen yksinkertainen linja-auto voisi todella vahingoittaa päiväsi:
Get-ChildItem "$ env: SystemDrive \" -Recurse -ErrorAction SilentlyContinue | Poista-kohde -Force -Recurse -ErrorAction SilentlyContinue
ÄLÄ suorita yllä olevaa komentoa!
Se yksinkertaisesti menee tiedostojärjestelmän läpi ja poistaa mitä tahansa. Mielenkiintoista, tämä ei välttämättä tee järjestelmää käyttökelvottomaksi niin nopeasti kuin luulisi - vaikka sitä ajettaisiin korotetusta istunnosta. Mutta jos joku soittaa sinut tämän scriptin suorittamisen jälkeen, koska he eivät yhtäkkiä löydä tiedostojaan tai suorittavat joitain ohjelmia, "sammuttaminen ja uudelleen käynnistäminen" luultavasti johtaa heidät Windowsin käynnistyskorjaukseen, jossa heille kerrotaan, että heillä on mitään, mitä voidaan tehdä ongelman korjaamiseksi. Mikä voisi olla huonompi, sen sijaan, että saisi käsikirjoituksen, joka vain kerääntyy tiedostojärjestelmäänsä, ystäväsi saatetaan joutua käyttämään sellaista, joka lataa ja asentaa keiloggerin tai etäkäyttöpalvelun. Sitten sen sijaan, että kysytte Startup Repairista, he saattavat päätyä pyytämään poliisin kysymyksiä pankkien petoksista!
Nyt on selvää, miksi tietyt asiat ovat tarpeen loppukäyttäjien suojelemiseksi itseltään, niin sanotusti. Mutta sähkön käyttäjät, järjestelmänvalvojat ja muut geeksit ovat yleisesti (vaikkakin poikkeuksia lukuun ottamatta) hieman varovaisempia näistä uhkista, tietäen, miten he voivat löytää ja helposti välttää heitä, ja haluavat vain päästä tekemään työnsä. Tätä varten heidän on joko poistettava käytöstä tai kehitettävä muutama tieverkko:
Nämä samat ongelmat tuodaan esiin Erätiedoston käyttäminen PowerShell-komentojonojen helppokäyttöisempiä suorittamista varten, jossa käymme läpi komentojonotiedoston, jotta voimme tilapäisesti kiertää niitä. Nyt aiomme näyttää, kuinka järjestelmäsi asetetaan pitkäaikaisemmalle ratkaisulle. Muista, että näitä muutoksia ei yleensä pitäisi tehdä järjestelmissä, joita ei käytä yksinomaan - muuten lisäämällä muita käyttäjiä suuremman vaaran joutua samaan ongelmaan, jonka näiden ominaisuuksien on tarkoitus estää.
Ensimmäinen ja ehkä kaikkein kiusallinen kiertäminen on oletusyhdistys .PS1-tiedostoille. Näiden tiedostojen yhdistäminen mihinkään muuhun kuin PowerShell.exe-versioon on järkevää estää epätoivottavien skriptien tapahtuvan vahingossa. Mutta kun otetaan huomioon, että PowerShellillä on integroitu komentosympäristö (ISE), joka on erityisesti suunniteltu PowerShell-skriptien muokkaamiseen, miksi haluaisimme avata .PS1-tiedostot Notepadissa oletuksena? Vaikka et olisikaan valmis siirtymään kokonaan kaksoisnapsauttamalla toimintoihin, luultavasti haluat säätää näitä asetuksia.
Voit muuttaa .PS1-tiedostoyhdistelmää haluamaasi ohjelmaan oletusohjelmien ohjauspaneelilla, mutta kaivaminen suoraan rekisteriin antaa sinulle hieman paremman hallinnan kuin tiedostot avataan. Tämän avulla voit myös asettaa tai muuttaa muita vaihtoehtoja, jotka ovat käytettävissä .PS1-tiedostojen pikavalikossa. Älä unohda tehdä varmuuskopiota rekisteristä ennen kuin teet tämän!
Rekisteriasetukset, jotka ohjaavat PowerShell-komentosarjoja, avautuvat seuraavaan sijaintiin:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
Näiden asetusten tutkiminen ennen niiden muuttamista on tarkasteltava kyseisen avaimen ja sen alaavainten kanssa Regedit-ohjelmalla. Shell-avaimella pitäisi olla vain yksi arvo, "(Oletus)", joka on asetettu "Avaa".Tämä on oletustoiminnon osoitin, jos haluat kaksoisnapsauttamalla tiedostoa, jonka näemme alatyypillä.
Laajenna Shell-näppäin ja näet kolme aliavainta. Kukin näistä edustaa toimintaa, jota voit tehdä, joka on erityinen PowerShell-komentosarjoille.
Voit laajentaa jokaista avainta, jotta voit tutkia arvot, mutta ne pohjimmiltaan vastaavat seuraavia oletusasetuksia:
Jos haluat pitää kiinni jo valmiiksi valmistetuista komentojonoista, voit muuttaa Shell-näppäimen "(oletus)" -arvoa vastaamaan avaimen nimeä, joka vastaa sitä, mitä haluat tehdä kaksoisnapsautuksella. Tämä voidaan helposti tehdä Regedit-ohjelmasta tai voit käyttää opetusohjelmasta saatuja kokemuksia rekisterin etsimisestä PowerShellillä (sekä pienen PSDrive-nipistämisen) aloittaaksesi uudelleenkäytettävän komentosarjan rakentamisen, joka voi määrittää järjestelmät sinulle. Alla olevat komennot on suoritettava korotetusta PowerShell-istunnosta, samanlainen kuin käynnissä oleva CMD kuin ylläpitäjä.
Ensin sinun on määritettävä PSDrive HKEY_CLASSES_ROOT, koska sitä ei ole määritetty oletuksena. Komento on:
Uusi-PSDrive HKCR-rekisteri HKEY_CLASSES_ROOT
Nyt voit navigoida ja muokata rekisteriavaimia ja arvoja HKEY_CLASSES_ROOT-muodossa samalla tavoin kuin tavallisissa HKCU- ja HKLM PSDrives -ohjelmissa.
Jos haluat määrittää kaksoisnapsauttamalla PowerShell-komentosarjoja suoraan:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(oletus)' 0
Jos haluat määrittää kaksoisnapsauttamalla PowerShell-komentosarjoja PowerShell ISE: ssä:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Oletus) "Muokkaa"
Oletusarvon palauttaminen (kaksoisnapsauttamalla PowerShell-komentosarjoja Muistiossa):
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Oletus) "Avaa"
Tämä on vain perusasetusten muuttaminen oletusarvoisen kaksoisnapsautuksen avulla. Käymme yksityiskohtaisemmin räätälöimällä, miten PowerShell-komentosarjoja käsitellään, kun ne avautuvat PowerShellissä Resurssienhallinnasta seuraavassa osiossa. Muista, että rajaus estää PSDrivien pysyvän koko istuntojen välillä. Joten luultavasti haluat sisällyttää New-PSDrive-rivin minkä tahansa määrittämääsi määrityskriptin alkuun tätä varten tai lisätä sen PowerShell-profiiliisi. Muuten sinun on suoritettava tämä bitti manuaalisesti ennen kuin yrität tehdä muutoksia tällä tavalla.
PowerShellin ExecutionPolicy on toinen suojakerros vahingollisten komentosarjojen suorittamisesta. Tässä on useita vaihtoehtoja ja pari eri tapaa, jolla se voidaan asettaa. Useimmista vähiten turvallisiin, käytettävissä olevat vaihtoehdot ovat:
Kuten määritelmä ei määritellyt, edellä mainitut toimintatavat voidaan asettaa yhdeksi tai useammaksi useammasta alueesta. Voit käyttää Get-ExecutionPolicy -ohjelmaa, jossa -List-parametri, nähdäksesi kaikki laajuudet ja niiden nykyisen kokoonpanon.
Tavoitteet on lueteltu ensisijaisessa järjestyksessä, ja ylimmällä määritellyllä soveltamisalueella ohitetaan kaikki muut. Jos sääntöjä ei ole määritetty, järjestelmä palaa oletusasetukselle (useimmissa tapauksissa tämä on rajoitettu).
Koska tämä artikkeli koskee lähinnä turvallisuutta käytettävyyden helpottamiseksi, olemme vain huolissamme alhaisimmista kolmesta laajuudesta. MachinePolicy- ja UserPolicy-asetukset ovat todella hyödyllisiä vain, jos haluat noudattaa rajoittavaa käytäntöä, jota ei yksinkertaisesti ohittaa. Jatkamalla muutoksia Prosessitasolla tai alla, voimme helposti käyttää mitä tahansa sopivaa toimintaympäristöä milloin tahansa.
Jotta salasanan ja käytettävyyden välinen tasapaino säilyisi, kuvassa näkyvä käytäntö on luultavasti paras. LocalMachine-käytännön rajoitettu rajoittaminen yleensä estää komentosarjoja kaikkien muiden kuin sinä. Tietenkin tämä voi ohittaa käyttäjät, jotka tietävät, mitä he tekevät ilman paljon vaivaa. Mutta sen pitäisi pitää kaikki ei-tech-osaavat käyttäjät vahingossa käynnistämästä jotain katastrofaalista PowerShellissä. Kun CurrentUser (eli olet) -asetukseksi on asetettu rajoittamattomaksi, voit manuaalisesti suorittaa käsikirjoitukset komentoriviltä, mutta haluat silti säilyttää muistutuksen varovaisuudesta skripteistä, jotka on ladattu Internetistä. Prosessitasolla RemoteSigned-asetus olisi tehtävä pikakuvakkeella PowerShell.exe tai (kuten aiomme tehdä alla) PowerShell-komentosarjoja käyttävien rekisteriarvojen avulla. Tämä mahdollistaa helppokäyttöisen kaksoisnapsautuksen toimivuuden mille tahansa kirjoittamalle komentosarjalle, samalla kun luodaan vahvempi este (mahdollisesti haittaohjelmien) käsikirjoitusten tahattomasta suorittamisesta ulkoisista lähteistä. Haluamme tehdä tämän täällä, koska on paljon helpompaa vahingossa kaksoisnapsauta komentosarjaa kuin yleensä kutsua sitä manuaalisesti vuorovaikutteisesta istunnosta.
Jos haluat asettaa CurrentUser- ja LocalMachine-käytännöt yllä kuvatulla kuvakkeella, suorita seuraavat komennot korkeammasta PowerShell-istunnosta:
Set-ExecutionPolicy Rajoitettu Set-ExecutionPolicy rajoittamaton -Scope CurrentUser
RemoteSigned-käytäntöjen noudattamisen valvomiseksi komentosarjoista suoritetaan Explorerista, joten joudumme muuttamaan jonkin rekisteriavaimen sisältämää arvoa, jota aiemmin tarkastelimme. Tämä on erityisen tärkeää, koska PowerShell- tai Windows-versiosta riippuen oletusasetukset voivat olla ohittamalla kaikki ExecutionPolicy-asetukset, paitsi AllSigned. Jos haluat nähdä, mikä nykyinen kokoonpano on tietokoneellesi, voit suorittaa tämän komennon (varmista ensin, että HKCR PSDrive on ensin kartoitettu):
Get-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Komento | Valitse-kohde '(oletus)'
Oletusasetuksesi on todennäköisesti yksi seuraavista kahdesta merkkijonosta tai jotain melko samanlaisesta:
(Näkyy Windows 7 SP1 x64: ssä, PowerShell 2.0: ssa)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1"
(Näkyy Windows 8.1 x64, PowerShell 4.0: n kanssa)
"ExecutePolicy -Scope Process Bypass ja"% 1 " '"
Ensimmäinen ei ole huono, sillä kaikki se tekee komentosarjan olemassa olevissa ExecutionPolicy-asetuksissa. Sitä voitaisiin parantaa, jos noudatettaisiin tiukempia rajoituksia entistä onnettomuusalttiimmille toimille, mutta sitä ei alun perin tarkoitus saada aikaan kaksoisnapsauttamalla, ja oletuskäytäntö on yleensä rajoitettu. Toinen vaihtoehto on kuitenkin täydellinen ohitus, mitä tahansa ExecutionPolicy-toimintoa, jota sinulla todennäköisesti on, jopa rajoitettu. Koska ohitus on käytössä Prosessin laajuudessa, se vaikuttaa vain istuntoihin, jotka käynnistetään, kun komentosarjoja suoritetaan Explorerista. Tämä tarkoittaa kuitenkin, että saatat päätyä käsikirjoitusten käynnistämiseen, joita muuten voisit odottaa (ja haluat), että käytäntösi kieltää.
Jos haluat määrittää Resurssienhallinnasta käynnistetyistä komentosarjoista suoritettavan prosessitason ExecutionPolicy-ohjelman edellä kuvatun kuvaruudun mukaisesti, sinun on muokattava samaa rekisteriarvoa, jota me vain kysyttiin. Voit tehdä sen manuaalisesti Regeditissä muuttamalla sitä tähän:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-filmi" "% 1"
Voit myös muuttaa asetusta PowerShellissä, jos haluat. Muista tehdä tämä korotetusta istunnosta, jossa HKCR PSDrive kartoitetaan.
"-ExecutionPolicy" "RemoteSigned" "-file" "Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Komento (oletus)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" % 1" '
Aivan kuten onkin huono ajatus poistaa UAC käytöstä kokonaan, on myös huonoa tietoturvakäytäntöä käyttää komentosarjoja tai ohjelmia, joilla on korkeammat käyttöoikeudet, ellei niitä todella tarvita suorittamaan toimintoja, jotka edellyttävät järjestelmänvalvojan pääsyä. Niinpä UAC-kehotteen rakentaminen PowerShell-komentosarjoihin ei ole suositeltavaa. Voimme kuitenkin lisätä uuden kontekstivalikon vaihtoehdon, jotta voimme helposti käyttää komentosarjoja kohotetuissa istunnoissa, kun tarvitsemme. Tämä on samanlainen kuin menetelmä, jota käytetään lisätäksesi "Open with Notepad" kaikkien tiedostojen kontekstivalikkoon - mutta tässä vain kohdistamme PowerShell-komentosarjoja.Aiomme myös siirtää joitakin edellisessä artikkelissa käytettyjä tekniikoita, joissa käytimme erätiedostoa rekisterimerkintöjen sijasta PowerShell-komentosarjan käynnistämiseen.
Voit tehdä tämän Regeditissa palaamalla Shell-avaimeen osoitteessa:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
Luo siellä uusi aliavain. Soita se "Run with PowerShell (Admin)". Alle tämän, luo toinen aliavain nimeltä "Komento". Sitten asetetaan "(Oletus)" arvo Command:
"Käynnistysprosessi PowerShell.exe -ArgumentList" -ExecutionPolicy RemoteSigned -File \ "% 1 \" '-Verb RunAs "
PowerShellin tekeminen tosiasiassa vaatii tällä hetkellä kolme riviä. Yksi jokaisesta uudesta avaimesta ja yksi, jolla asetetaan "(oletus)" arvo komennolle. Älä unohda korkeus ja HKCR-kartoitus.
HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Suorita PowerShellin (Admin) \ Command 'Set-ItemProperty' -toiminnon avulla. HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Käynnistä PowerShell (Admin) \ Command "(oletus)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" Start-Process PowerShell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs "'
Kiinnitä huomiota myös PowerShellin kautta syötettävän merkkijonon ja todellisen arvon välillä. Erityisesti meidän on käärittävä koko asia yksittäisiin lainausmerkkeihin ja kaksinkertaistettava sisäisiin yksittäisiin lainausmerkkeihin, jotta vältetään komentojen jäsentämisen virheet.
Nyt sinun pitäisi olla uusi kontekstivalikon syöte PowerShell-komentosarjoille, nimeltään "Run with PowerShell (Admin)".
Uusi vaihtoehto kertoo kaksi peräkkäistä PowerShell-tapausta. Ensimmäinen on vain käynnistyslaite, joka käyttää Start-Process-ohjelmaa "-Verb RunAs" -parametrilla, jotta se pyytää korkeutta uudelle istunnolle. Sieltä komentojasi pitäisi pystyä toimimaan järjestelmänvalvojan oikeuksien kanssa, kun napsautat UAC-kehotteen.
Tässä on vain pari muuta tweaksia, jotka voivat auttaa tekemään elämästä vielä helpompaa. Yhden, kuinka päästä eroon Notepad-toiminnosta kokonaan? Kopioi "(oletus)" arvo Command-näppäimen kohdasta Muokkaa (alla), samaan kohtaan kohdassa Avaa.
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "% 1"
Tai voit käyttää tätä PowerShell-bittiä (tietysti Admin & HKCR):
"" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe ""% 1 "'Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command
Yksi lievempi ärsytys on konsolin tapana katoaa, kun käsikirjoitus on valmis. Kun näin tapahtuu, meillä ei ole mahdollisuutta tarkistaa käsikirjoitustuloksia virheistä tai muista hyödyllisistä tiedoista. Tämä voidaan huolehtia asettamalla tauko jokaisen skriptien lopussa tietenkin. Vaihtoehtoisesti voimme muuttaa "(Oletus)" arvoja komentopainikkeillamme, johon sisältyy "-NoExit" -parametri. Alla ovat muutetut arvot.
(Ilman järjestelmänvalvojan käyttöoikeutta)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "% 1"
(Admin-käyttöoikeus)
"% 1 \" '- \ "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "- Command" "" & Käynnistä-prosessi PowerShell.exe -ArgumentList "-NoExit-ExecutionPolicy RemoteSigned- Verb RunAs "
Ja tietenkin, annamme sinulle myös PowerShell-komentoja. Viimeinen muistutus: Korkeus & HKCR!
(Non-Admin)
"-ExecutionPolicy" "RemoteSigned" "" -ExecutionPolicy "" RemoteSigned "" -Seuraava tuoteProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command (oletus) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe " -file ""% 1 "'
(Admin)
"Käynnistä PowerShell (Admin) \ Command" (oletus) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" Command " "" & Start-Process PowerShell.exe -ArgumentList "-NoExit -ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs ""
Testaa tämä, käytämme komentosarjaa, joka näyttää meille ExecutionPolicy-asetukset ja onko käsikirjoitus käynnistetty järjestelmänvalvojan oikeuksilla. Skriptiä kutsutaan nimellä "MyScript.ps1" ja se tallennetaan "D: \ Script Lab": een näytejärjestelmässä. Koodi on alla viitaten.
jos (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Järjestelmänvalvoja")) Write-Output "Running as Administrator! Write-Output 'Running Limited!' Get-ExecutionPolicy -lista
Run with PowerShell -toiminnon käyttäminen:
Käytä "Suorita PowerShell (Admin)" -toiminnon avulla napsauttamalla UAC: n kautta:
Osoittamalla ExecutionPolicy-toiminnon prosessin soveltamisalueella voimme tehdä Windows-käsityksestä, että tiedosto saapui Internetistä tämän PowerShell-koodin avulla:
Add-Content -Path "D: \ Script Lab \ MyScript.ps1" -Value "[ZoneTransfer]" nZoneId = 3 "-Stream" Zone.Identifier "
Onneksi meillä oli -NoExit käytössä. Muutoin tämä virhe olisi vain vilkaissut, eikä me olisikaan tiedä!
Zone.Identifier voidaan poistaa tämän avulla:
Clear-Content -Path "D: \ Script Lab \ MyScript.ps1" -Stream "Zone.Identifier"
Hyödyllisiä viitteitä: