Mengapa skrip saya yang dibuat secara lokal tidak diizinkan untuk dijalankan di bawah kebijakan eksekusi RemoteSigned?

98

Karena pertanyaan ini terus menarik tanggapan yang disangkal oleh badan pertanyaan atau tidak membahas masalah sebenarnya, harap baca ringkasan sederhana tentang apa yang perlu Anda ketahui:

  • Ini bukan "Mengapa penginstalan default PowerShell saya tidak menjalankan skrip?" pertanyaan.
  • Ini bukan "Mengapa penginstalan PowerShell saya tidak menjalankan skrip yang diunduh dari internet?" pertanyaan.
  • Pertanyaannya adalah mengapa RemoteSignedkebijakan eksekusi mencegah eksekusi skrip padahal seharusnya tidak.
  • RemoteSignedadalah satu - satunya kebijakan eksekusi yang ingin saya gunakan. Saya menyadari bahwa tersedia kebijakan lain yang tidak terlalu ketat pembatasannya. Jika kebijakan itu adalah pengganti yang dapat diterima, saya akan menggunakannya sebagai gantinya dan pertanyaan ini tidak akan ada.
  • Kebijakan eksekusi sudah disetel ke RemoteSigned. Mengubahnya dari RemoteSignedmenjadi RemoteSignedbukanlah solusi.
  • File skrip dibuat dan disimpan secara lokal.
  • File skrip tidak diblokir. File skrip tidak pernah diblokir (lihat poin sebelumnya).
  • File skrip tidak dapat dibuka blokirnya karena tidak ada yang perlu dibuka (lihat poin sebelumnya).
  • File script (berusaha untuk) dijalankan oleh administrator.
  • Windows PowerShelladalah satu-satunya aplikasi yang terlibat. Tidak Windows PowerShell ISEatau Command Promptmaupun alat atau editor lain apa pun yang relevan.
  • Penyebab masalah tersebut sudah teridentifikasi (lihat jawaban diterima). Setelah hampir 8 tahun, saya pikir semua penjelasan yang jelas lainnya, apakah berlaku atau tidak, telah diposting juga. Jika Anda berpikir sebaliknya, harap baca pertanyaan dan jawaban yang ada secara keseluruhan sebelum menambahkan jawaban Anda.

Saya menggunakan Windows PowerShell 2.0 pada 64-bit Windows 7 Professional. Saya memiliki skrip Desktopyang menyebabkan kesalahan berikut ketika saya mencoba menjalankannya:

File C:\Users\UserName\Desktop\Script.ps1 cannot be loaded. The file C:\Users\UserName\Desktop\Script.ps1 is not digitally signed. The script will not execute on the system.  Please see "get-help about_signing" for more details..
At line:1 char:54
+ C:\Users\UserName\Desktop\TestGetWindowsUpdateLog.ps1 <<<<
    + CategoryInfo          : NotSpecified: (:) [], PSSecurityException
    + FullyQualifiedErrorId : RuntimeException

Saya adalah administrator domain dan administrator lokal, dan jika saya menjalankan Get-ExecutionPolicy -List, saya dapat melihat bahwa Group Policy Objectsaya membuat untuk mengkonfigurasi PowerShell dengan benar menerapkan RemoteSignedkebijakan eksekusi di tingkat mesin:

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy    RemoteSigned
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

Saya membuat script sendiri di Notepad, dan menggunakan Sysinternals ' streamsutilitas dan file Propertiesdialog untuk mengkonfirmasi bahwa script tersebut tidak diperlakukan sebagai yang datang dari internet. Jika saya menyalin skrip ke jaringan berbagi di server domain, maka itu diizinkan untuk dijalankan. Jika saya menjalankan Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachinemaka skrip lokal masih tidak diizinkan untuk dieksekusi, yang masuk akal karena kebijakan eksekusi di MachinePolicyruang lingkup akan diutamakan.

