9Sep

Cara Menggunakan File Batch untuk Membuat Script PowerShell Lebih Mudah di Jalankan

click fraud protection

Untuk beberapa alasan, sebagian besar terkait dengan keamanan, skrip PowerShell tidak mudah dibawa dan dapat digunakan seperti skrip batch. Namun, kami dapat menggabungkan naskah batch dengan skrip PowerShell kami untuk mengatasi masalah ini. Di sini, kami akan menunjukkan beberapa area masalah tersebut, dan bagaimana membuat skrip batch untuk bisa mengelilinginya.

Mengapa saya tidak bisa menyalin file. PS1 saya ke komputer lain dan menjalankannya? Jika sistem target telah dikonfigurasi sebelumnya untuk memungkinkan menjalankan skrip acak, dengan hak istimewa yang diperlukan, dan menggunakan pengaturan yang benar, kemungkinan Anda akan mengalami beberapa masalah saat Anda mencoba melakukan ini.
  1. PowerShell tidak terkait dengan ekstensi file. PS1 secara default.
    Kami membawa ini awalnya pada seri PowerShell Geek School kami. Windows mengasosiasikan file. PS1 ke Notepad secara default, alih-alih mengirimkannya ke juru bahasa perintah PowerShell. Ini untuk mencegah eksekusi script berbahaya yang tidak disengaja hanya dengan mengklik dua kali. Ada beberapa cara untuk mengubah perilaku ini, tapi mungkin ini bukan sesuatu yang ingin Anda lakukan di setiap komputer yang Anda bawa skrip Anda - terutama jika beberapa komputer itu bukan milik Anda sendiri.
    instagram viewer
  2. PowerShell tidak mengizinkan eksekusi skrip eksternal secara default.
    Pengaturan EksekusiPolicy di PowerShell mencegah eksekusi skrip eksternal secara default di semua versi Windows. Pada beberapa versi Windows, default tidak mengizinkan eksekusi script sama sekali. Kami menunjukkan kepada Anda bagaimana mengubah pengaturan ini di Cara Memungkinkan Pelaksanaan Script PowerShell di Windows 7. Namun, ini juga sesuatu yang tidak Anda inginkan hanya pada komputer mana pun.
  3. Beberapa skrip PowerShell tidak akan bekerja tanpa izin Administrator.
    Bahkan berjalan dengan akun tingkat Administrator, Anda masih harus melalui User Account Control( UAC) untuk melakukan tindakan tertentu. Kami tidak ingin menonaktifkan ini, tapi tetap bagus saat kami bisa membuatnya sedikit lebih mudah untuk ditangani.
  4. Beberapa pengguna mungkin memiliki lingkungan PowerShell yang disesuaikan. Anda mungkin tidak akan sering bertemu dengan ini, tapi ketika Anda melakukannya, Anda dapat menjalankan dan memecahkan masalah skrip Anda sedikit membuat frustrasi. Untungnya, kita bisa mengatasinya tanpa melakukan perubahan permanen juga.

Langkah 1: Klik dua kali untuk menjalankan.

Mari kita mulai dengan mengatasi masalah pertama -. PS1 asosiasi file. Anda tidak bisa klik dua kali untuk menjalankan file. PS1, tapi Anda bisa menjalankan file. BAT seperti itu. Jadi, kita akan menulis file batch untuk memanggil skrip PowerShell dari baris perintah untuk kita.

Jadi kita tidak perlu menulis ulang file batch untuk setiap skrip, atau setiap kali kita memindahkan skrip di sekitar, itu akan menggunakan variabel self-referencing untuk membangun path file untuk skrip PowerShell. Untuk membuat karya ini, file batch perlu ditempatkan di folder yang sama dengan skrip PowerShell Anda dan memiliki nama file yang sama. Jadi jika skrip PowerShell Anda disebut "MyScript.ps1", Anda ingin memberi nama file batch Anda "MyScript.bat" dan pastikan itu ada di folder yang sama. Kemudian, letakkan baris ini di skrip batch:

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

Jika bukan karena pembatasan keamanan lainnya, itu akan benar-benar menjadi semuadibutuhkan untuk menjalankan skrip PowerShell dari file batch. Sebenarnya, baris pertama dan terakhir terutama hanya masalah preferensi - ini adalah baris kedua yang benar-benar melakukan pekerjaan itu. Inilah rinciannya:

@ECHO OFF mematikan perintah yang bergema. Ini hanya membuat perintah Anda yang lain ditampilkan di layar saat file batch berjalan. Baris ini sendiri tersembunyi oleh penggunaan simbol at( @) di depannya.

PowerShell.exe -Command "&'% ~ Dpn0.ps1' " benar-benar menjalankan skrip PowerShell. PowerShell.exe tentu saja bisa dipanggil dari jendela CMD atau file batch untuk meluncurkan PowerShell ke konsol kosong seperti biasa. Anda juga dapat menggunakannya untuk menjalankan perintah langsung dari file batch, dengan menyertakan parameter -Command dan argumen yang sesuai. Cara ini digunakan untuk menargetkan file. PS1 kita dengan variabel% ~ dpn0 khusus. Jalankan dari file batch,% ~ dpn0 mengevaluasi ke huruf drive, path folder, dan nama file( tanpa ekstensi) dari file batch. Karena berkas batch dan skrip PowerShell akan berada dalam folder yang sama dan memiliki nama yang sama,% ~ dpn0.ps1 akan menerjemahkan ke path file lengkap skrip PowerShell.

