PowerShell scriptlerinin çalıştırılması nasıl sağlanır?


260

PowerShell betiğimi çalıştırmaya çalıştığımda şu hatayı alıyorum:

C: \ Common \ Scripts \ hello.ps1 dosyası, komut dosyalarının çalıştırılması bu sistemde devre dışı bırakıldığından yüklenemiyor. Daha fazla ayrıntı için lütfen "imzalama hakkında yardım alma" bölümüne bakın.
Satırda: 1 karakter: 13
+. \ Hello.ps1 <<<<
+ CategoryInfo: NotSpecified: (:) [], PSSecurityException
+ FullyQualifiedErrorId: RuntimeException

Yanıtlar:


399
  1. Windows PowerShell'i "Yönetici Olarak Çalıştır" seçeneğiyle başlatın. Yalnızca bilgisayardaki Administrators grubunun üyeleri yürütme ilkesini değiştirebilir.

  2. Aşağıdakileri girerek işaretsiz komut dosyalarını çalıştırmayı etkinleştirin:

    set-executionpolicy remotesigned
    

Bu, yerel bilgisayarınıza yazdığınız imzasız komut dosyalarının ve Internet'ten imzalanmış komut dosyalarının çalıştırılmasına izin verir.

Ayrıca bkz . Microsoft TechNet Kütüphanesinde Komut Dosyaları Çalıştırma .


3
Bu, politikayı kalıcı olarak değiştirecek mi veya bilgisayarımı her yeniden başlattığımda bunu yapmak zorunda mıyım?
Ray

1
@Ray Bu politikayı kalıcı olarak değiştirecek.
Pavel Chuchuva,

1
Bkz @Ray belgeleri . Varsayılan olarak, onu ayarlar LocalMachine. Diğer kapsamları ( CurrentUserveya Process) belirlemek için -Scopeaçıkça iletin.
jpmc26

@PavelChuchuva, bu satırı kastettiğim
senaryomun

@FabioSpaghetti Kodlarınıza bir şey eklemenize gerek yok. Bu komutu sadece adımları izleyerek bir kez uygulayın.
Pavel Chuchuva

74

Varsayılan Yürütme Politikası sınırlı olarak ayarlanmıştır, şunu yazarak görebilirsiniz:

Get-ExecutionPolicy

Sınırsız moda geçmek için aşağıdakileri yazmalısınız:

Set-ExecutionPolicy unrestricted

Bu yardımcı olur umarım


13
Kullanıcıdan, kötü niyetli komut dosyalarını internetten kopyalayıp yapıştırmasını istiyorsanız, gereken imzalama bir anlam ifade eder. Kullanıcının aptal olmadığını varsayarsanız, "yeniden tasarlanmış" herhangi bir güvenlik sağlamaz ve hayatı zorlaştırır.
Guss

@Guss: Bunu test ederken, RemoteSigned'in artık yerel olarak oluşturulan .ps1 dosyalarının imzalanmasını gerektirmediğini ve git kaynak denetimini yerel bir kaynak olarak değerlendirdiğini gördüm.
Joshua,

@Joshua - evet, kesinlikle benim açımdan. Eğer RemoteSignedkopyala, yapıştır engellemez, budala ya da olmayan diğer IE indir yöntemlerini engellemez, o zaman için iyi nedir? Benimle birlikte söyle: "kesinlikle hiçbir şey!". Kodların 100 $ 'lık kod imzalama sertifikasıyla imzalanmasını zorunlu kılmanın bence işe yaramaz, aptalca ve Windows için iyi bir betik dili yapabileceği her şeyi reddediyor. Olduğu söyleniyor, ileriye yönelik yol, kullanıcıların PS komut dosyalarını kullanmak için ne yaptıklarını anlamalarını sağlamaksa, o zaman çok sth olabiliriz ... Nahhhh, bu asla işe yaramayacak ;-)
Guss

@Guss: Windows'ta zaten iyi bir betik dili kullandım. Cygwin, Windows 10'da harika çalışıyor; kelimenin tam anlamıyla, Windows'un önceki sürümlerinde olduğundan çok daha iyi. Ben sadece çoktan yazmış birinin komut dosyalarını çalıştırmak istiyorum.
Joshua,

61

Komut dosyalarını geliştirmek için kullandığım makinemde, yukarıdaki gibi kısıtlamadan kullanacağım. Ancak betiklerimi dağıtırken, bir son kullanıcı makinesine sadece -executionpolicy anahtarını kullanarak powershell'i çağıracağım:

powershell.exe -noprofile -executionpolicy bypass -file .\script.ps1

2
Bu numarayı bir .CMD dosyasındaki polyglot numarasıyla birleştirmek isteyebilirsiniz. Bkz stackoverflow.com/a/8597794/5314
Jay Bazuzi

Güzel! Winrar rarlabs.com
MDMoore313

1
Bu numara Git Bash'den (MINGW32 bash) powershell betiği çalıştırmama izin verdi
Kamil Szot

16

Aşağıdaki komutu kullanarak mevcut ExecutionPolicy'nin durumunu alabiliriz:

Get-ExecutionPolicy;

Varsayılan olarak Sınırlıdır . PowerShell Komut Dosyalarının yürütülmesine izin vermek için bu ExecutionPolicy'yi Baypas veya Kısıtlanmamış olarak ayarlamamız gerekir .

Geçerli Kullanıcı için politikayı , aşağıdaki PowerShell komutundan herhangi birini kullanarak Bypassveya şu şekilde ayarlayabiliriz Unrestricted:

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

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