Seperti yang didokumentasikan oleh about_Execution_Policies( saat ini ; pada saat pertanyaan ), RemoteSignedkebijakan tersebut berarti:

  • Skrip dapat dijalankan.

  • Memerlukan tanda tangan digital dari penerbit tepercaya pada skrip dan file konfigurasi yang diunduh dari Internet (termasuk program email dan pesan instan).

  • Tidak memerlukan tanda tangan digital pada skrip yang Anda jalankan dan yang Anda tulis di komputer lokal (tidak diunduh dari Internet).

  • Risiko menjalankan skrip yang tidak ditandatangani dari sumber selain Internet dan skrip yang ditandatangani, tetapi berbahaya.

Skrip saya tidak ditandatangani, tetapi karena dibuat dan dijalankan secara lokal, itu harus memenuhi poin ketiga di atas. Karena itu...

  • Mengapa skrip saya tidak diizinkan untuk dijalankan?
  • Mengapa PowerShell mengeluh bahwa skrip saya "tidak ditandatangani secara digital" padahal persyaratan itu hanya berlaku untuk file dari Internet?
  • Mengapa PowerShell tidak lagi peduli tentang skrip yang tidak ditandatangani saat dijalankan dari jaringan bersama?
DAGING BABI ASAP
sumber
1
@Downvoter: peduli untuk memberikan alasan mengapa?
BACON

Jawaban:

125

Apakah file tersebut diblokir? Saya memiliki masalah yang sama dan dapat mengatasinya dengan mengklik kanan file .PS1, Properties dan memilih Unblock.

O-Dogg
sumber
1
Seperti yang saya jelaskan, skrip sedang dibuat langsung di hard drive saya (tidak diunduh dari mana saja), dan saya mengonfirmasi tidak ada aliran alternatif yang mengidentifikasinya sebagai berasal dari zona berbeda (seperti Internet Explorer dan pembuatan browser web lainnya). Jika saya menjalankan 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;saya masih mendapatkan kesalahan bahwa skrip tidak ditandatangani secara digital dan tidak dijalankan. Jika saya membuka dialog Properties untuk file yang baru dibuat, tidak ada yang perlu dibuka.
BACON
48
Apa maksud Anda ~ " Properti dan memilih Buka Blokir "?
IgorGanapolsky
1
@IgorGanapolsky yang mereka maksud di Explorer, cari ps1file klik kanan di atasnya untuk membuka menu konteks dan pilih Properties, pada tab pertama di dekat bagian bawah akan mengatakan file diblokir dan memungkinkan Anda untuk mencentang kotak centang untuk membuka blokirnya.
Lankymart
1
Perhatikan bahwa jika Anda mengunduh file zip, Anda harus membuka blokir file zip sebelum mengekstraknya untuk menghindari pemblokiran massal semua file di dalamnya.
Ohad Schneider
14
@Lankymart Windows 10, mencoba ini, tidak mengatakan itu diblokir.
Alan Baljeu
119

Beberapa hal yang perlu diperiksa:

Bisakah Anda mengubah menjadi tidak terbatas?

Set-ExecutionPolicy Unrestricted

Apakah kebijakan grup sudah ditetapkan?

  • Computer Configuration\Administrative Templates\Windows Components\Windows PowerShell
  • User Configuration\Administrative Templates\Windows Components\Windows PowerShell

Juga, bagaimana Anda memanggil Script.ps1?

Apakah ini memungkinkannya untuk berjalan?

