Yerel olarak oluşturulan komut dosyamın RemoteSigned yürütme ilkesi altında çalışmasına neden izin verilmiyor?


99

Bu soru, soru gövdesi tarafından reddedilen veya asıl soruna değinmeyen yanıtları çekmeye devam ettiğinden, lütfen bilmeniz gerekenlerin bu basit özetini okuyun :

  • Bu değil bir "Neden PowerShell benim varsayılan yükleme çalışmayacak komut?" soru.
  • Bu değil bir "Neden PowerShell çalıştırma komut benim yükleme internetten indirilen olmaz?" soru.
  • Soru, RemoteSignedyürütme politikasının neden olmaması gerektiği halde komut dosyasının yürütülmesini engellediğidir.
  • RemoteSignedolduğu tek Kullanmak istediğim yürütme politikası. Diğer, daha az kısıtlayıcı politikaların mevcut olduğunun farkındayım. Bu politikalar kabul edilebilir ikameler olsaydı, bunun yerine onları kullanırdım ve bu soru olmazdı.
  • Yürütme politikası zaten olarak ayarlanmıştır RemoteSigned. Onu değiştirme RemoteSignediçin RemoteSignedbir çözüm değildir.
  • Komut dosyası yerel olarak oluşturulur ve saklanır.
  • Komut dosyası engellenmemiş. Komut dosyası asla engellenmedi (önceki noktaya bakın).
  • Betik dosyası engeli kaldırılamaz çünkü engeli kaldırılacak bir şey yoktur (önceki noktaya bakın).
  • Komut dosyası bir yönetici tarafından yürütülür (yapılmaya çalışılır).
  • Windows PowerShellilgili tek uygulamadır. Değil Windows PowerShell ISEne de Command Promptne de başka araçlar veya editörler ilgilidir.
  • Sorunun nedeni zaten tespit edildi (kabul edilen cevaba bakın). Yaklaşık 8 yıl sonra, uygulanabilir olsun veya olmasın diğer tüm bariz açıklamaların da yayınlandığını düşünüyorum. Eğer aksini düşünüyorsanız, lütfen soruyu ve mevcut cevapları , sizinkini eklemeden önce tamamını okuyun .

64 bit Windows 7 Professional'da Windows PowerShell 2.0 kullanıyorum. DesktopÇalıştırmaya çalıştığımda aşağıdaki hataya neden olan bir komut dosyam var:

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

Hem bir etki alanı yöneticisi hem de yerel bir yöneticiyim ve çalıştırırsam Get-ExecutionPolicy -List, Group Policy ObjectPowerShell'i yapılandırmak için oluşturduğumun, RemoteSignedyürütme ilkesini makine düzeyinde doğru şekilde uyguladığını görebiliyorum :

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

Ben Komut dosyasını kendim yarattı Notepadve kullanılan Sysinternals ' streamsprogramı ve dosya Propertieskomut internetten kaynaklı olduğu tedavi altına değil onaylamak için iletişim. Komut dosyasını bir etki alanı sunucusundaki bir ağ paylaşımına kopyalarsam, yürütülmesine izin verilir. Çalıştırırsam Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine, yerel komut dosyasının yürütülmesine hala izin verilmiyor, bu da kapsamdaki yürütme politikası MachinePolicyöncelikli olacağından mantıklı geliyor .

about_Execution_Policies( Güncel ; söz konusu zamanda ) tarafından belgelendiği üzere , RemoteSignedpolitika şu anlama gelir:

  • Komut dosyaları çalışabilir.

  • İnternetten indirilen komut dosyaları ve yapılandırma dosyalarında (e-posta ve anlık mesajlaşma programları dahil) güvenilir bir yayıncıdan dijital imza gerektirir.

  • Çalıştırdığınız ve yerel bilgisayara (İnternetten indirilmemiş) yazdığınız komut dosyalarında dijital imza gerektirmez.

  • İnternet dışındaki kaynaklardan imzasız komut dosyaları çalıştırma riskleri ve imzalı ancak kötü niyetli komut dosyaları.

Komut dosyam imzalı değil, ancak hem yerel olarak oluşturulduğu hem de yürütüldüğü için yukarıdaki üçüncü madde işaretini karşılaması gerekiyor. Bu nedenle ...

  • Komut dosyamın çalıştırılmasına neden izin verilmiyor?
  • PowerShell neden komut dosyamın "dijital olarak imzalanmadığından" şikayet ediyor, bu gereksinim yalnızca İnternet'teki dosyalar için geçerliyken?
  • PowerShell neden komut dosyasının bir ağ paylaşımından çalıştırıldığında imzalanmamasını artık umursamıyor?

1
@Downvoter: neden bir neden belirtmek ister misiniz?
BACON

