วิธีแก้ไข PowerShell "การเรียกใช้สคริปต์ถูกปิดใช้งานบนระบบนี้"
กำลังพยายามเรียกใช้สคริปต์ PowerShell และคุณได้รับข้อผิดพลาด “ไม่สามารถโหลดได้เนื่องจาก rสคริปต์ที่ทำงานอยู่ถูกปิดใช้งานบนระบบนี้" หรือไม่ จากนั้นเราจำเป็นต้องเปลี่ยนนโยบายการดำเนินการใน PowerShell เพื่อปกป้องคอมพิวเตอร์ของคุณจากสคริปต์ที่เป็นอันตราย นโยบายการดำเนินการของ PowerShell จะถูกตั้งค่าให้จำกัดตามค่าเริ่มต้น
การตั้งค่าเริ่มต้นนี้จะป้องกันไม่ให้คุณเรียกใช้สคริปต์ PowerShell บนคอมพิวเตอร์ของคุณ แม้แต่สคริปต์ที่คุณเขียนเอง โชคดีที่เราสามารถเปลี่ยนนโยบายได้อย่างง่ายดายด้วยคำสั่งเดียวใน PowerShell
ในบทความนี้ ฉันจะอธิบายวิธีการแก้ไขข้อผิดพลาดที่เรียกใช้สคริปต์ถูกปิดใช้งานในระบบนี้อย่างรวดเร็ว นโยบายที่แตกต่างกันคืออะไร และวิธีเปลี่ยนแปลงในคอมพิวเตอร์ทุกเครื่องที่มีนโยบายกลุ่ม
แก้ไข การเรียกใช้สคริปต์ถูกปิดใช้งานบนระบบนี้
เราจะเริ่มต้นด้วยการแก้ไขด่วน วิธีการด้านล่างแก้ไขปัญหาได้เพียงชั่วคราว คุณจึงสามารถเรียกใช้สคริปต์และดำเนินการต่อได้ หากต้องการวิธีแก้ปัญหาที่ยั่งยืนยิ่งขึ้น ให้เลื่อนลงไปที่บทถัดไปเล็กน้อย
- เปิด PowerShell หรือ Windows Terminal
-
ป้อนคำสั่งด้านล่างเพื่อเรียกใช้สคริปต์ของคุณ
<รหัส data-enlighter-ภาษา="powershell" class="EnlighterJSRAW"> powershell - ExecutionPolicy บายพาส - ไฟล์ script.ps1
วิธีการข้างต้นเป็นการข้ามนโยบายการดำเนินการเพียงชั่วคราวเท่านั้น วิธีนี้ใช้งานได้ดีกับไฟล์เดียว แต่คุณต้องใช้คำสั่งด้านบนทุกครั้งที่คุณต้องการเรียกใช้ไฟล์ วิธีแก้ปัญหาที่ยั่งยืนกว่าคือการเปลี่ยนนโยบายการดำเนินการ
การเปลี่ยนแปลงนโยบายการดำเนินการอย่างถาวร
เมื่อคุณทำงานกับสคริปต์ PowerShell เป็นจำนวนมาก คุณอาจต้องการเปลี่ยนนโยบายการดำเนินการอย่างถาวร แต่ก่อนที่เราจะดูวิธีเปลี่ยนแปลงนโยบาย ก่อนอื่นเรามาอธิบายวัตถุประสงค์และนโยบายต่างๆ ที่มีอยู่ก่อน
นโยบายการดำเนินการไม่ได้รับการออกแบบเป็นระบบรักษาความปลอดภัยเพื่อจำกัดผู้ใช้ไม่ให้เรียกใช้สคริปต์ PowerShell ผู้ใช้แต่ละคนสามารถข้ามนโยบายในเซสชัน PowerShell ปัจจุบันของตน หรือแม้แต่คัดลอกและวางเนื้อหาของสคริปต์ลงในคอนโซลได้โดยตรง แล้วนโยบายนี้มีจุดประสงค์อะไร? มันถูกออกแบบมาเพื่อป้องกันการดำเนินการสคริปต์ PowerShell โดยไม่ได้ตั้งใจ
เมื่อเปลี่ยนนโยบาย เรามีห้าตัวเลือกให้เลือก:
- Restricted
ตัวเลือกเริ่มต้น - ไม่อนุญาตให้เรียกใช้สคริปต์ PowerShell ใด ๆ
- Unrestricted
สามารถเรียกใช้สคริปต์ใดก็ได้ แสดงคำเตือนสำหรับสคริปต์ที่ดาวน์โหลด
- RemoteSigned
ต้องมีลายเซ็นดิจิทัลสำหรับสคริปต์ที่ดาวน์โหลด คุณสามารถ
เรียกใช้สคริปต์ที่เขียนในเครื่องได้ คุณสามารถปลดบล็อคสคริปต์ที่ดาวน์โหลด
เพื่อเรียกใช้โดยไม่ต้องมีลายเซ็น- ByPass
-
คุณสามารถเรียกใช้สคริปต์ทั้งหมดได้และไม่มีคำเตือนแสดงขึ้น
- AllSigned
คุณสามารถเรียกใช้สคริปต์ที่ลงนามจากผู้เผยแพร่ที่เชื่อถือได้เท่านั้น
คนส่วนใหญ่มักจะตั้งค่านโยบายเป็นไม่จำกัด ซึ่งช่วยให้คุณสามารถเรียกใช้สคริปต์ PowerShell ได้ แต่ตัวเลือกที่ดีกว่าคือการใช้นโยบาย RemoteSigned วิธีนี้ทำให้คุณสามารถเรียกใช้สคริปต์ที่เขียนในเครื่องได้ แต่คุณจะต้องปลดบล็อกสคริปต์ที่ดาวน์โหลดทั้งหมดก่อน การจัดการเพิ่มเติมจะป้องกันไม่ให้ผู้ใช้ดาวน์โหลดและเรียกใช้สคริปต์ PowerShell ที่เป็นอันตรายบนระบบโดยไม่ตั้งใจ
ผู้ใช้ทั้งหมดเทียบกับผู้ใช้ปัจจุบัน
เมื่อเปลี่ยนแปลงนโยบาย เรายังสามารถกำหนดขอบเขตของการเปลี่ยนแปลงได้ด้วย ขอบเขตต่อไปนี้สามารถใช้ได้สำหรับนโยบาย:
- CurrentUser
นโยบายนี้ได้รับการตั้งค่าสำหรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบันเท่านั้น
- LocalMachine
นโยบายมีการเปลี่ยนแปลงสำหรับผู้ใช้ทั้งหมดบนเครื่อง
- Process
นโยบายมีการเปลี่ยนแปลงสำหรับเซสชัน PowerShell ปัจจุบันเท่านั้น
กำหนดนโยบายการดำเนินการสำหรับผู้ใช้ปัจจุบัน
สถานการณ์ที่พบบ่อยที่สุดคือคุณต้องการเปลี่ยนนโยบาย PowerShell Execution สำหรับผู้ใช้ปัจจุบัน วิธีนี้จะแก้ไขข้อผิดพลาด "การรันสคริปต์ถูกปิดใช้งานบนระบบนี้" สำหรับผู้ใช้ที่เข้าสู่ระบบ เราจะตั้งค่านโยบายเป็น RemoteSigned ซึ่งหมายความว่าผู้ใช้ยังคงต้องดำเนินการขั้นตอนเพิ่มเติมสำหรับสคริปต์ที่ดาวน์โหลด
- เปิด PowerShell
- ป้อนคำสั่งด้านล่าง และกด Enter
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser- ไม่บังคับ - ตรวจสอบการตั้งค่าด้วยคำสั่ง
Get-ExecutionPolicy
ตอนนี้คุณสามารถเรียกใช้สคริปต์ PowerShell ที่สร้างขึ้นในเครื่องได้โดยไม่มีข้อผิดพลาด สคริปต์การเรียกใช้ถูกปิดใช้งานบนระบบนี้
เมื่อคุณพยายามเรียกใช้สคริปต์ PowerShell ที่ดาวน์โหลดมาด้วยนโยบายการดำเนินการ RemoteSigned คุณจะได้รับข้อผิดพลาดว่าไม่สามารถโหลดไฟล์ได้ สคริปต์ PowerShell ไม่ได้เซ็นชื่อแบบดิจิทัล:
เพื่อแก้ปัญหานี้ คุณจะต้องปลดบล็อกไฟล์ก่อน ในการทำเช่นนี้ เราสามารถใช้ PowerShell cmdlet Unblock-File ได้ เพียงพิมพ์ cmdlet ตามด้วยชื่อไฟล์/เส้นทาง:
Unblock-File -path .\CreateTestFiles.ps1กำหนดนโยบายการดำเนินการสำหรับผู้ใช้ทั้งหมด
เรายังสามารถเปลี่ยนนโยบายสำหรับผู้ใช้ทุกคนบนคอมพิวเตอร์ได้อีกด้วย ในการดำเนินการนี้ คุณจะต้องมีสิทธิ์ระดับสูง (สิทธิ์ของผู้ดูแลระบบ)
- คลิกขวาที่ Start หรือกด ปุ่ม Windows + X
- เลือก Windows PowerShell (ผู้ดูแลระบบ) หรือ Windows Terminal (ผู้ดูแลระบบ)
- พิมพ์คำสั่งต่อไปนี้:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachineเราสามารถตรวจสอบผลลัพธ์ได้ด้วย cmdlet Get-ExecutionPolicy -List ซึ่งแสดงนโยบายสำหรับแต่ละขอบเขต สิ่งที่ควรรู้ก็คือนโยบาย CurrentUser มีความสำคัญเหนือกว่านโยบาย LocalMachine ดังนั้นเมื่อคุณตั้งค่านโยบาย CurrentUser เป็นจำกัดและ LocalMachine เป็น RemoteSigned ผู้ใช้ยังคงไม่สามารถเรียกใช้สคริปต์ PowerShell ใดๆ ได้ เนื่องจากนโยบายที่ตั้งค่าในขอบเขต CurrentUser จะแทนที่นโยบาย LocalMachine
เปลี่ยนนโยบายสำหรับเซสชันปัจจุบันเท่านั้น
อีกทางเลือกหนึ่งคือการเปลี่ยนนโยบายสำหรับเซสชัน PowerShell ปัจจุบันเท่านั้น วิธีการนี้มีประโยชน์เมื่อคุณต้องการเรียกใช้สคริปต์ PowerShell สองสามสคริปต์ แต่ไม่ต้องการเปลี่ยนนโยบายอย่างถาวร คุณสามารถใช้ตัวเลือกบายพาสสำหรับแต่ละสคริปต์ได้ แต่ก็เป็นไปได้ที่จะตั้งค่าการเปลี่ยนแปลงขอบเขตสำหรับเซสชัน PowerShell ปัจจุบันเท่านั้น ใช้ขอบเขต กระบวนการ สำหรับสิ่งนี้:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Processตั้งค่านโยบายการดำเนินการ PowerShell ด้วย GPO
เมื่อคุณต้องการแก้ไขนโยบายในคอมพิวเตอร์หลายเครื่อง ควรใช้นโยบายกลุ่มในการดำเนินการนี้ นโยบายกลุ่มอนุญาตให้คุณเปลี่ยนการตั้งค่า Windows บนคอมพิวเตอร์หลายเครื่องที่เป็นสมาชิกของโดเมน ข้อดีอีกประการของนโยบายนี้คือการตั้งค่าไม่สามารถเขียนทับบนคอมพิวเตอร์ได้
- เปิด ตัวแก้ไขการจัดการนโยบายกลุ่ม และสร้างนโยบายใหม่
- ขยายการกำหนดค่าคอมพิวเตอร์
- ไปที่ นโยบาย > เทมเพลตการดูแลระบบ > ส่วนประกอบของ Windows > Windows PowerShell
- เปิดการตั้งค่า เปิดการดำเนินการสคริปต์
- เปลี่ยนการตั้งค่าเป็น เปิดใช้งาน
- เลือก นโยบายการดำเนินการ อนุญาตสคริปต์ในเครื่องและสคริปต์ที่ลงนามจากระยะไกล นี่เป็นแบบเดียวกับ RemoteSigned ที่เราตั้งค่าไว้ก่อนหน้านี้
เราสามารถตรวจสอบการตั้งค่าบนไคลเอนต์ตัวใดตัวหนึ่งที่เป็นสมาชิกของ OU ที่เราเพิ่งใช้การตั้งค่า ขั้นแรก ตรวจสอบให้แน่ใจว่ามีการใช้นโยบายล่าสุดบนคอมพิวเตอร์โดยใช้คำสั่ง GPUpdate หรือคุณสามารถใช้คำสั่ง RSOP เพื่อตรวจสอบนโยบาย หรือเพียงตรวจสอบว่านโยบายการดำเนินการได้รับการตั้งค่าด้วยคำสั่งหรือไม่:
Get-ExecutionPolicy -list
# Result
Scope ExecutionPolicy
----- ---------------
MachinePolicy RemoteSigned
UserPolicy RemoteSigned
Process Undefined
CurrentUser Undefined
LocalMachine Undefinedตามที่กล่าวไว้ ข้อดีของนโยบายคือผู้ใช้ไม่สามารถเปลี่ยนแปลงนโยบายได้อีกต่อไป เมื่อคุณใช้ cmdlet set-executionpolicy คุณจะได้รับข้อผิดพลาดว่านโยบายมีการเปลี่ยนแปลง แต่การตั้งค่าถูกแทนที่โดยนโยบายที่กำหนดไว้ในขอบเขตที่เฉพาะเจาะจงมากขึ้น:
ห่อขึ้น
วิธีที่ดีที่สุดในการตั้งค่านโยบายการดำเนินการใน PowerShell คือการใช้นโยบายกลุ่ม วิธีนี้จะทำให้เครื่องที่มีอยู่และเครื่องใหม่ทั้งหมดในโดเมนของคุณสามารถกำหนดค่าด้วยนโยบายที่ถูกต้องได้ แน่นอนว่าคุณสามารถสร้างนโยบายอื่นสำหรับแผนกไอทีได้
ฉันหวังว่าบทความนี้จะช่วยคุณแก้ไขข้อผิดพลาด “ไม่สามารถโหลดได้เนื่องจากการเรียกใช้สคริปต์ถูกปิดใช้งานบนระบบนี้” หากคุณมีคำถามใด ๆ เพียงแค่แสดงความคิดเห็นด้านล่าง หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ PowerShell โปรดอ่านคู่มือเริ่มต้นใช้งานนี้