powershell.exe -executionpolicy bypass -file .\Script.ps1
Andy Arismendi
sumber
Nilai default untuk Scopeparameter adalah LocalMachine, jadi Set-ExecutionPolicy Unrestrictedsecara efektif sama dengan yang Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachinesudah saya coba. Ya, Turn on Script Executionkebijakan diaktifkan untuk Computer Configuration. PowerShellterbuka untuk C:\Users\UserName, jadi saya hanya menjalankan .\Desktop\Script.ps1di prompt. Menggunakan jalur absolut menghasilkan kesalahan yang sama, seperti halnya memanggil skrip via powershell.exe.
BACON
Sudahkah Anda mencoba menonaktifkan pengaturan kebijakan grup dan menyegarkan dengan gpupdate /force? (Luncurkan ulang PowerShell.exe setelah)
Andy Arismendi
Nah, untuk waktu yang lama saya menjalankan seperti Unrestrictedpada LocalMachineruang lingkup, tetapi ketika saya mulai menulis skrip, saya ingin menjalankan dari komputer lain, saya mengatur LocalMachinekembali Undefineddan menambahkan Kebijakan Grup saat ini untuk ditetapkan RemoteSignedpada MachinePolicyruang lingkup. Ini hanya skrip pengujian satu kali dan benar-benar bukan masalah besar untuk menjalankannya dari jaringan, saya hanya ingin tahu mengapa itu tidak berfungsi secara lokal. Lagi pula, skrip yang dibuat secara lokal harus diizinkan untuk dijalankan di bawah RemoteSigned, bukan? Saya hanya berpikir pasti ada sesuatu yang saya lewatkan atau tidak saya pahami.
BACON
@BACON Anda benar tentang RemoteSignedmenyimpan Write-Host hidengan notepad ke desktop Anda harus berjalan dengan baik. Konfigurasi Anda juga terlihat baik-baik saja ... Sesuatu tampaknya rusak bagi saya ... itulah sebabnya saya menyarankan untuk menghapus kebijakan grup untuk melihat apakah itu membantu.
Andy Arismendi
1
Untuk pengembangan, kami hanya terbiasa -executionpolicy bypasssementara melewati masalah yang ditandai jarak jauh ... dan yang memungkinkan kami mengungkap & men-debug masalah lain (tidak terkait, yang mengharuskan kami untuk meningkatkan PowerShell).
Doug_Ivison
13

Saya akhirnya melacak ini ke .NET Code Access Security . Saya memiliki beberapa modul biner yang dikembangkan secara internal yang disimpan dan dijalankan dari jaringan bersama. Untuk mendapatkan .NET 2.0 / PowerShell 2.0 untuk memuatnya, saya telah menambahkan aturan URL ke Intranetgrup kode untuk mempercayai direktori itu:

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -listgroups
Microsoft (R) .NET Framework CasPol 2.0.50727.5420
Copyright (c) Microsoft Corporation.  All rights reserved.

Security is ON
Execution checking is ON
Policy change prompt is ON

Level = Machine

Code Groups:

1.  All code: Nothing
    1.1.  Zone - MyComputer: FullTrust
        1.1.1.  StrongName - ...: FullTrust
        1.1.2.  StrongName - ...: FullTrust
    1.2.  Zone - Intranet: LocalIntranet
        1.2.1.  All code: Same site Web
        1.2.2.  All code: Same directory FileIO - 'Read, PathDiscovery'
        1.2.3.  Url - file://Server/Share/Directory/WindowsPowerShell/Modules/*: FullTrust
    1.3.  Zone - Internet: Internet
        1.3.1.  All code: Same site Web
    1.4.  Zone - Untrusted: Nothing
    1.5.  Zone - Trusted: Internet
        1.5.1.  All code: Same site Web

Perhatikan bahwa, bergantung pada versi .NET yang diinstal dan apakah itu Windows 32 atau 64-bit, caspol.exedapat ada di lokasi berikut, masing-masing dengan konfigurasi keamanannya sendiri ( security.config):

  • $Env:SystemRoot\Microsoft.NET\Framework\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\
  • $Env:SystemRoot\Microsoft.NET\Framework\v4.0.30319\
  • $Env:SystemRoot\Microsoft.NET\Framework64\v4.0.30319\

Setelah menghapus grup 1.2.3....

PS> & "$Env:SystemRoot\Microsoft.NET\Framework64\v2.0.50727\caspol.exe" -machine -remgroup 1.2.3.
Microsoft (R) .NET Framework CasPol 2.0.50727.9136
Copyright (c) Microsoft Corporation.  All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Removed code group from the Machine level.
Success

... Saya dibiarkan dengan konfigurasi CAS default dan skrip lokal sekarang berfungsi kembali. Sudah lama sejak saya bermain-main dengan CAS, dan aku tidak yakin mengapa aturan saya tampaknya akan mengganggu orang-orang pemberian FullTrustuntuk MyComputer, tapi karena CAS sudah ditinggalkan sebagai NET 4.0 (yang PowerShell 3.0 didasarkan), saya tebak itu titik diperdebatkan sekarang.