Yanıtlar:


125

Dosya engelleniyor mu? Aynı sorunu yaşadım ve .PS1 dosyasına sağ tıklayarak ve Engellemeyi Kaldır'ı seçerek çözebildim.


1
Açıkladığım gibi, komut dosyası doğrudan sabit sürücümde oluşturuluyor (herhangi bir yerden indirilmiyor) ve onu farklı bir bölgeden (Internet Explorer ve diğer web tarayıcılarının oluşturduğu gibi) tanımlayan alternatif akışlar olmadığını doğruladım. Çalıştırırsam, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;hala komut dosyasının dijital olarak imzalanmadığı ve çalıştırılmadığı hatasını alıyorum. Yeni oluşturulan dosya için Özellikler iletişim kutusunu açarsam, engelini kaldıracak bir şey kalmaz.
BACON

48
Ne demek ~ " Özellikler ve Engellemeyi Kaldır "?
IgorGanapolsky

1
@IgorGanapolsky Explorer'da demek istiyorlar ps1, içerik menüsünü açmak için dosyayı sağ tıklayın ve seçin Properties, alt tarafa yakın ilk sekmede dosyanın engellendiğini söyleyecek ve engelini kaldırmak için bir onay kutusunu işaretlemenize izin verecek.
Lankymart

1
Bir zip dosyası indirdiyseniz, içindeki tüm dosyaların bloklarının toplu olarak kaldırılmasını önlemek için sıkıştırmadan önce zip dosyasının engelini kaldırmanız gerektiğini unutmayın.
Ohad Schneider

14
@Lankymart Windows 10 bunu denedi, engellendiğini söylemiyor.
Alan Baljeu

119

Kontrol edilecek bazı şeyler:

Sınırsız olarak değiştirebilir misin?

Set-ExecutionPolicy Unrestricted

Grup politikası belirlendi mi?

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

Ayrıca, Script.ps1'i nasıl çağırıyorsunuz?

Bu çalışmasına izin veriyor mu?

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

ScopeParametrenin varsayılan değeri LocalMachine, bu nedenle zaten denediğimle Set-ExecutionPolicy Unrestrictedaynıdır Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine. Evet, Turn on Script Executionpolitika etkinleştirildi Computer Configuration. PowerShellolarak açılıyor C:\Users\UserName, bu yüzden .\Desktop\Script.ps1komut isteminde çalıştırıyorum . Mutlak yolu kullanmak, komut dosyası aracılığıyla çağırmakla aynı hatayı verir powershell.exe.
PAKON