Sınırsız ilke tüm yapılandırma dosyalarını yükler ve tüm komut dosyalarını çalıştırır. İnternetten indirilen işaretsiz bir betiği çalıştırırsanız, çalıştırmadan önce izin almanız istenir.

Oysa Baypas politikası, hiçbir şey bloke ve komut yürütme sırasında hiçbir uyarı veya istemleri vardır edilir. Bypass ExecutionPolicy, Sınırsız'dan daha rahat.


5

Windows sürümüne ve yapılandırmasına bağlı olarak, Unrestrictedmodda bile olsa aşağıdaki uyarıyı alabilirsiniz :

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")

Çözüm, aşağıdaki komutla etkinleştirilmiş olan "bypass" politikasını kullanmaktır:

Set-ExecutionPolicy Bypass

Gönderen belgeler :

Bypass: Hiçbir şey engellenmez ve uyarı veya istem yoktur.

Bu açıkçası güvensiz, lütfen ilgili riskleri anlayın.


betiğimi powershell 2.0 ile bir WINE ortamında çalıştırmamın tek yolu buydu. Teşekkür ederim.
Wyatt8740

@ Wyatt8740: Çünkü şarap bütün sürücüleri ağ sürücüsü olarak sunar.
Joshua,

@Joshua Hiçbir fikrim yoktu. Bana bu ifade için bir kaynak verebilir misiniz? Ben rahat bir google denedim, ama ben kesinlikle yanlış arıyorum.
Wyatt8740

@ Wyatt8740: Kaynak: Wine OpenFileName ortak iletişim kutusu. Sürücü simgelerine bakın.
Joshua,

@Joshua Bir kaynak kod kaynağı demek istedim; Simgeler muhtemelen keyfidir. Ama bunu düşünmedim; Sanırım başlamak için iyi bir yer (düzenleme: buradaymış gibi görünmüyor .)
Wyatt8740

2

Ile bir reg anahtarı:
Windows Kayıt Defteri Düzenleyicisi Sürüm 5.00

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

ve:

Windows Registry Editor Version 5.00

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

gerçekten de çalışıyor.


1

Bazı nedenlerden dolayı PowerShell cmdlet'i yalnızca yerel kullanıcı bağlamı için yerel olarak yerel yürütmeyi etkinleştirmedi. Örneğin, kendi kullanıcı bağlamında çalışan CygWin'in bash isteminin içinden bir Powershell betiği başlatmayı denersem, "dijital olarak imzalanmadı" hatası vererek çalışmaz. Cevap, Yerel Grup İlkesi Düzenleyicisi -> Yerel Bilgisayar İlkesi -> Yönetim Şablonları -> Windows Bileşenleri -> Windows PowerShell'e gitmek ve 'Komut Dosyası Çalıştırmasını Aç' seçeneğini çift tıklamak oldu. Bu daha sonra 'Enabled' olarak değiştirmeme izin ver ve ardından "Yerel komut dosyalarına ve uzak imzalı komut dosyalarına izin ver" in yürütme politikasını kullanmaya başla ve kullanıcı bağlamından bağımsız olarak global olarak çalışmasını sağla.


0

Kabul edilen cevap doğru, ancak politika değişikliği yalnızca Powershell’in şu anda çalışan örneği için kullanılabilir; yani, Powershell’in örneği kapatıldığında. Politika sıfırlanacak. Bir kullanıcı başka bir Powershell örneğini yeniden açarsa, varsayılan politika uygulanır;Restricted

Benim için bir şeyler inşa etmek için VisualStudio Kod konsolunu ve g ++ 'dan cygwin'i kullanmam gerekiyor. Konsol, Powershell'i kullanıyor, varsayılan politika ile hiçbir şey yapılamıyor. Çözümlerden biri, konsolun VisualStudio Kod konsolunda her ateşlenişinde politikayı değiştirmesi, belki de politikayı değiştiren bir betik.

Tembelim, bu yüzden başka bir çözüm Powershell'i yönetici modunda çalıştırdığımda, kabul edilen cevabın yaptığı gibi. ancak kayıt defteri tablosundaki değerleri değiştiren fazladan bir parametre ile. Bir kez yapıldı. Diğer Powershell örnekleri, RemoteSignedpolitikayı varsayılan olarak kullanır.

set-executionpolicy remotesigned -Scope CurrentUser


0

Politikayı (doğru) belirlemek en iyi seçimdir ancak yönetilen sistemlerimde bu politikayı değiştirme yeteneğim yok.

Benim için, politikayı değiştirmenin en basit yolu "PowerShell ISE" deki betiği açmak, yürütmek için kodu (veya kodun bir kısmını) vurgulamak ve ardından "Seçimi Çalıştır" düğmesini (veya F8'i kullanmak) tıklamaktır. kısayol).

Bu en iyi çözüm değildir ve görevleri otomatikleştirmek için çok az şey yapar, ancak IS departmanımdan bir hata mesajı almazken PowerShell kullanımına ve faydasına izin veriyor.


-2

Reg tuşunun çalışmasının nedeni, PS komutlarının yaptığı şeyi yapmasıdır. Komutlar değişiklikleri reg tuşlarına yazar. Komutlar bir reg anahtarı oluşturmaktan veya kayıt defterine kazmaktan çok daha hızlı ve kolaydır.


1
Bu sadece yanlıştır: Başka cevaplarda belirtilen anahtarlar powershells yürütme politikasını değiştirir, bu durumda powershell betiğinin çalışmasını sağlar.
Patrick R.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.