ค้นหาเว็บไซต์

วิธีแก้ไข PowerShell "การเรียกใช้สคริปต์ถูกปิดใช้งานบนระบบนี้"


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

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

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

แก้ไข การเรียกใช้สคริปต์ถูกปิดใช้งานบนระบบนี้

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

  1. เปิด PowerShell หรือ Windows Terminal
  2. ป้อนคำสั่งด้านล่างเพื่อเรียกใช้สคริปต์ของคุณ

    <รหัส 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 ซึ่งหมายความว่าผู้ใช้ยังคงต้องดำเนินการขั้นตอนเพิ่มเติมสำหรับสคริปต์ที่ดาวน์โหลด

  1. เปิด PowerShell
  2. ป้อนคำสั่งด้านล่าง และกด Enter
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
  1. ไม่บังคับ - ตรวจสอบการตั้งค่าด้วยคำสั่ง Get-ExecutionPolicy

ตอนนี้คุณสามารถเรียกใช้สคริปต์ PowerShell ที่สร้างขึ้นในเครื่องได้โดยไม่มีข้อผิดพลาด สคริปต์การเรียกใช้ถูกปิดใช้งานบนระบบนี้

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

เพื่อแก้ปัญหานี้ คุณจะต้องปลดบล็อกไฟล์ก่อน ในการทำเช่นนี้ เราสามารถใช้ PowerShell cmdlet Unblock-File ได้ เพียงพิมพ์ cmdlet ตามด้วยชื่อไฟล์/เส้นทาง:

Unblock-File -path .\CreateTestFiles.ps1

กำหนดนโยบายการดำเนินการสำหรับผู้ใช้ทั้งหมด

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

  1. คลิกขวาที่ Start หรือกด ปุ่ม Windows + X
  2. เลือก Windows PowerShell (ผู้ดูแลระบบ) หรือ Windows Terminal (ผู้ดูแลระบบ)
  3. พิมพ์คำสั่งต่อไปนี้:
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 บนคอมพิวเตอร์หลายเครื่องที่เป็นสมาชิกของโดเมน ข้อดีอีกประการของนโยบายนี้คือการตั้งค่าไม่สามารถเขียนทับบนคอมพิวเตอร์ได้

  1. เปิด ตัวแก้ไขการจัดการนโยบายกลุ่ม และสร้างนโยบายใหม่
  2. ขยายการกำหนดค่าคอมพิวเตอร์
  3. ไปที่ นโยบาย > เทมเพลตการดูแลระบบ > ส่วนประกอบของ Windows > Windows PowerShell
  4. เปิดการตั้งค่า เปิดการดำเนินการสคริปต์

  1. เปลี่ยนการตั้งค่าเป็น เปิดใช้งาน
  2. เลือก นโยบายการดำเนินการ อนุญาตสคริปต์ในเครื่องและสคริปต์ที่ลงนามจากระยะไกล นี่เป็นแบบเดียวกับ 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 โปรดอ่านคู่มือเริ่มต้นใช้งานนี้

บทความที่เกี่ยวข้อง