Grup ilkesi ayarını devre dışı bırakmayı ve ile yenilemeyi denediniz gpupdate /forcemi? (Ardından PowerShell.exe'yi yeniden başlatın)
Andy Arismendi

Eh, uzun bir ben olarak çalışırken Unrestrictedde LocalMachinekapsam, ama diğer bilgisayarlardan çalıştırmak istediğini senaryo yazmaya başladığımda set LocalMachinegeri Undefinedve sete akım Grup İlkesi eklendi RemoteSignedat MachinePolicykapsam. Bu sadece tek seferlik bir test betiği ve onu ağdan çalıştırmak gerçekten önemli değil, sadece neden yerel olarak çalışmadığını bilmek istiyorum . Sonuçta, yerel olarak oluşturulmuş bir betiğin altında çalışmasına izin verilmelidir RemoteSigned, değil mi? Eksik ya da anlamadığım bir şey olmalı diye düşündüm.
PAKON

@BACON Not defteri ile masaüstünüze RemoteSignedkaydetme konusunda haklısınız, düzgün çalışmalıdır Write-Host hi. Yapılandırmanız da iyi görünüyor ... Bana bir şeyler bozuk geliyor ... bu yüzden yardımcı olup olmadığını görmek için grup politikasını kaldırmayı önerdim.
Andy Arismendi

1
Geliştirme için, -executionpolicy bypassuzaktan imzalanan sorunu geçici olarak aşardık ... ve bu, diğer sorunları (ilgisiz, PowerShell'i yükseltmemizi gerektiren) ortaya çıkarmamıza ve hatalarını ayıklamamıza izin verir.
Doug_Ivison

13

Sonunda bunu .NET Kod Erişim Güvenliği'ne kadar izledim . Bir ağ paylaşımında depolanan ve buradan çalıştırılan dahili olarak geliştirilmiş bazı ikili modüllerim var. Bunları yüklemek için .NET 2.0 / PowerShell 2.0'ı edinmek için, Intranetbu dizine güvenmek için kod grubuna bir URL kuralı ekledim :

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

Hangi .NET sürümlerinin yüklü olduğuna ve 32 veya 64 bit Windows caspol.exeolmasına bağlı olarak, her biri kendi güvenlik yapılandırmasına ( security.config) sahip aşağıdaki konumlarda bulunabileceğini unutmayın ( ):

  • $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\

Grubu sildikten sonra 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

... Varsayılan CAS yapılandırmasına bırakıldım ve yerel betikler şimdi yeniden çalışıyor. Bir süre ben CAS tinkered ve benim kural olanlar verilmesi müdahale ediyor gibi görünmektedir neden emin değilim beri oldu FullTrustiçin MyComputer, ancak o zamandan beri CAS .NET 4.0 itibariyle önerilmemektedir (PowerShell 3.0 dayandığı), ben Sanırım artık tartışmalı bir nokta.


Bir URL kuralı nasıl eklediniz? Aynı sorunu yaşadım ve bunun çözmeme yardımcı olacağını umuyorum. Teşekkürler.
OptimusPrime

Üzerinde çalışmayalı çok uzun zaman oldu caspol.exe, ancak koştuktan sonra bu yanıtta görülen kuralı caspol.exe -machine -addgroup 1.2 -url file://Server/Share/Directory/WindowsPowerShell/Modules/* FullTrustbuldum 1.2.3.. file://Bir SMB paylaşımındaki bir dizine başvurmak için bir URL kullanıyordum , ancak belgelerde -addgroup örneklerden birinin UNC yolunu kullandığını görüyorum .
PASTA

12

Dropbox'a Eşlenmiş bir sürücü için bir PS1 dosyası çalıştırırken her zaman bu hatayı aldığımı öğrendim. PS1 için özellikler açılırken "Engellemeyi Kaldır" yoktur.

Benim için çalışan tek şey

powershell.exe -yürütme politikası atlama -dosya. \ Script.ps1


1
Komut dosyanızın bir ağ paylaşımıyla eşlenen bir sürücüde depolandığını mı söylüyorsunuz? Veya komut dosyası eşlenmiş bir sürücü mü oluşturur? İlki, sorunun gövdesinde ve başlığında belirtildiği gibi, komut dosyası yerel olarak oluşturulmuş ve depolanmışsa, komut dosyasının kaynağı / bölgesi bir faktör olmayacaktır. Her iki durumda da, Bypassyürütme politikasının kullanılması zaten beş yıl önce ve en yakın zamanda beş ay önce önerilmişti . Lütfen cevaplamadan önce soruyu ve mevcut cevapları okuyun.
BACON

6

Dosya bir ağ konumundan, yani başka bir bilgisayardan kopyalanmışsa, Windows bu dosyayı engellemiş olabilir. Dosyaya sağ tıklayın ve engellemeyi kaldır düğmesine tıklayın ve çalışıp çalışmadığını görün.


2
Hem soruda hem de @ O-Dogg'un cevabıyla ilgili yorumumda açıkladığım gibi, komut dosyası doğrudan sabit diskimde oluşturuluyordu (herhangi bir yerden indirilmiyordu) ve onu farklı bir bölgeden geldiğini belirten alternatif akışlar olmadığını doğruladım (Internet Explorer ve diğer web tarayıcıları gibi). Çalıştırırsam, 'Write-Host ''Hello, World!'';' > .\Test.ps1; .\Test.ps1;hala komut dosyasının dijital olarak imzalanmadığı ve çalıştırılmadığı hatasını alıyorum. Yeni oluşturulan dosya için Özellikler iletişim kutusunu açarsam, engelini kaldıracak hiçbir şey yoktu.
BACON

Oluşturmadığınız ve eşlenmiş bir sürücüde çalıştırmadığınız kontrol etmeye değer. Sunucularımızda, örneğin her kullanıcının ana klasörü, kişisel klasörlerine eşlenmiş bir sürücüdür.
Caltor

0

Bu bir IDE sorunudur. PowerShell GUI'deki ayarı değiştirin. Git Araçlar sekmesi ve Seçenekler seçin ve sonra seçenekleri ayıklama . Ardından, imzalanacak komut dizileri için gereksinimi kapat kutusunu işaretleyin . Bitti.


OP açıkça betiklerin imzasız çalışmasını istemiyor ve IDE'ye başvurmuyor.
kfsone

1
Powershell ISE'de mevcut değil
Josh Noe

0

Benim için işe yarayan şey, .ps1 dosyasına ve ardından özelliklere sağ tıklamaktı. "ENGELLEMEYİ KALDIR" düğmesini tıklayın. Politikaları değiştirmeye çalışarak saatler harcadıktan sonra harika çalışıyor.


1
Soruda belirtilenleri görmezden gelen ve bu aynı uygulanamaz çözümü öneren zaten iki cevap var. Çok net bir şekilde yazdım "Ben ... betiğin İnternet'ten geliyormuş gibi değerlendirilmediğini doğrulamak için Sysinternals'ın akış yardımcı programını ve dosya Özellikleri iletişim kutusunu kullandım" ve sonra "hem yerel olarak oluşturuldu hem de çalıştırıldı". Hatta başlıkta betiğin "yerel olarak oluşturulmuş" olduğunu söylüyor. Engelini kaldıracak hiçbir şey yok. Betiğinizin engellemesini kaldırmak sorununuzu çözdüyse, benimle aynı sorunu yaşamadınız çünkü belirtildiği gibi, betiğim engellenmedi. -1.
PAKON

1
@BACON adil olmak gerekirse, seninle aynı semptomları yaşadım ve benim için engellemeyi kaldırma işe yaradı. Komut dosyamın yerel olarak oluşturulduğunu düşünseniz bile, kaydettikten sonra her defasında engelini kaldırmak zorunda kaldım .
SQB

Bu belki bir geçici çözüm olabilir, ancak tam doğru çözüm değil
Mo Zaatar

0

Lütfen script.bs1 dosyası için bir yedek oluşturun

Benim için işe yarayan şey, script.bs1 dosyasını silmek ve yürütme komutunu çalıştırmaktı.


1
Bunu yaparak çözdüğünüz hata mesajı nedir?
PAKON

Bu hatayı 2 farklı kez geçtim ve aynı şekilde düzelttim. CMD'den yürütme komutunun çalıştırılması, aynı ada sahip ancak (.cmd) uzantısına sahip diğer dosyada hemen çalışacak gibi görünüyor.
Basit Soyutlama

Dosya C: \ Kullanıcılar \ KullanıcıAdı \ Masaüstü \ Script.ps1 yüklenemiyor. C: \ Kullanıcılar \ KullanıcıAdı \ Masaüstü \ Script.ps1 dosyası dijital olarak imzalanmamış. Komut dosyası sistemde çalışmayacaktır. ((Script.ps1 dijital olarak imzalanmadı hatası))
Basit Soyutlama

Anlıyorum. Ve koştuğunuzda ne iade edilir Get-ExecutionPolicy -List?
PAKON

MachinePolicy AllSigned, UserPolicy Undefined, Process Undefined, CurrentUser RemoteSigned, LocalMachine Bypass
Simple Abstraction

-1

Power shell yerine terminal Komut isteminizi seçin. Bu çalışmalı.


2
Bu ne anlama geliyor? Nerede seçilsin? Amaç, PowerShell'de bir PowerShell betiği çalıştırmaktı, bu nedenle PowerShell dışında herhangi bir şey kullanmak işe yaramazdı.
BACON

-1

Bir .ps1 PowerShell betiğini çalıştırdığınızda, “.ps1 dijital olarak imzalanmamış. Komut dosyası sistemde çalışmayacak. " Düzeltmek için Set-ExecutionPolicy'yi çalıştırmak ve Yürütme İlkesi ayarını değiştirmek için aşağıdaki komutu çalıştırmanız gerekir.

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

Başka bir cevap zaten Bypassyürütme politikasını kullanmayı öneriyor . Zaten farklı bir politika kullanmak yardımcı olmaz ve RemoteSignedgerçekten gerekliyse asıl sorunu ele almaz . Son olarak, başvurduğunuz hata mesajı sorudakiyle aynı değildir.
BACON

-2

Aynı sorunu yaşıyordum ve varsayılan programı .ps1 dosyalarını PowerShell olarak açacak şekilde değiştirerek düzelttim. Not Defteri olarak ayarlandı .


Aynı sorunu yaşadınız mı? Veya .ps1PowerShell'de komut dosyasını çalıştırmak yerine Not Defteri'nde açılacak bir dosyaya çift ​​tıkladığınızda ?
BACON

-2

Powershell GUI'yi Yönetici olarak çalıştırmayı deneyin


3
Soruda belirtildiği gibi I am both a domain administrator and a local administrator. PowerShell'i yükseltilmiş olarak çalıştırmak, komut dosyasının bir ağ paylaşımında depolandığında güncellenmeden çalışmasına izin verildiğinden bir fark yaratmaz.
BACON

-4

PowerShell penceresinde 2 komutun altında çalıştırın

  1. Set-ExecutionPolicy sınırsız

  2. Engellemeyi Kaldır-Dosya-Yol D: \ PowerShell \ Script.ps1


2
Açıkçası, bu aynı uygulanamaz çözümün varyasyonlarını öneren soruyu veya diğer yıllık yanıtları veya yanıtın bu olmadığını tekrar tekrar belirten yorumlarımı okumadınız. Yapabilseydim bunu -10 yapardım, ama bunun yerine -1 ile razı olmak zorunda kalacağım.
BACON
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.