ตามค่าเริ่มต้น การตั้งค่า Windows จะป้องกันไม่ให้สคริปต์ PowerShell ทำงาน จากมุมมองด้านความปลอดภัย สิ่งสำคัญคือการจำกัดไม่ให้โค้ดที่ไม่น่าเชื่อถือและโค้ดที่เป็นอันตรายทำงานจากสคริปต์ PowerShell นโยบายการดำเนินการกำหนดการตั้งค่าสำหรับการเรียกใช้สคริปต์ PowerShell ในบทความนี้ เราจะมาดูการตั้งค่าที่ใช้ได้สำหรับการเรียกใช้สคริปต์ PS บน Windows วิธีเปลี่ยนนโยบายการดำเนินการ และกำหนดค่านโยบายการเรียกใช้สคริปต์ PowerShell สำหรับคอมพิวเตอร์โดเมนโดยใช้ GPO
การรันสคริปต์ PowerShell ถูกปิดใช้งานบนระบบนี้
เมื่อพยายามเรียกใช้สคริปต์ PowerShell (ไฟล์ PS1) ใน Windows 10 ใหม่ทั้งหมด ข้อผิดพลาดต่อไปนี้จะเกิดขึ้น:
File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170. + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
คุณสามารถรับการตั้งค่าปัจจุบันสำหรับนโยบายการดำเนินการสคริปต์ PowerShell ใน Windows ได้โดยใช้คำสั่งต่อไปนี้:
Get-ExecutionPolicy
มีค่านโยบายการดำเนินการ PowerShell ต่อไปนี้:
- ถูกจำกัด – การเรียกใช้สคริปต์ PowerShell ถูกปิดใช้งาน คุณสามารถดำเนินการได้เฉพาะคำสั่งแบบโต้ตอบในคอนโซล PS เท่านั้น
- ลงนามทั้งหมด - อนุญาตเฉพาะสคริปต์ PS ที่ลงนามด้วยลายเซ็นดิจิทัลโดยผู้เผยแพร่ที่เชื่อถือได้เท่านั้น (คุณสามารถลงนามในสคริปต์โดยใช้ใบรับรองที่ลงนามเองและเพิ่มไปยังใบรับรองหลักที่เชื่อถือได้) เมื่อเรียกใช้สคริปต์ที่ไม่น่าเชื่อถือ คำเตือนต่อไปนี้จะปรากฏขึ้น:
Do you want to run software from this untrusted publisher? File .ps1 is published by CN=test1 and is not trusted on your system. Only run scripts from trusted publishers.
- RemoteSigned – คุณสามารถเรียกใช้สคริปต์ PowerShell ในเครื่องได้โดยไม่มีข้อจำกัดใดๆ คุณสามารถเรียกใช้ไฟล์ PS ระยะไกลด้วยลายเซ็นดิจิทัล (คุณไม่สามารถเรียกใช้ไฟล์ PS1 ที่ดาวน์โหลดจากอินเทอร์เน็ตหรือเปิดจากโฟลเดอร์เครือข่ายที่แชร์ผ่านเส้นทาง UNC)
- ไม่จำกัด – อนุญาตให้เรียกใช้สคริปต์ PowerShell ทั้งหมด เมื่อพยายามเรียกใช้สคริปต์ PowerShell ของบริษัทอื่น คุณอาจได้รับแจ้งให้ยืนยันการเปิดใช้งาน (ดูด้านล่าง)
- บายพาส - อนุญาตให้เรียกใช้ไฟล์ PS ใด ๆ (ไม่แสดงคำเตือน) นโยบายนี้มักใช้เพื่อเรียกใช้สคริปต์ PS โดยอัตโนมัติโดยไม่แสดงการแจ้งเตือนใดๆ (เช่น เมื่อเรียกใช้สคริปต์ผ่าน GPO, SCCM, Task Scheduler เป็นต้น) และไม่แนะนำให้ใช้แบบถาวร
- ค่าเริ่มต้น – รีเซ็ตการตั้งค่าการดำเนินการสคริปต์ PowerShell เป็นค่าเริ่มต้น ใน Windows 10 ค่าเริ่มต้นสำหรับนโยบายการดำเนินการของ PowerShell คือ จำกัด และใน Windows Server 2016 มันคือ RemoteSigned .
- ไม่ได้กำหนด – ไม่ได้กำหนดนโยบาย นโยบายที่จำกัดมีผลกับระบบปฏิบัติการเดสก์ท็อปและ RemoteSigned สำหรับเซิร์ฟเวอร์
จะอนุญาตให้ PowerShell เรียกใช้สคริปต์โดยใช้นโยบายการดำเนินการได้อย่างไร
หากต้องการเปลี่ยนค่าปัจจุบันของนโยบายการดำเนินการสคริปต์ PowerShell Set-ExecutionPolicy ใช้ cmdlet
ตัวอย่างเช่น อนุญาตให้เรียกใช้ไฟล์สคริปต์ PS ในเครื่อง:
Set-ExecutionPolicy RemoteSigned
ยืนยันการเปลี่ยนแปลงนโยบายการดำเนินการสำหรับสคริปต์ PS1 โดยกด Y
หรือ A
.
เพื่อหลีกเลี่ยงการแสดงข้อความยืนยัน คุณสามารถใช้บังคับ พารามิเตอร์
Set-ExecutionPolicy RemoteSigned –Force
หากคุณตั้งค่านโยบายการดำเนินการของ PowerShell เป็น ไม่จำกัด คุณจะยังคงเห็นข้อความแจ้งเมื่อพยายามเรียกใช้สคริปต์ระยะไกลจากโฟลเดอร์ที่แชร์โดยใช้เส้นทาง UNC หรือไฟล์ที่ดาวน์โหลดจากอินเทอร์เน็ต:
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")
PowerShell แยกความแตกต่างระหว่างสคริปต์ในเครื่องและสคริปต์ระยะไกลอย่างไร เป็นเพราะ
ZoneId
ตัวระบุเบราว์เซอร์ตั้งค่าในสตรีมทางเลือกเมื่อดาวน์โหลดไฟล์ (ดูบทความ Windows รู้ได้อย่างไรว่าไฟล์ถูกดาวน์โหลดจากอินเทอร์เน็ต) คุณสามารถเลิกบล็อกไฟล์ได้โดยทำเครื่องหมายที่ เลิกบล็อก ในคุณสมบัติไฟล์หรือล้างป้ายกำกับโซนโดยใช้ Unblock-File
cmdlet คุณต้องแยกแยะระหว่างขอบเขตต่างๆ ของ PowerShell Execution Policy:
- นโยบายเครื่อง – ตั้งค่าโดยใช้ GPO และใช้กับผู้ใช้คอมพิวเตอร์ทุกคน
- นโยบายผู้ใช้ – ตั้งค่าโดยใช้ GPO และใช้กับผู้ใช้คอมพิวเตอร์ด้วย
- กระบวนการ — การตั้งค่านโยบายการดำเนินการใช้กับเซสชัน PowerShell ปัจจุบันเท่านั้น (และรีเซ็ตหลังจากกระบวนการ powershell.exe สิ้นสุดลง)
- ผู้ใช้ปัจจุบัน – นโยบายการดำเนินการใช้กับผู้ใช้ปัจจุบันเท่านั้น (พารามิเตอร์ของคีย์รีจิสทรี HKEY_CURRENT_USER)
- LocalMachine เป็นนโยบายสำหรับผู้ใช้คอมพิวเตอร์ทุกคน (พารามิเตอร์จากคีย์รีจิสทรี HKEY_LOCAL_MACHINE)
คุณสามารถกำหนดขอบเขตนโยบายได้โดยใช้ ขอบเขต พารามิเตอร์ของ cmdlet Set-ExecutionPolicy ตัวอย่างเช่น:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
มาตรวจสอบการตั้งค่า ExecutionPolicy ปัจจุบันสำหรับขอบเขตทั้งหมด:
Get-ExecutionPolicy -List
Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Bypass CurrentUser Undefined LocalMachine RemoteSigned
ค่านโยบายการดำเนินการที่คุณตั้งค่าโดยใช้ cmdlet Set-ExecutionPolicy สำหรับขอบเขต CurrentUser และ LocalMachine จะถูกเก็บไว้ในรีจิสทรี ตัวอย่างเช่น เรียกใช้คำสั่งนี้:
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Restricted –Force
เปิดคีย์รีจิสทรี HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell และตรวจสอบค่า REG_SZ ของ ExecutionPolicy พารามิเตอร์. ควรเปลี่ยนเป็นแบบจำกัด (ค่าพารามิเตอร์ที่อนุญาตคือ จำกัด, AllSigned, RemoteSigned, บายพาส, ไม่จำกัด และ ไม่ได้กำหนด)
การตั้งค่าเดียวกันสำหรับขอบเขต CurrentUser จะอยู่ภายใต้ HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell .
หมายความว่าคุณสามารถปรับใช้การตั้งค่านโยบายการเรียกใช้สคริปต์ PowerShell ผ่านรีจิสทรีได้โดยใช้การตั้งค่านโยบายกลุ่มโปรดทราบว่า ExecutionPolicy กับ AllSigned ค่าในระดับ LocalMachine ถูกใช้บ่อยที่สุดในสภาพแวดล้อมขององค์กร ให้ความสมดุลที่ดีที่สุดระหว่างความปลอดภัยและความสะดวกสบาย สำหรับการใช้งานส่วนตัว คุณสามารถใช้การตั้งค่า RemoteSigned บนคอมพิวเตอร์ของคุณ นโยบายการเลี่ยงอาจใช้เพื่อเรียกใช้งานบางอย่างเท่านั้น (เช่น เพื่อเรียกใช้สคริปต์โดยใช้ GPO หรืองานใน Task Scheduler)
ตั้งค่านโยบายการดำเนินการ PowerShell ใน Active Directory โดยใช้ GPO
คุณสามารถกำหนดค่านโยบายการดำเนินการสำหรับสคริปต์ PowerShell บนเซิร์ฟเวอร์หรือคอมพิวเตอร์โดเมนในโดเมน Active Directory โดยใช้นโยบายกลุ่ม
- ในตัวแก้ไข GPO โดเมน (
gpmc.msc
) สร้าง GPO ใหม่หรือแก้ไข GPO ที่มีอยู่แล้วเชื่อมโยงไปยัง OU ที่มีคอมพิวเตอร์ที่คุณต้องการใช้นโยบายการดำเนินการสคริปต์ PowerShell - เปิดคอมพิวเตอร์ การกำหนดค่า -> นโยบาย -> เทมเพลตการดูแลระบบ -> ส่วนประกอบของ Windows -> Windows PowerShell ในตัวแก้ไข GPO และค้นหา เปิดการดำเนินการสคริปต์ พารามิเตอร์. มีนโยบายเดียวกันในส่วน GPO ของผู้ใช้ — การกำหนดค่าผู้ใช้ แต่นโยบายคอมพิวเตอร์มีลำดับความสำคัญสูงกว่า
- นโยบายอาจมีสามค่า:
- อนุญาตเฉพาะสคริปต์ที่มีลายเซ็น – สอดคล้องกับนโยบาย AllSigned
- อนุญาตสคริปต์ในเครื่องและสคริปต์ที่ลงชื่อจากระยะไกล – สอดคล้องกับนโยบาย PS RemoteSigned
- อนุญาตสคริปต์ทั้งหมด – สอดคล้องกับนโยบายไม่จำกัด
- ตั้งค่านโยบายที่คุณต้องการ บันทึก GPO และอัปเดตการตั้งค่านโยบายกลุ่มบนคอมพิวเตอร์ของคุณ
- ตรวจสอบให้แน่ใจว่าได้ใช้การตั้งค่าการดำเนินการใหม่กับขอบเขต MachinePolicy
หลังจากกำหนดค่านโยบายการดำเนินการโดยใช้ GPO แล้ว คุณจะไม่สามารถเปลี่ยนการตั้งค่านโยบายการดำเนินการสคริปต์ด้วยตนเองได้ หากคุณพยายามเปลี่ยนการตั้งค่านโยบายการดำเนินการบนคอมพิวเตอร์ที่ใช้ GPO ข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
Set-ExecutionPolicy: Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings.
ในทำนองเดียวกัน คุณสามารถกำหนดค่านโยบายการดำเนินการบนคอมพิวเตอร์แบบสแตนด์อโลนได้โดยใช้ตัวแก้ไข GPO ในเครื่อง — gpedit.msc
จะข้ามนโยบายการดำเนินการ PowerShell บน Windows ได้อย่างไร
มีเทคนิคบางอย่างที่สามารถช่วยคุณได้หากคุณต้องการเรียกใช้สคริปต์ PowerShell บนคอมพิวเตอร์ของคุณโดยไม่ต้องเปลี่ยนการตั้งค่านโยบายการดำเนินการ ตัวอย่างเช่น ฉันต้องการเรียกใช้สคริปต์ PS1 แบบง่ายที่ตรวจสอบว่ามีการเรียกใช้ในฐานะผู้ดูแลระบบหรือไม่
คุณสามารถรับเนื้อหาสคริปต์ได้โดยใช้ Get-Content และเปลี่ยนเส้นทางไปยังสตรีมอินพุตมาตรฐานของคอนโซล PS
Get-Content c:\ps\check_process_elevation.ps1 | PowerShell.exe -noprofile –
หรือคุณสามารถเรียกใช้กระบวนการ powershell.exe ใหม่โดยใช้นโยบายบายพาส:
powershell.exe -noprofile -executionpolicy bypass -file c:\ps\check_process_elevation.ps1