9Sep

Kā izmantot partijas failu, lai padarītu PowerShell skriptus vieglāk izpildīt

click fraud protection

Vairāku iemeslu dēļ, galvenokārt ar drošību saistīti PowerShell skripti nav tik viegli pārnēsājami un lietojami, jo var būt partijas skripti. Tomēr mēs varam iesaiņot partijas skriptu, izmantojot mūsu PowerShell skriptus, lai risinātu šos jautājumus.Šeit mēs parādīsim dažas no šīm problēmu zonām un to, kā izveidot partijas skriptu, lai tos apietu.

Kāpēc es nevaru vienkārši kopēt savu. PS1 failu citam datoram un palaist to?

Ja vien mērķa sistēma nav iepriekš konfigurēta, lai ļautu patvaļīgiem skriptiem darboties ar nepieciešamajām privilēģijām un izmantotu pareizos iestatījumus, iespējams, ka jūs mēģināt sastapties ar dažām problēmām.

  1. PowerShell pēc noklusējuma nav saistīts ar. PS1 faila paplašinājumu.
    Sākotnēji mēs to radījuši mūsu PowerShell Geek skolu sērijās. Windows piesaista. PS1 failus Notepad pēc noklusējuma, nevis nosūta tos PowerShell komandu interpretatoram. Tas ir, lai novērstu nejaušu ļaunprātīgu skriptu izpildi, vienkārši dubultklikšķinot uz tiem. Ir veidi, kā jūs varat mainīt šo uzvedību, taču tas, iespējams, nav kaut kas, ko vēlaties darīt katrā datorā, uz kuru veicat savus skriptus, it īpaši, ja daži no šiem datoriem nav jūsu pašu.
    instagram viewer
  2. PowerShell pēc noklusējuma neļauj ārējā skripta izpildi.
    ExecutionPolicy iestatījums PowerShell novērš ārējo skriptu izpildi pēc noklusējuma visās Windows versijās. Dažās Windows versijās noklusējums neļauj izpildīt skriptu vispār. Mēs parādījām, kā mainīt šo iestatījumu sadaļā Iespējot PowerShell skriptu izpildi sistēmā Windows 7. Tomēr tas ir arī tas, ko nevēlaties darīt tikai ar jebkuru datoru.
  3. Daži PowerShell skripti nedarbosies bez administratora atļaujām.
    Pat darbojoties ar administratora līmeņa kontu, jums ir nepieciešams, lai veiktu noteiktas darbības, izmantojot lietotāja kontu kontroli( UAC).Mēs nevēlamies to atspējot, bet tas joprojām ir jauki, ja mēs varam to nedaudz atvieglot.
  4. Dažiem lietotājiem var būt pielāgotas PowerShell vides.
    Jūs, iespējams, nespēsit to bieži, bet, kad jūs to darīsit, varēsiet darboties un sarežģīt skriptus nedaudz satraucoši. Par laimi, mēs varam to apiet, neveicot nekādas pastāvīgas izmaiņas.

1. darbība: veiciet dubultklikšķi, lai palaistu.

Sāksim ar pirmās problēmas risināšanu -. PS1 failu asociācijām. Jūs nevarat dubultklikšķi, lai palaistu. PS1 failus, bet jūs to varat izpildīt. BAT failā.Tātad, mēs rakstīsim sērijveida failu, lai izsauktu PowerShell skriptu no mūsu komandrindas.

Tāpēc mums nav jāpārraksta katra skripta sērijveida fails, vai arī katru reizi, kad mēs virzīsim skriptu, tā izmantos pašregulējošu mainīgo, lai izveidotu PowerShell skripta faila ceļu. Lai veiktu šo darbu, sērijveida fails tiks ievietots tajā pašā mapē kā PowerShell skripts un tam ir vienāds faila nosaukums. Tātad, ja jūsu PowerShell skriptu sauc par "MyScript.ps1", jūs vēlaties nosaukt savu sērijveida failu "MyScript.bat" un pārliecināties, ka tas ir tajā pašā mapē.Tad ielieciet šīs līnijas partijas skriptā:

@ECHO OFF PowerShell.exe -Command "&% ~ dpn0.ps1" "PAUZE

Ja nebūtu citu drošības ierobežojumu, tas patiešām būtu visstas nepieciešams, lai palaistu sērijveida failu PowerShell skriptu. Faktiski pirmā un pēdējā rindas galvenokārt ir tikai priekšrocības - tā ir otrā līnija, kas patiešām veic darbu.Šeit ir iedalījums:

@ECHO OFF izslēdz komandu atkārtošanu. Tas tikai saglabā jūsu citas komandas rādīt ekrānā, kad sērijveida fails darbojas.Šī līnija tiek paslēpta, izmantojot simbolu( @) priekšā.

PowerShell.exe -Command "&'% ~ Dpn0.ps1' ' faktiski palaiž PowerShell skriptu. Protams, PowerShell.exe var tikt izsaukts no jebkura CMD loga vai sērijveida faila, lai PowerShell palaistu kā parasti. Varat to arī izmantot, lai palaistu komandas tieši no sērijveida faila, iekļaujot -Command parametru un atbilstošos argumentus. Tas, kā to izmanto, lai mērķētu mūsu. PS1 failu, ir ar īpašu% ~ dpn0 mainīgo. Palaidiet no sērijveida faila% ~ dpn0 vērtē sērijveida faila diska burtu, mapes ceļu un faila nosaukumu( bez paplašinājuma).Tā kā sērijveida un PowerShell skripts būs vienā mapē un tiem ir viens nosaukums,% ~ dpn0.ps1 tiks tulkots uz PowerShell skripta pilnu faila ceļu.

PAUSE vienkārši pārtrauc partijas izpildi un gaida lietotāja ievadi. Tas parasti ir noderīgi, lai jūsu sērijveida faili būtu beigušies, lai jums būtu iespēja pārskatīt komandas izvadi pirms loga pazušanas. Kad mēs pārietu uz katra posma pārbaudi, šī lietderība kļūs acīmredzama.

Tātad, pamata sērijveida fails ir iestatīts. Demonstrācijas nolūkos šis fails tiek saglabāts kā "D: \ Script Lab \ MyScript.bat" un tajā pašā mapē ir "MyScript.ps1".Apskatīsim, kas notiek, veicot dubultklikšķi uz MyScript.bat.

Acīmredzot PowerShell skripts netika palaists, bet tas ir sagaidāms - galu galā mēs esam pievērsušies tikai pirmajai no mūsu četrām problēmām. Tomēr šeit ir daži svarīgi biti:

  1. Loga nosaukums rāda, ka partijas skripts veiksmīgi uzsāka PowerShell.
  2. Pirmā izvades rinda rāda, ka tiek izmantots pielāgots PowerShell profils.Šī ir potenciālā problēma # 4, kas uzskaitīta iepriekš.
  3. Kļūdas ziņojums parāda spēkā esošos ExecutionPolicy ierobežojumus. Tā ir mūsu 2. problēma.
  4. Apstiprinātā kļūdas ziņojuma daļa( kas tiek veikta, izmantojot PowerShell kļūdas izvadi) rāda, ka partijas skripts tika pareizi mērķēts uz paredzēto PowerShell skriptu( D: \ Script Lab \ MyScript.ps1).Tātad mēs vismaz zinām, ka daudz strādā pareizi.

Šajā gadījumā profils ir vienkāršs vienas rindas skripts, kas tiek izmantots demonstrācijai, lai ģenerētu produkciju ikreiz, kad profils ir aktīvs. Lai to paveiktu, varat arī pielāgot savu PowerShell profilu, ja vēlaties pats pārbaudīt šos skriptus. Savā profila skriptā vienkārši pievienojiet šādu rindiņu:

rakstīšanas un izvades funkcija 'Pielāgots PowerShell profils!'