PAUSE hanya menghentikan eksekusi batch dan menunggu masukan pengguna. Ini umumnya berguna untuk dimiliki pada akhir file batch Anda, sehingga Anda memiliki kesempatan untuk meninjau kembali perintah sebelum jendela hilang. Seiring kita menjalani pengujian setiap langkah, kegunaan ini akan menjadi lebih jelas.

Jadi, file batch dasar sudah diatur. Untuk tujuan demonstrasi, file ini disimpan sebagai "D: \ Script Lab \ MyScript.bat" dan ada "MyScript.ps1" di folder yang sama. Mari kita lihat apa yang terjadi saat kita klik dua kali MyScript.bat.

Jelas skrip PowerShell tidak berjalan, tapi itulah yang diharapkan - kami hanya membahas masalah pertama dari keempat masalah kami. Namun, ada beberapa hal penting yang ditunjukkan di sini:

  1. Judul jendela menunjukkan bahwa skrip batch berhasil meluncurkan PowerShell.
  2. Baris pertama output menunjukkan bahwa profil PowerShell kustom sedang digunakan. Ini adalah masalah potensial # 4, tercantum di atas.
  3. Pesan kesalahan menunjukkan batasan ExecutionPolicy yang berlaku. Itu masalah kita # 2.
  4. Bagian yang digarisbawahi dari pesan kesalahan( yang dilakukan secara native oleh keluaran kesalahan PowerShell) menunjukkan skrip batch dengan benar menargetkan skrip PowerShell yang dimaksud( D: \ Script Lab \ MyScript.ps1).Jadi kita setidaknya tahu bahwa banyak bekerja dengan benar.

Profil, dalam kasus ini, adalah skrip satu baris sederhana yang digunakan untuk demonstrasi ini untuk menghasilkan keluaran kapan pun profil tersebut aktif. Anda dapat menyesuaikan profil PowerShell Anda sendiri untuk melakukan ini juga, jika Anda ingin menguji skrip ini sendiri. Cukup tambahkan baris berikut ke skrip profil Anda:

Write-Output 'profil Custom PowerShell berlaku!'