DAGING BABI ASAP
sumber
Bagaimana Anda menambahkan aturan URL? Saya memiliki masalah yang sama dan berharap ini dapat membantu saya menyelesaikannya. Terima kasih.
OptimusPrime
Sudah sangat lama sejak saya bekerja caspol.exe, tetapi setelah menjalankan caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustsaya berakhir dengan 1.2.3.aturan yang sama terlihat dalam jawaban ini. Saya menggunakan file://URL untuk mereferensikan direktori pada berbagi SMB, meskipun saya melihat dalam dokumentasi salah satu -addgroup contoh menggunakan jalur UNC.
BACON
11

Saya menemukan ketika menjalankan file PS1 untuk drive yang Dipetakan ke Dropbox bahwa saya selalu mendapatkan kesalahan ini. Saat membuka properti untuk PS1 tidak ada "Buka blokir".

Satu-satunya hal yang berhasil bagi saya adalah

powershell.exe -executionpolicy bypass -file. \ Script.ps1

GeekMustHave
sumber
1
Anda mengatakan skrip Anda disimpan di drive yang dipetakan ke jaringan berbagi? Atau skrip membuat drive yang dipetakan? Jika yang pertama, seperti yang dinyatakan di badan dan judul pertanyaan, skrip dibuat dan disimpan secara lokal, sehingga asal / zona skrip tidak akan menjadi faktor. Either way, menggunakan Bypasskebijakan eksekusi telah disarankan selama lima tahun yang lalu dan paling baru lima bulan yang lalu . Silahkan baca pertanyaan dan jawaban yang ada sebelum menjawab.
BACON
6

Jika file disalin dari lokasi jaringan, yaitu komputer lain, Windows mungkin telah memblokir file itu. Klik kanan pada file dan klik tombol buka blokir dan lihat apakah itu berfungsi.

malu
sumber
2
Seperti yang saya jelaskan di pertanyaan dan komentar saya di jawaban @ O-Dogg, skrip dibuat langsung di hard drive saya (tidak diunduh dari mana pun), dan saya mengonfirmasi tidak ada aliran alternatif yang mengidentifikasinya sebagai berasal dari zona berbeda (seperti Internet Explorer dan pembuatan browser web lainnya). Jika saya menjalankan 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;saya masih mendapat kesalahan bahwa skrip tidak ditandatangani secara digital dan tidak dieksekusi. Jika saya membuka dialog Properties untuk file yang baru dibuat, tidak ada yang bisa dibuka.
BACON
Patut diperiksa bahwa Anda tidak membuat dan menjalankannya di drive yang dipetakan. Di server kami misalnya, folder utama untuk setiap pengguna adalah drive yang dipetakan ke folder pribadi mereka.
Caltor
0

Ini adalah masalah IDE. Ubah pengaturan di PowerShell GUI. Buka tab Alat dan pilih Opsi, lalu opsi Debugging . Kemudian centang kotak Matikan persyaratan untuk skrip yang akan ditandatangani . Selesai.

bdubb
sumber
OP jelas tidak ingin skrip berjalan tanpa tanda tangan, dan tidak mengacu pada IDE.
kfsone
1
Tidak tersedia di Powershell ISE
Josh Noe
0

Apa yang berhasil bagi saya adalah klik kanan pada file .ps1 dan kemudian properti. Klik tombol "BEBAS". Berfungsi baik bagi saya setelah menghabiskan berjam-jam mencoba mengubah kebijakan.

Mo Zaatar
sumber
1
Sudah ada dua jawaban yang mengabaikan apa yang dinyatakan dalam pertanyaan dan menyarankan solusi yang sama dan tidak dapat diterapkan. Saya menulis dengan sangat jelas "Saya ... menggunakan utilitas aliran Sysinternals dan dialog Properti file untuk mengonfirmasi bahwa skrip tidak diperlakukan sebagai berasal dari Internet" dan kemudian "dibuat dan dijalankan secara lokal". Ia bahkan mengatakan tepat di judul bahwa skrip "dibuat secara lokal". Tidak ada yang bisa dibuka. Jika membuka blokir skrip menyelesaikan masalah Anda, maka Anda tidak memiliki masalah yang sama dengan yang saya alami karena, seperti yang dinyatakan, skrip saya tidak diblokir. -1.
BACON
1
@BACON agar adil, saya memiliki gejala yang sama seperti yang Anda lakukan dan bagi saya pemblokiran berhasil. Meskipun skrip saya dibuat secara lokal, saya harus membuka blokirnya setiap kali setelah menyimpannya.
SQB
Ini mungkin solusi tapi bukan solusi yang benar sepenuhnya
Mo Zaatar
0

