วิธีการเปิดใช้งานการดำเนินการของสคริปต์ PowerShell


260

เมื่อฉันพยายามเรียกใช้สคริปต์ PowerShell ฉันได้รับข้อผิดพลาดนี้:

ไฟล์ C: \ Common \ Scripts \ hello.ps1 ไม่สามารถโหลดได้เนื่องจากการดำเนินการของสคริปต์ถูกปิดใช้งานในระบบนี้ โปรดดู "รับความช่วยเหลือเกี่ยวกับการลงชื่อ" สำหรับรายละเอียดเพิ่มเติม
ที่บรรทัด: 1 อักขระ: 13
+. \ hello.ps1 <<<<
+ CategoryInfo: ไม่ระบุ: (:) [], PSSecurityException
+ อย่างเต็มรูปแบบข้อผิดพลาดรหัส: RuntimeException

คำตอบ:


399
  1. เริ่ม Windows PowerShell ด้วยตัวเลือก "Run as Administrator" เฉพาะสมาชิกของกลุ่ม Administrators บนคอมพิวเตอร์เท่านั้นที่สามารถเปลี่ยนนโยบายการดำเนินการได้

  2. เปิดใช้งานการเรียกใช้สคริปต์ที่ไม่ได้ลงชื่อโดยป้อน:

    set-executionpolicy remotesigned
    

วิธีนี้จะช่วยให้เรียกใช้สคริปต์ที่ไม่ได้ลงชื่อซึ่งคุณเขียนไว้ในคอมพิวเตอร์ของคุณและสคริปต์ที่ลงชื่อจากอินเทอร์เน็ต

ดูการรันสคริปต์ได้ที่ Microsoft TechNet Library


3
สิ่งนี้จะเปลี่ยนนโยบายอย่างถาวรหรือฉันต้องทำเช่นนี้ทุกครั้งที่รีสตาร์ทคอมพิวเตอร์หรือไม่
Ray

1
@Ray สิ่งนี้จะเปลี่ยนนโยบายอย่างถาวร
Pavel Chuchuva

1
@Ray ดูเอกสาร LocalMachineโดยค่าเริ่มต้นจะกำหนดมันเป็น หากต้องการตั้งค่าสำหรับขอบเขตอื่น ๆ ( CurrentUserหรือProcess) ให้ผ่าน-Scopeอย่างชัดเจน
jpmc26

@PavelChuchuva ฉันควรเพิ่มบรรทัดนี้ด้านบนของสคริปต์ของฉันคุณหมาย
FabioSpaghetti

@FabioSpaghetti ไม่จำเป็นต้องเพิ่มอะไรลงในสคริปต์ของคุณ เพียงดำเนินการคำสั่งนั้นเพียงครั้งเดียวโดยทำตามขั้นตอน
Pavel Chuchuva

74

นโยบายการดำเนินการเริ่มต้นถูกตั้งค่าเป็น จำกัด คุณสามารถดูได้โดยพิมพ์:

Get-ExecutionPolicy

คุณควรพิมพ์ข้อความต่อไปนี้เพื่อให้เข้าสู่โหมดไม่ จำกัด :

Set-ExecutionPolicy unrestricted

หวังว่านี่จะช่วยได้


13
การเซ็นชื่อที่จำเป็นต้องใช้หากคุณคาดหวังให้ผู้ใช้คัดลอกและวางสคริปต์ที่เป็นอันตรายจากอินเทอร์เน็ต หากคุณคิดว่าผู้ใช้นั้นไม่ใช่คนโง่ "remotesigned" จะไม่เพิ่มความปลอดภัยใด ๆ และทำให้ชีวิตลำบาก
Guss

@Guss: จากการทดสอบพบว่า RemoteSigned ไม่ต้องการไฟล์. ps1 ที่สร้างขึ้นในเครื่องที่จะลงนามและมันจะถือว่าควบคุมแหล่ง git เป็นแหล่งท้องถิ่น
โจชัว

@ โจชัว - ใช่จุดของฉันอย่างแน่นอน หากRemoteSignedไม่บล็อกคัดลอก & วางไม่ปิดกั้น git หรือวิธีการดาวน์โหลดอื่น ๆ ที่ไม่ใช่ IE แล้วจะมีประโยชน์อย่างไร พูดกับฉัน: "ไม่มีอะไรแน่นอน!" ฉันคิดว่าการกำหนดให้สคริปต์ต้องเซ็นชื่อด้วยใบรับรองการเซ็นรหัส $ 100 นั้นไร้ประโยชน์โง่และคัดค้านสิ่งดีทั้งหมดที่ภาษาสคริปต์ที่ดีสามารถทำได้สำหรับ Windows ที่ถูกกล่าวว่าถ้าทางข้างหน้าคือการได้รับผู้ใช้สามารถเข้าใจสิ่งที่พวกเขากำลังทำเพื่อที่จะใช้สคริปต์ PS แล้วเราอาจจะอยู่ในเกินไปฏ ... Nahhhh ว่าจะไม่ทำงาน ;-)
Guss