Šajā pārbaudes sistēmā ExecutionPolicy ir iestatīts uz RemoteSigned. Tas ļauj veikt lokāli izveidotus skriptus( piemēram, profila skriptu), bet bloķē skriptus no ārējiem avotiem, ja vien tos nav parakstījusi uzticama iestāde. Demonstrēšanas nolūkos, lai MyScript.ps1 atzīmētu kā ārēju avotu, tika izmantota šāda komanda:

Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Vērtība '[ZoneTransfer] `nZoneId = 3' -Stream 'Zone. Identifier'

Tas nosaka Zone. Identifier rezerves datu plūsmu MyScript.ps1, lai Windows domātu, ka fails nāk no interneta. To var viegli mainīt ar šādu komandu:

Clear-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone. Identifier'

2. solis: Getting around ExecutionPolicy.

Pārvietošanās ar ExecutionPolicy iestatījumu, sākot no CMD vai partijas skripta, patiesībā ir diezgan viegli. Mēs vienkārši modificējam skripta otro rindu, lai pievienotu vēl vienu parametru komandai PowerShell.exe.

PowerShell.exe -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1' '

Parametrs -ExecutionPolicy var izmantot, lai pārveidotu ExecutionPolicy, kas tiek izmantots, kad jūs ģenerējat jaunu PowerShell sesiju. Tas nenotiks ilgāk par šo sesiju, tādēļ mēs varēsim palaist PowerShell to, kad vien mums būs vajadzīgs, nepalielinot sistēmas vispārējo drošības stāvokli. Tagad, kad to esam noteikuši, paliksim vēl vienu:

Tagad, kad skripts ir pareizi izpildīts, mēs varam redzēt, ko tā patiešām dara. Tas informē mūs, ka mēs izmantojam skriptu kā ierobežotu lietotāju. Skriptu patiesībā pārvalda konts ar Administratora atļaujām, bet lietotāja konta kontrole notiek ceļā.Lai gan informācija par to, kā skripts pārbauda administratora piekļuvi, ir ārpus šī raksta darbības jomas, šeit ir kods, ko izmanto demonstrēšanai:

ja( ([Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent() ). IsInRole( [Security. Principal. WindowsBuiltInRole] "Administrator"))){ Write-Output 'darbojas kā administrators!} Else{ Write-Output' Running Limited! '} Pause

Jūs arī pamanīsit, ka tagad ir diviSkripta izvadi "Pauze" - viena no PowerShell skripta un viena no sērijveida failiem.Šī iemesla dēļ būs skaidrāks nākošais solis.

3. darbība: piekļuve administratoram.

Ja jūsu skriptā netiek rādītas nekādas komandas, kurām nepieciešams paaugstinājums, un jūs esat diezgan pārliecināts, ka jums nebūs jāuztraucas par to, kā kāds pielāgotos profilus nokļūst ceļā, jūs varat izlaist pārējo. Ja jūs izmantojat dažas administratora līmeņa cmdlet, jums tā būs nepieciešama.

Diemžēl nav iespējams aktivizēt UAC paaugstināšanos no sērijveida vai CMD sesijas. Tomēr PowerShell ļauj mums to izdarīt ar sākuma procesu. Izmantojot ar argumentiem "-Verb RunAs", Start-Process mēģinās palaist lietojumprogrammu ar administratora atļaujām. Ja PowerShell sesija vēl nav paaugstināta, tas aktivizēs UAC uzvedni. Lai to izmantotu sērijveida failā, lai palaistu mūsu skriptu, mēs beigsim nārstot divus PowerShell procesus - vienu, lai palaistu sākuma procesu, bet otru, ko palaiž Start-Process, lai palaistu skriptu. Sērijfaila otrā rinda ir jāmaina uz šo:

PowerShell.exe -Command "&{ Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy apvedceļš -File" "% ~ dpn0.ps1" "" -VerbRunAs} "

Kad sērijveida fails tiek palaists, pirmā izvades rinda, ko mēs redzēsim, ir no PowerShell profila skripta. Pēc tam sākas UAC uzvedne, kad Start-Process mēģina palaist MyScript.ps1.