Harap buat cadangan untuk file script.bs1

Apa yang berhasil untuk saya adalah menghapus file script.bs1 dan menjalankan perintah eksekusi.

Abstraksi Sederhana
sumber
1
Apa pesan kesalahan yang Anda dapatkan yang diselesaikan dengan melakukan ini?
BACON
Saya telah melewati kesalahan ini 2 kali berbeda dan memperbaikinya dengan cara yang sama. Sepertinya menjalankan perintah eksekusi dari CMD akan langsung dijalankan di file lain dengan nama yang sama tetapi dengan ekstensi (.cmd).
Abstraksi Sederhana
File C: \ Users \ UserName \ Desktop \ Script.ps1 tidak dapat dimuat. File C: \ Users \ UserName \ Desktop \ Script.ps1 tidak ditandatangani secara digital. Skrip tidak akan dijalankan di sistem. ((Script.ps1 bukan kesalahan yang ditandatangani secara digital))
Abstraksi Sederhana
Saya melihat. Dan apa yang dikembalikan saat Anda lari Get-ExecutionPolicy -List?
BACON
MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Abstraksi Sederhana
-1

Pilih Command prompt terminal Anda, bukan Power shell. Seharusnya itu berhasil.

pranav aggarwal
sumber
2
Apa artinya ini? Pilih dimana? Tujuannya adalah untuk menjalankan skrip PowerShell di PowerShell, jadi menggunakan apa pun selain PowerShell tidak akan berfungsi.
BACON
-1

Saat Anda menjalankan skrip .ps1 PowerShell, Anda mungkin mendapatkan pesan yang mengatakan ".ps1 tidak ditandatangani secara digital. Skrip tidak akan dijalankan di sistem. " Untuk memperbaikinya Anda harus menjalankan perintah di bawah ini untuk menjalankan Set-ExecutionPolicy dan mengubah pengaturan Execution Policy.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
Gautam Sharma
sumber
Jawaban lain sudah menyarankan penggunaan Bypasskebijakan eksekusi. Menggunakan kebijakan yang berbeda tidak membantu, bagaimanapun, dan tidak mengatasi masalah sebenarnya jika RemoteSignedmemang diperlukan. Terakhir, pesan kesalahan yang Anda rujuk tidak sama dengan yang ada di pertanyaan.
BACON
-2

Saya mengalami masalah yang sama dan memperbaikinya dengan mengubah program default untuk membuka file .ps1 ke PowerShell. Itu diatur ke Notepad .

Orang baru
sumber
Anda memiliki masalah yang sama? Atau ketika Anda mengklik dua kali .ps1file itu akan terbuka di Notepad alih-alih menjalankan skrip di PowerShell?
BACON
-2

Coba jalankan GUI Powershell sebagai Administrator

Pauline
sumber
3
Seperti yang dinyatakan dalam pertanyaan I am both a domain administrator and a local administrator,. Menjalankan PowerShell yang ditinggikan tidak akan membuat perbedaan karena skrip diizinkan untuk berjalan tanpa relevansi saat disimpan di jaringan bersama.
BACON
-4

Jalankan di bawah 2 perintah di jendela PowerShell

  1. Set-ExecutionPolicy tidak dibatasi

  2. Buka blokir-File -Path D: \ PowerShell \ Script.ps1

Rakesh Dongarwar
sumber
2
Jelas Anda tidak membaca pertanyaan atau tanggapan lama lainnya yang mengusulkan variasi dari solusi yang sama tidak dapat diterapkan ini atau komentar saya yang berulang kali menyatakan bahwa ini bukanlah jawabannya. Saya akan -10 ini jika saya bisa, tetapi saya harus puas dengan -1.
BACON