@Guss: ฉันมีภาษาสคริปต์ที่ดีใน Windows แล้ว Cygwin ใช้งานได้ดีบน Windows 10; เหมือนตัวอักษรที่ดีกว่า Windows รุ่นก่อน ๆ อย่างมาก ฉันแค่อยากจะหนีจากคนอื่นที่เขียนไปแล้ว
โจชัว

61

บนเครื่องของฉันที่ฉันใช้ในการพัฒนาสคริปต์ฉันจะใช้ - ไม่ จำกัด ดังกล่าว อย่างไรก็ตามเมื่อทำการปรับใช้สคริปต์ของฉันไปยังเครื่องผู้ใช้ปลายทางฉันจะเรียก powershell ด้วยสวิตช์ -executionpolicy:

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

2
คุณอาจต้องการรวมเคล็ดลับนี้เข้ากับเคล็ดลับหลายภาษาในไฟล์. CMD ดูstackoverflow.com/a/8597794/5314
Jay Bazuzi

ดี! ฉันใช้งาน sfx โดย winrar rarlabs.com
MDMoore313

1
เคล็ดลับนั้นทำให้ฉันสามารถเรียกใช้สคริปต์ PowerShell จาก Git Bash (MINGW32 bash)
Kamil Szot

16

เราสามารถรับสถานะ ExecutionPolicy ปัจจุบันโดยคำสั่งด้านล่าง:

Get-ExecutionPolicy;

โดยปกติแล้วมันจะถูก จำกัด ที่จะช่วยให้การดำเนินการของสคริป PowerShell ที่เราต้องตั้ง ExecutionPolicy นี้ไม่ว่าจะเป็นทางอ้อมหรือไม่ จำกัด

เราสามารถกำหนดนโยบายสำหรับผู้ใช้ปัจจุบันเป็นBypassหรือUnrestrictedโดยใช้คำสั่ง PowerShell ด้านล่าง:

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

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

นโยบายที่ไม่ จำกัดจะโหลดไฟล์การกำหนดค่าทั้งหมดและเรียกใช้สคริปต์ทั้งหมด หากคุณเรียกใช้สคริปต์ที่ไม่ได้ลงชื่อซึ่งดาวน์โหลดจากอินเทอร์เน็ตคุณจะได้รับแจ้งให้ขออนุญาตก่อนที่จะรัน

ในขณะที่นโยบายบายพาสไม่มีสิ่งใดถูกบล็อกและไม่มีคำเตือนหรือพร้อมท์ระหว่างการเรียกใช้งานสคริปต์ บายพาส ExecutionPolicy ผ่อนคลายมากขึ้นกว่าไม่ จำกัด


5

คุณอาจได้รับคำเตือนดังต่อไปนี้แม้ในUnrestrictedโหมด: ทั้งนี้ขึ้นอยู่กับรุ่นและการกำหนดค่า Windows

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

ทางออกคือการใช้นโยบาย "บายพาส" เปิดใช้งานด้วยคำสั่งต่อไปนี้:

Set-ExecutionPolicy Bypass

จากเอกสาร :

บายพาส: ไม่มีสิ่งใดถูกบล็อคและไม่มีคำเตือนหรือพรอมต์

เห็นได้ชัดว่าไม่ปลอดภัยโปรดเข้าใจความเสี่ยงที่เกี่ยวข้อง


นี่เป็นวิธีเดียวที่ฉันสามารถเรียกใช้สคริปต์ของฉันในสภาพแวดล้อม WINE ด้วย powershell 2.0 ขอขอบคุณ.
Wyatt8740

@ Wyatt8740: เพราะไวน์นำเสนอไดรฟ์ทั้งหมดเป็นไดรฟ์เครือข่าย
โจชัว

@ โจชัวฉันไม่ทราบ คุณสามารถให้แหล่งที่มาสำหรับคำสั่งนั้นได้หรือไม่? ฉันลองใช้ google แบบสบาย ๆ แต่เห็นได้ชัดว่าฉันผิด
Wyatt8740

@ Wyatt8740: แหล่งที่มา: กล่องโต้ตอบทั่วไป OpenFileName ของไวน์ ดูไอคอนไดรฟ์
Joshua

@Joshua ฉันหมายถึงซอร์สโค้ด ไอคอนอาจมีข้อได้เปรียบ แต่ฉันไม่คิดอย่างนั้น ฉันเดาว่าเป็นสถานที่ที่ดีในการเริ่มต้น (แก้ไข: ดูไม่เหมือนที่นี่ )
Wyatt8740

2

คีย์ reg ด้วย:
Windows Registry Editor เวอร์ชัน 5.00

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Windows \ PowerShell] "EnableScripts" = dword: 00000001 "ExecutionPolicy" = "บายพาส"