Pēc noklikšķināšanas, izmantojot UAC uzvedni, tiks parādīts jauns PowerShell piemērs. Tā kā tas ir jauns gadījums, protams, mēs atkal redzēsim profila skripta paziņojumu. Tad MyScript.ps1 palaiž, un mēs redzam, ka mēs patiešām ir paaugstināta sesija.

Un tur ir iemesls, ka mums šeit ir divas pauzes. Ja tas nav paredzēts PowerShell skriptā, mēs nekad neredzētu skripta izvadi - PowerShell logs tikko pop-up un pazūd, tiklīdz skripts tiek izpildīts. Un bez partijas faila pauzes mēs nevarētu redzēt, vai vispirms bija problēmas ar PowerShell palaišanu.

4. solis. Pielāgošana pielāgotajiem PowerShell profiliem.

Atlaidīsim šo viltīgo pielāgoto profila paziņojumu tūlīt, vai mēs to darīsim?Šeit gandrīz nav neērtības, taču, ja lietotāja PowerShell profils maina noklusējuma iestatījumus, mainīgos vai funkcijas, ko jūs, iespējams, neparedzējāt ar savu skriptu, tie var būt patiešām apgrūtinoši. Tas ir daudz vienkāršāk palaist jūsu skriptu bez profila pilnīgi, tāpēc jums nav jāuztraucas par to. Lai to paveiktu, mums vēlreiz jāmaina partijas faila otrā rindiņa:

PowerShell.exe -NoProfile -Command "&{ Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpn0.ps1 "" "-Verb RunAs}"

Parametra -NoProfile pievienošana abiem PowerShell gadījumiem, kurus palaiž skripts, nozīmē, ka lietotāja profila skripts tiks pilnībā apiets abos posmos, un mūsu PowerShell skripts darbosiesdiezgan paredzama noklusējuma vide.Šeit varat redzēt, ka nevienā no radītajiem čaumaliem nav neviena pielāgota profila paziņojuma.

Ja PowerShell skriptā nav nepieciešamas administratora tiesības un esat izlaida 3. darbību, jūs varat iztikt bez otrā PowerShell instancē, un jūsu sērijveida faila otrajai rindai jābūt šādai:

PowerShell.exe -NoProfile -ExecutionPolicy Bypass-Command "& '% ~ dpn0.ps1' '

Pēc tam izlaide izskatās šādi:

( protams, ja izmantojat skriptus, kas nav saistīti ar administratoru, jūs varat iztikt bez end-of-script pārtraukuma savā PowerShell skriptāšajā brīdī arī tāpēc, ka viss tiek uztverts tajā pašā konsoles logā, un tas tur tiktu turēts ar pauzi partijas faila beigās.)

Pabeigtie partijas faili.

Atkarībā no tā, vai jums ir nepieciešamas administratora atļaujas jūsu PowerShell skriptam( un jūs patiešām to nevajadzētu pieprasīt, ja jums tas nav), gala sērijveida failam vajadzētu būt vienam no abiem.

Bez administratora piekļuves:

@ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy apvedceļš -Command "& '% ~ dpn0.ps1'" PAUZE

Ar administratora piekļuvi:

@ECHO OFF PowerShell.exe -NoProfile -Command "&{Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""% ~ dpn0.ps1 "" "-Verb RunAs}" PAUSE

Neaizmirstiet ievietot sērijveida failu tajā pašā mapē kā PowerShell skripts, kuru vēlatiesto izmantot un piešķirt tam tādu pašu nosaukumu. Tad neatkarīgi no sistēmas, kurā izmantojat šos failus, jūs varēsiet palaist savu PowerShell skriptu, neizmantojot nevienu no sistēmas drošības iestatījumiem. Jūs noteikti varētu veikt šīs izmaiņas manuāli katru reizi, bet tas ietaupa jums šo nepatikšanu, un jums nebūs jāuztraucas par izmaiņu atjaunošanu vēlāk.

Atsauces:

  • Darbojas PowerShell skripti no sērijveida faila - Daniela Šrīdera programmēšanas emuārs
  • Pārbauda administratora atļaujas PowerShell programmā - Hey, Scripting Guy! Blog