Bagaimana cara mengaktifkan eksekusi skrip PowerShell?

260

Ketika saya mencoba menjalankan skrip PowerShell saya, saya mendapatkan kesalahan ini:

File C: \ Common \ Scripts \ hello.ps1 tidak dapat dimuat karena eksekusi skrip dinonaktifkan pada sistem ini. Silakan lihat "dapatkan bantuan tentang_menandatangani" untuk detail lebih lanjut.
Pada baris: 1 char: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Pavel Chuchuva
sumber

Jawaban:

400
  1. Mulai Windows PowerShell dengan opsi "Run as Administrator". Hanya anggota grup Administrator di komputer yang dapat mengubah kebijakan eksekusi.

  2. Aktifkan menjalankan skrip yang tidak ditandatangani dengan memasukkan:

    set-executionpolicy remotesigned
    

Ini akan memungkinkan menjalankan skrip yang tidak ditandatangani yang Anda tulis di komputer lokal Anda dan skrip yang ditandatangani dari Internet.

Lihat juga Menjalankan Skrip di Microsoft TechNet Library.

Pavel Chuchuva
sumber
3
Apakah ini akan mengubah kebijakan secara permanen atau apakah saya harus melakukan ini setiap kali saya me-restart komputer saya?
Ray
2
@ Ray Ini akan mengubah kebijakan secara permanen.
Pavel Chuchuva
1
@ Ray Lihat dokumentasi . Secara default, ini mengaturnya untuk LocalMachine. Untuk mengatur lingkup lain ( CurrentUseratau Process), berikan -Scopesecara eksplisit.
jpmc26
@PavelChuchuva saya harus menambahkan baris ini di atas skrip saya yang Anda maksud
FabioSpaghetti
@FabioSpaghetti Tidak perlu menambahkan apa pun ke skrip Anda. Cukup jalankan perintah itu sekali dengan mengikuti langkah-langkah.
Pavel Chuchuva
74

Kebijakan Eksekusi Default diatur ke dibatasi, Anda dapat melihatnya dengan mengetik:

Get-ExecutionPolicy

Anda harus mengetik yang berikut ini untuk membuatnya masuk ke mode tidak terbatas:

Set-ExecutionPolicy unrestricted

Semoga ini membantu

William Hilsum
sumber
13
Penandatanganan yang diwajibkan masuk akal jika Anda mengharapkan pengguna untuk menyalin & menempelkan skrip berbahaya dari internet. Jika Anda menganggap pengguna itu tidak bodoh, "remotesigned" tidak menambah keamanan apa pun dan menyulitkan hidup.
Guss
@ Guss: Pada pengujian ini saya menemukan bahwa RemoteSigned tidak lagi memerlukan file .ps1 yang dihasilkan secara lokal untuk ditandatangani, dan memperlakukan kontrol sumber git sebagai sumber lokal.
Joshua
@ Yosua - ya, maksud saya persis. Jika RemoteSignedtidak memblokir copy & paste, tidak memblokir git atau metode unduhan non-IE lainnya, lalu apa gunanya? Katakan dengan saya: "sama sekali tidak ada!". Saya pikir mewajibkan skrip untuk ditandatangani dengan sertifikat penandatanganan kode $ 100 tidak berguna, bodoh dan meniadakan semua kebaikan yang dapat dilakukan oleh bahasa skrip yang layak untuk Windows. Yang sedang berkata, jika jalan ke depan adalah membuat pengguna memahami apa yang mereka lakukan untuk menggunakan skrip PS, maka kita mungkin terlalu sth ... Nahhhh, itu tidak akan pernah berhasil ;-)
Guss
@ Guss: Saya sudah mendapatkan bahasa scripting yang bagus di Windows. Cygwin berfungsi dengan baik pada Windows 10; seperti secara harfiah jauh lebih baik daripada yang ada pada versi Windows sebelumnya. Saya hanya ingin menjalankan skrip yang sudah ditulis orang lain.
Joshua
61

Di komputer saya yang saya gunakan untuk dev skrip, saya akan menggunakan -unrestricted seperti di atas. Ketika menyebarkan skrip saya, ke mesin pengguna akhir, saya hanya akan memanggil PowerShell dengan saklar -executionpolicy:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1
MDMoore313
sumber
2
Anda mungkin ingin menggabungkan trik ini dengan trik polyglot dalam file CMCM. Lihat stackoverflow.com/a/8597794/5314
Jay Bazuzi
Bagus! Saya telah menggunakan sfx yang dibuat oleh winrar rarlabs.com
MDMoore313
1
Trik itu memungkinkan saya untuk menjalankan skrip PowerShell dari Git Bash (MINGW32 bash)
Kamil Szot
16

Kita bisa mendapatkan status ExecutionPolicy saat ini dengan perintah di bawah ini:

Get-ExecutionPolicy;

Secara default itu Dibatasi . Untuk memungkinkan eksekusi Script PowerShell kita perlu mengatur ExecutionPolicy ini sebagai Bypass atau Tidak Terbatas .

Kami dapat menetapkan kebijakan untuk Pengguna Saat Ini sebagai Bypassatau Unrestricteddengan menggunakan perintah PowerShell di bawah ini:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass -Force;

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force;

Kebijakan tidak terbatas memuat semua file konfigurasi dan menjalankan semua skrip. Jika Anda menjalankan skrip yang tidak ditandatangani yang diunduh dari Internet, Anda akan dimintai izin sebelum dijalankan.