และ:

Windows Registry Editor Version 5.00

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

ใช้ได้จริงเช่นกัน


1

ด้วยเหตุผลบางอย่าง PowerShell cmdlet ไม่ได้เปิดใช้งานการประมวลผลในเครื่องทั่วโลกเพียงเพื่อบริบทผู้ใช้ท้องถิ่น ถ้าฉันพยายามเริ่มต้นสคริปต์ Powershell จากภายใน bash prompt ของ CygWin ซึ่งทำงานภายใต้บริบทของผู้ใช้มันจะไม่ทำงานโดยให้ข้อผิดพลาด "ไม่ได้ลงชื่อด้วยระบบดิจิทัล" คำตอบคือไปที่ตัวแก้ไขนโยบายกลุ่มภายในเครื่อง -> นโยบายคอมพิวเตอร์เฉพาะที่ -> เทมเพลตการดูแลระบบ -> คอมโพเนนต์ Windows -> Windows PowerShell และดับเบิลคลิกที่ 'เปิดการดำเนินการสคริปต์' จากนั้นให้ฉันเปลี่ยนเป็น 'เปิดใช้งาน' จากนั้นนโยบายการดำเนินการของ "อนุญาตสคริปต์ท้องถิ่นและสคริปต์ที่เซ็นชื่อระยะไกล" และทำให้มันทำงานได้ทั่วโลกโดยไม่คำนึงถึงบริบทของผู้ใช้


0

คำตอบที่ยอมรับนั้นถูกต้อง แต่การแก้ไขนโยบายจะมีให้เฉพาะสำหรับอินสแตนซ์ที่ทำงานอยู่ในปัจจุบันของ Powershell ซึ่งหมายถึงเมื่ออินสแตนซ์ของ Powershell ถูกปิด นโยบายจะถูกรีเซ็ต หากผู้ใช้เปิด Powershell อีกครั้งนโยบายเริ่มต้นจะถูกนำไปใช้ซึ่งก็คือRestricted

สำหรับฉันฉันต้องใช้คอนโซล VisualStudio Code และ g ++ จาก cygwin เพื่อสร้างสิ่งต่าง ๆ คอนโซลกำลังใช้ Powershell ด้วยนโยบายเริ่มต้นไม่สามารถทำอะไรได้ ทางออกหนึ่งคือการเปลี่ยนนโยบายทุกครั้งที่มีการใช้คอนโซลในคอนโซล VisualStudio Code ซึ่งอาจเป็นสคริปต์ของการเปลี่ยนแปลงนโยบาย

ฉันขี้เกียจดังนั้นอีกวิธีหนึ่งคือเมื่อฉันเรียกใช้ Powershell ในโหมดผู้ดูแลระบบซึ่งคล้ายกับคำตอบที่ยอมรับ แต่ด้วยพารามิเตอร์พิเศษซึ่งเปลี่ยนค่าในตารางรีจิสทรี เมื่อเสร็จแล้ว อินสแตนซ์อื่น ๆ ของ Powershell จะใช้RemoteSignedนโยบายเป็นค่าเริ่มต้น

set-executionpolicy remotesigned -Scope CurrentUser


0

การตั้งค่านโยบาย (อย่างถูกต้อง) เป็นตัวเลือกที่ดีที่สุด แต่ในระบบที่มีการจัดการของฉันฉันไม่มีความสามารถในการเปลี่ยนแปลงนโยบายนั้น

สำหรับฉันวิธีที่ง่ายที่สุดในการเปลี่ยนนโยบายคือการเปิดสคริปต์ใน "PowerShell ISE"ไฮไลต์รหัส (หรือส่วนหนึ่งของรหัส) เพื่อดำเนินการแล้วคลิกปุ่ม "เรียกใช้การเลือก" (หรือใช้ F8 ทางลัด)

นี่ไม่ใช่ทางออกที่ดีที่สุด & ทำเพียงเล็กน้อยสำหรับงานอัตโนมัติ แต่ช่วยให้ฉันสามารถใช้งานและอรรถประโยชน์ของ PowerShell ได้ในขณะที่ไม่ได้ทำงานในแผนก IS ของฉัน


-2

เหตุผลที่คีย์ reg ทำงานได้นั้นเป็นเพราะมันทำในสิ่งที่คำสั่ง PS ทำ คำสั่งเขียนการเปลี่ยนแปลงไปยังคีย์ reg คำสั่งนั้นเร็วและง่ายกว่าการสร้างคีย์ reg หรือขุดลงในรีจิสทรี


1
นั่นเป็นเพียงความผิด: คีย์ที่กล่าวถึงในคำตอบอื่น ๆ เปลี่ยนนโยบายการดำเนินการ powershells ซึ่งจะช่วยให้สคริปต์ powershell ทำงานได้
Patrick R.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.