EksekusiPolicy pada sistem pengujian disini diatur ke RemoteSigned. Hal ini memungkinkan eksekusi skrip dibuat secara lokal( seperti skrip profil), sementara memblokir skrip dari sumber luar kecuali jika mereka ditandatangani oleh otoritas tepercaya. Untuk tujuan demonstrasi, perintah berikut digunakan untuk menandai MyScript.ps1 sebagai sumber eksternal:

Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer]` nZoneId = 3 "-Stream 'Zone. Identifier'

Yang menetapkan aliran data unik Zone. Identifier di MyScript.ps1 sehingga Windows akan menganggap file tersebut berasal dari Internet. Hal ini dapat dengan mudah dibalik dengan perintah berikut:

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

Langkah 2: Bepergian ExecutionPolicy.

Berkeliling pengaturan ExecutionPolicy, dari CMD atau skrip batch, sebenarnya cukup mudah. Kami hanya memodifikasi baris kedua skrip untuk menambahkan satu parameter lagi ke perintah PowerShell.exe.

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

-ExecutionPolicy parameter dapat digunakan untuk memodifikasi ExecutionPolicy yang digunakan saat Anda menelurkan sesi PowerShell yang baru. Ini tidak akan bertahan melebihi sesi itu, jadi kita bisa menjalankan PowerShell seperti ini kapan pun kita membutuhkannya tanpa memperlemah postur keamanan umum sistem. Sekarang setelah kita memperbaikinya, mari kita lanjutkan ke sana:

Setelah skrip dijalankan dengan benar, kita dapat melihat apa yang sebenarnya terjadi. Ini memberi tahu kami bahwa kami menjalankan skrip sebagai pengguna Terbatas. Skrip sebenarnya dijalankan oleh akun dengan izin Administrator, namun Kontrol Akun Pengguna semakin dekat. Meskipun rincian tentang bagaimana skrip memeriksa akses Administrator berada di luar cakupan artikel ini, inilah kode yang digunakan untuk demonstrasi:

jika( (Security. Principal. WindowsPrincipal] [Security. Principal. WindowsIdentity]: : GetCurrent() ) IsInRole( [Security. Principal. WindowsBuiltInRole] "Administrator")){ Write-Output 'Menjalankan sebagai Administrator!'} Else{ Write-Output 'Running Limited!'} Jeda

Anda juga akan melihat bahwa sekarang ada dua"Jeda" operasi pada output skrip - satu dari skrip PowerShell, dan satu dari file batch. Alasannya akan lebih jelas pada langkah selanjutnya.

Langkah 3: Mendapatkan akses Administrator.

Jika skrip Anda tidak menjalankan perintah yang memerlukan elevasi, dan Anda cukup yakin Anda tidak perlu khawatir dengan profil khusus siapa pun yang menghalangi, Anda bisa melewati sisa ini. Jika Anda menjalankan beberapa cmdlet tingkat Administrator, Anda memerlukan karya ini.

Sayangnya, tidak ada cara untuk memicu UAC untuk elevasi dari dalam file batch atau sesi CMD.Namun, PowerShell mengizinkan kita melakukan ini dengan Start-Process. Bila digunakan dengan "-Verb RunAs" dalam argumennya, Start-Process akan mencoba meluncurkan aplikasi dengan hak akses Administrator. Jika sesi PowerShell belum terangkat, ini akan memicu permintaan UAC.Untuk menggunakan ini dari file batch untuk meluncurkan skrip kami, kami akan menyelesaikan proses pemijahan dua proses PowerShell - satu untuk memecat Start-Process dan proses lainnya, yang diluncurkan oleh Start-Process, untuk menjalankan skrip. Baris kedua dari file batch perlu diubah menjadi:

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

Saat file batch dijalankan, baris pertama output yang akan kita lihat berasal dari skrip profil PowerShell. Kemudian, akan ada prompt UAC saat Start-Process mencoba meluncurkan MyScript.ps1.

Setelah mengklik melalui UAC prompt, contoh PowerShell baru akan bertelur. Karena ini adalah contoh baru, tentu saja, kita akan kembali melihat tulisan skrip profil. Kemudian, MyScript.ps1 berjalan dan kita melihat bahwa kita memang dalam sesi yang lebih tinggi.

Dan ada alasan kita memiliki dua jeda di sini juga. Jika tidak untuk yang ada di skrip PowerShell, kita tidak akan pernah melihat output skrip - jendela PowerShell akan muncul dan menghilang begitu script selesai dijalankan. Dan tanpa jeda dalam file batch, kami tidak akan dapat melihat apakah ada kesalahan yang meluncurkan PowerShell di tempat pertama.

Langkah 4: Bepergian profil PowerShell kustom.

Mari kita menyingkirkan pemberitahuan profil khusus yang tidak menyenangkan itu sekarang, bukan? Di sini, ini bahkan bukan masalah, tapi jika profil PowerShell pengguna mengubah pengaturan default, variabel, atau fungsi dengan cara yang mungkin tidak diantisipasi dengan skrip Anda, itu benar-benar merepotkan. Ini jauh lebih sederhana untuk menjalankan skrip Anda tanpa profil seluruhnya sehingga Anda tidak perlu khawatir tentang hal ini. Untuk melakukan itu, kita hanya perlu mengubah baris kedua dari file batch sekali lagi:

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

Menambahkan parameter -NoProfile ke kedua contoh PowerShell yang diluncurkan oleh skrip berarti skrip profil pengguna akan benar-benar dilewati di kedua langkah dan skrip PowerShell kami akan berjalan dilingkungan default yang cukup dapat diprediksi. Di sini, Anda bisa melihat tidak ada pemberitahuan profil khusus di salah satu cangkang yang ditelurkan.

Jika Anda tidak memerlukan hak Administrator di skrip PowerShell Anda, dan Anda telah melewatkan Langkah 3, Anda dapat melakukannya tanpa instance PowerShell kedua dan baris kedua dari file batch Anda akan terlihat seperti ini:

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

Outputnya akan terlihat seperti ini:

( Tentu saja, untuk skrip non-administrator, Anda bisa melakukannya tanpa jeda akhir skrip dalam skrip PowerShell AndaPada titik ini juga karena semuanya ditangkap di jendela konsol yang sama dan akan diadakan di sana pada saat jeda di akhir file batch.)

Selesai file batch.

Bergantung pada apakah Anda memerlukan izin Administrator untuk skrip PowerShell Anda( dan Anda benar-benar seharusnya tidak memintanya jika tidak) file batch terakhir akan terlihat seperti salah satu dari keduanya di bawah ini.

Tanpa akses Admin:

@ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "& '% ~ dpn0.ps1'" PAUSE

Dengan akses Admin:

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

Ingatlah untuk meletakkan file batch di folder yang sama dengan skrip PowerShell yang Anda inginkanuntuk menggunakannya, dan berikan nama yang sama. Kemudian, tidak peduli sistem apa yang Anda gunakan untuk file tersebut, Anda dapat menjalankan skrip PowerShell Anda tanpa harus membuang-buang waktu dengan pengaturan keamanan apa pun pada sistem. Anda pasti bisa melakukan perubahan itu secara manual setiap saat, tapi ini menghemat masalah itu dan Anda tidak perlu khawatir untuk mengembalikan perubahan nanti.

Referensi:

  • Menjalankan skrip PowerShell dari file batch - Pemrograman Bahasa Pemrograman Daniel Schroeder
  • Memeriksa izin Administrator di PowerShell - Hei, Guy Scripting! Blog