Sedangkan dalam kebijakan Bypass , tidak ada yang diblokir dan tidak ada peringatan atau konfirmasi selama eksekusi skrip. Bypass ExecutionPolicy lebih santai daripada Tidak Terbatas.

Pratik Patil
sumber
5

Bergantung pada versi dan konfigurasi Windows, Anda mungkin memiliki peringatan berikut, bahkan dalam Unrestrictedmode:

Security warning
Run only scripts that you trust. While scripts from the internet can be useful, this
script can potentially harm your computer. If you trust this script, use the 
Unblock-File cmdlet to allow the script to run without this warning message. 
Do you want to run?
[D] Do not run  [R] Run once  [S] Suspend  [?] Help (default is "D")

Solusinya adalah dengan menggunakan kebijakan "bypass", diaktifkan dengan perintah berikut:

Set-ExecutionPolicy Bypass

Dari dokumentasi :

Lewati: Tidak ada yang diblokir dan tidak ada peringatan atau konfirmasi.

Ini jelas tidak aman, harap dipahami risiko yang terlibat.

Benoit Blanchon
sumber
ini adalah satu-satunya cara saya bisa menjalankan skrip saya di lingkungan WINE dengan PowerShell 2.0. Terima kasih.
Wyatt8740
@ Wyatt8740: Karena anggur menghadirkan semua drive sebagai drive jaringan.
Joshua
@ Joshua aku tidak tahu. dapatkah Anda memberi saya sumber untuk pernyataan itu? Saya mencoba google kasual, tapi saya jelas terlihat salah.
Wyatt8740
@ Wyatt8740: Sumber: Wine, kotak dialog umum OpenFileName. Lihatlah ikon drive.
Joshua
@ Yosua maksudku sumber kode sumber; ikon mungkin sewenang-wenang. Tetapi saya tidak memikirkan itu; Saya kira itu adalah tempat yang baik untuk memulai (sunting: tidak terlihat seperti mereka ada di sini .)
Wyatt8740
2

Kunci reg dengan:
Windows Registry Editor Versi 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "Bypass"

dan:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell]
"EnableScripts"=dword:00000001 "ExecutionPolicy"="Unrestricted"

bekerja juga.

Giesbert Schipper
sumber
1

Untuk beberapa alasan cmdlet PowerShell tidak mengaktifkan eksekusi lokal secara global, hanya untuk konteks pengguna lokal. Jika saya mencoba memulai skrip Powershell dari dalam bash prompt CygWin, misalnya, yang berjalan di bawah konteks penggunanya sendiri, itu tidak akan berjalan, memberikan kesalahan "tidak ditandatangani secara digital". Jawabannya adalah masuk ke Editor Kebijakan Grup Lokal -> Kebijakan Komputer Lokal -> Template Administratif -> Komponen Windows -> Windows PowerShell dan klik dua kali pada 'Aktifkan Eksekusi Script'. Ini kemudian izinkan saya mengubahnya ke 'Diaktifkan' dan kemudian kebijakan eksekusi "Izinkan skrip lokal dan skrip bertanda tangan jauh" dan minta agar berfungsi secara global terlepas dari konteks pengguna.

Eric Green
sumber
0

Jawaban yang diterima benar, tetapi modifikasi kebijakan hanya tersedia untuk instance Powershell yang sedang berjalan, artinya setelah instance Powershell dimatikan. Kebijakan akan diatur ulang. Jika pengguna membuka kembali instance Powershell yang lain, kebijakan default akan diterapkanRestricted

Bagi saya, saya perlu menggunakan konsol VisualStudio Code dan g ++ dari cygwin untuk membangun sesuatu. Konsol menggunakan Powershell, dengan kebijakan default, tidak ada yang bisa dilakukan. Salah satu solusinya adalah mengubah kebijakan setiap kali konsol dipecat dalam konsol VisualStudio Code, mungkin sebuah skrip untuk mengubah kebijakan.

Saya malas, jadi solusi lain adalah ketika saya menjalankan Powershell dalam mode admin, mirip dengan apa yang diterima jawaban. tetapi dengan parameter tambahan yang mengubah nilai dalam tabel Registry. Setelah selesai. Contoh lain dari Powershell akan menggunakan RemoteSignedkebijakan secara default.

set-executionpolicy remotesigned -Scope CurrentUser

r0ng
sumber
0

Menetapkan kebijakan (dengan benar) adalah pilihan terbaik tetapi pada sistem yang dikelola saya, saya tidak memiliki kemampuan untuk mengubah kebijakan itu.

Bagi saya, cara termudah untuk mengubah kebijakan adalah membuka skrip di "PowerShell ISE" , sorot kode (atau bagian dari kode) untuk dieksekusi dan kemudian klik tombol "Run Selection" (atau gunakan F8 jalan pintas).

Ini bukan solusi terbaik & melakukan sedikit untuk mengotomatisasi tugas-tugas, tetapi itu memungkinkan saya penggunaan & utilitas PowerShell sementara tidak bertabrakan dengan departemen IS saya.

DBADon
sumber
-2

Alasan bahwa kunci reg berfungsi, adalah karena ia melakukan persis apa yang dilakukan perintah PS. Perintah menulis perubahan ke kunci reg. Perintah jauh lebih cepat dan lebih mudah daripada membuat kunci reg atau menggali ke dalam registri.

keith
sumber
1
Itu hanya salah: kunci yang disebutkan dalam jawaban lain mengubah kebijakan eksekusi PowerShell, yang kemudian memungkinkan skrip PowerShell dijalankan.
Patrick R.