วิธีกำหนดค่า Windows ให้ทำงานกับสคริปต์ PowerShell ได้ง่ายขึ้น
Windows และ PowerShell มีคุณสมบัติความปลอดภัยในตัวและการกำหนดค่าเริ่มต้นที่มีวัตถุประสงค์เพื่อป้องกันผู้ใช้ปลายทางจากการเปิดใช้งานสคริปต์โดยไม่ได้ตั้งใจในระหว่างการทำกิจกรรมประจำวัน อย่างไรก็ตามหากกิจกรรมประจำวันของคุณเกี่ยวข้องกับการเขียนและเรียกใช้สคริปต์ PowerShell ของคุณเป็นประจำสิ่งนี้อาจสร้างความรำคาญมากกว่าผลประโยชน์ ที่นี่เราจะแสดงวิธีการแก้ไขคุณสมบัติเหล่านี้โดยไม่ลดทอนความปลอดภัยอย่างสมบูรณ์.
อย่างไรและทำไม Windows & PowerShell ป้องกันการเรียกใช้สคริปต์.
PowerShell เป็นเชลล์คำสั่งและภาษาสคริปต์ที่มีประสิทธิภาพเพื่อแทนที่ CMD และชุดสคริปต์บนระบบ Windows ดังนั้นสคริปต์ PowerShell สามารถกำหนดค่าให้ทำสิ่งใดก็ได้ที่คุณสามารถทำได้ด้วยตนเองจากบรรทัดคำสั่ง นั่นเท่ากับการทำการเปลี่ยนแปลงใด ๆ ที่เป็นไปได้ในระบบของคุณตามข้อ จำกัด ที่เกิดขึ้นกับบัญชีผู้ใช้ของคุณ ดังนั้นหากคุณสามารถดับเบิลคลิกที่สคริปต์ PowerShell และเรียกใช้ด้วยสิทธิ์ผู้ดูแลระบบอย่างเต็มรูปแบบหนึ่งในสายการบินแบบนี้อาจทำลายวันของคุณ:
Get-ChildItem "$ env: SystemDrive \" - รับเงินคืน - ข้อผิดพลาดการดำเนินการอย่างเงียบ ๆ ดำเนินการต่อ | ลบรายการ - การบังคับใช้ - ชำระเงิน - ข้อผิดพลาดการกระทำแบบไม่โต้ตอบ
ห้ามรันคำสั่งด้านบน!
ที่ผ่านระบบไฟล์และลบสิ่งที่ทำได้ สิ่งที่น่าสนใจนี้อาจทำให้ระบบไม่สามารถทำงานได้อย่างรวดเร็วอย่างที่คุณคิด - แม้จะทำงานจากเซสชั่นที่ยกระดับ แต่ถ้ามีคนโทรหาคุณหลังจากเรียกใช้สคริปต์นี้เนื่องจากพวกเขาไม่สามารถค้นหาไฟล์หรือเรียกใช้บางโปรแกรมได้“ การปิดและเปิดอีกครั้ง” อาจจะนำพวกเขาไปสู่การซ่อมแซมการเริ่มต้นระบบ Windows ที่พวกเขาจะถูกบอกว่ามี ไม่มีอะไรที่สามารถทำได้เพื่อแก้ไขปัญหา สิ่งที่อาจจะแย่กว่านั้นคือแทนที่จะได้รับสคริปต์ที่เพิ่งลบระบบไฟล์ของพวกเขาเพื่อนของคุณอาจถูกหลอกให้ทำงานที่ดาวน์โหลดและติดตั้ง keylogger หรือบริการการเข้าถึงระยะไกล จากนั้นแทนที่จะถามคำถามคุณเกี่ยวกับการซ่อมแซมการเริ่มต้นพวกเขาอาจสิ้นสุดการถามตำรวจเกี่ยวกับการฉ้อโกงทางธนาคาร!
ถึงตอนนี้มันควรจะชัดเจนว่าทำไมบางสิ่งจำเป็นเพื่อปกป้องผู้ใช้จากตัวเองดังนั้นพูด แต่โดยทั่วไปผู้ใช้ที่มีอำนาจผู้ดูแลระบบและคนอื่น ๆ (โดยทั่วไปมีข้อยกเว้น) ระวังภัยคุกคามเหล่านี้อีกเล็กน้อยรู้วิธีการตรวจจับและหลีกเลี่ยงได้ง่ายขึ้นและต้องการทำงานต่อไป ในการทำเช่นนี้พวกเขาจะต้องปิดการใช้งานหรือหลีกเลี่ยงการปิดกั้นถนนบางอย่าง:
- PowerShell ไม่อนุญาตการเรียกใช้สคริปต์ภายนอกตามค่าเริ่มต้น.
การตั้งค่า ExecutionPolicy ใน PowerShell ป้องกันการเรียกใช้สคริปต์ภายนอกโดยค่าเริ่มต้นใน Windows ทุกรุ่น ใน Windows บางรุ่นค่าเริ่มต้นไม่อนุญาตให้มีการเรียกใช้สคริปต์เลย เราแสดงวิธีเปลี่ยนการตั้งค่านี้ในวิธีอนุญาตให้ใช้งานสคริปต์ PowerShell ใน Windows 7 แต่เราจะกล่าวถึงในระดับที่นี่เช่นกัน. - PowerShell ไม่เกี่ยวข้องกับนามสกุลไฟล์. PS1 ตามค่าเริ่มต้น.
เรานำสิ่งนี้มาเริ่มแรกในซีรี่ส์ PowerShell Geek School ของเรา Windows ตั้งค่าการกระทำเริ่มต้นสำหรับไฟล์. PS1 เพื่อเปิดใน Notepad แทนที่จะส่งไปยังตัวแปลคำสั่ง PowerShell นี่เป็นการป้องกันการเรียกใช้สคริปต์ที่เป็นอันตรายโดยไม่ได้ตั้งใจโดยตรงเมื่อคลิกสองครั้ง. - สคริปต์ PowerShell บางตัวจะไม่ทำงานหากไม่ได้รับอนุญาตจากผู้ดูแลระบบ.
แม้จะใช้งานกับบัญชีระดับผู้ดูแลระบบคุณยังคงต้องผ่านการควบคุมบัญชีผู้ใช้ (UAC) เพื่อดำเนินการบางอย่าง สำหรับเครื่องมือบรรทัดคำสั่งอาจทำให้ยุ่งยากในการพูดน้อย เราไม่ต้องการปิดใช้งาน UAC แต่ก็ยังดีเมื่อเราสามารถทำให้ง่ายขึ้นเล็กน้อยในการจัดการ.
ปัญหาเดียวกันเหล่านี้เกิดขึ้นในวิธีการใช้ไฟล์แบทช์เพื่อสร้างสคริปต์ PowerShell ที่ง่ายต่อการเรียกใช้ซึ่งเราจะแนะนำให้คุณเขียนไฟล์แบตช์เพื่อหลีกเลี่ยงปัญหาเหล่านั้นชั่วคราว ตอนนี้เราจะแสดงวิธีตั้งค่าระบบของคุณด้วยโซลูชันระยะยาวที่มากขึ้น โปรดทราบว่าคุณไม่ควรทำการเปลี่ยนแปลงเหล่านี้กับระบบที่คุณไม่ได้ใช้ แต่อย่างใด - ไม่เช่นนั้นคุณจะทำให้ผู้ใช้รายอื่นมีความเสี่ยงสูงในการใช้งานปัญหาเดียวกันคุณสมบัติเหล่านี้มีไว้เพื่อป้องกัน.
การเปลี่ยนการเชื่อมโยงไฟล์. PS1.
สิ่งแรกและที่สำคัญที่สุดความรำคาญที่จะหลีกเลี่ยงคือความสัมพันธ์เริ่มต้นสำหรับไฟล์. PS1 การเชื่อมโยงไฟล์เหล่านี้กับสิ่งอื่นที่ไม่ใช่ PowerShell.exe ช่วยป้องกันการเรียกใช้สคริปต์ที่ไม่พึงประสงค์โดยไม่ตั้งใจได้ แต่เมื่อพิจารณาว่า PowerShell มาพร้อมกับ Integrated Scripting Environment (ISE) ซึ่งได้รับการออกแบบมาโดยเฉพาะสำหรับการแก้ไขสคริปต์ PowerShell ทำไมเราต้องเปิดไฟล์. PS1 ใน Notepad โดยค่าเริ่มต้น แม้ว่าคุณจะไม่พร้อมที่จะเปลี่ยนเป็นการเปิดใช้งานฟังก์ชั่นดับเบิลคลิกเพื่อเรียกใช้อย่างเต็มที่ แต่คุณอาจต้องการปรับแต่งการตั้งค่าเหล่านี้.
คุณสามารถเปลี่ยนการเชื่อมโยงไฟล์. PS1 เป็นโปรแกรมใดก็ได้ที่คุณต้องการด้วยแผงควบคุมโปรแกรมเริ่มต้น แต่การขุดลงในรีจิสทรีโดยตรงจะทำให้คุณสามารถควบคุมได้มากขึ้นว่าเปิดไฟล์อย่างไร นอกจากนี้ยังช่วยให้คุณตั้งค่าหรือเปลี่ยนตัวเลือกเพิ่มเติมที่มีอยู่ในเมนูบริบทสำหรับไฟล์. PS1 อย่าลืมสำรองข้อมูลรีจิสทรีก่อนที่จะทำเช่นนี้!
การตั้งค่ารีจิสทรีจะควบคุมวิธีการเปิดสคริปต์ PowerShell ในตำแหน่งต่อไปนี้:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ เชลล์
ในการสำรวจการตั้งค่าเหล่านี้ก่อนที่เราจะทำการเปลี่ยนแปลงให้ดูที่คีย์นั้นและคีย์ย่อยของมันด้วย Regedit คีย์เชลล์ควรมีค่าเดียว“ (ค่าเริ่มต้น)” ซึ่งตั้งค่าเป็น“ เปิด” นี่คือตัวชี้ไปยังการกระทำเริ่มต้นสำหรับการดับเบิลคลิกที่ไฟล์ซึ่งเราจะเห็นในคีย์ย่อย.
ขยายคีย์เชลล์และคุณจะเห็นคีย์ย่อยสามปุ่ม แต่ละสิ่งเหล่านี้แสดงถึงการกระทำที่คุณสามารถทำได้ซึ่งเฉพาะกับสคริปต์ PowerShell.
คุณสามารถขยายแต่ละคีย์เพื่อสำรวจค่าภายใน แต่โดยพื้นฐานแล้วพวกเขาถือเอาค่าเริ่มต้นดังต่อไปนี้:
- 0 - เรียกใช้ด้วย PowerShell “ Run with PowerShell” เป็นชื่อของตัวเลือกที่มีอยู่แล้วในเมนูบริบทสำหรับสคริปต์ PowerShell ข้อความจะถูกดึงออกจากตำแหน่งอื่นแทนที่จะใช้ชื่อคีย์เช่นที่อยู่อื่น และมันก็ไม่ใช่การกระทำดับเบิลคลิกเริ่มต้น.
- แก้ไข - เปิดใน PowerShell ISE สิ่งนี้มีเหตุผลมากกว่า Notepad แต่คุณยังคงต้องคลิกขวาที่ไฟล์. PS1 เพื่อให้เป็นค่าเริ่มต้น.
- เปิด - เปิดใน Notepad โปรดทราบว่าชื่อคีย์นี้เป็นสตริงที่จัดเก็บในค่า“ (ค่าเริ่มต้น)” ของปุ่ม Shell ซึ่งหมายความว่าการคลิกสองครั้งที่ไฟล์จะ“ เปิด” ไฟล์นั้นและการกระทำนั้นจะถูกตั้งค่าให้ใช้ Notepad.
หากคุณต้องการติดตั้งสตริงคำสั่งที่สร้างไว้ล่วงหน้าแล้วคุณสามารถเปลี่ยนค่า“ (ค่าเริ่มต้น)” ในปุ่ม Shell เพื่อจับคู่ชื่อของคีย์ที่ตรงกับสิ่งที่คุณต้องการดับเบิลคลิก สิ่งนี้สามารถทำได้อย่างง่ายดายจากภายใน Regedit หรือคุณสามารถใช้บทเรียนที่เรียนรู้จากการสอนการสำรวจรีจิสทรีด้วย PowerShell (รวมถึงการปรับแต่ง PSDrive ขนาดเล็ก) เพื่อเริ่มสร้างสคริปต์ที่นำมาใช้ใหม่ซึ่งสามารถกำหนดค่าระบบของคุณได้ คำสั่งด้านล่างจะต้องเรียกใช้จากเซสชัน PowerShell ที่ผ่านการยกระดับคล้ายกับการเรียกใช้ CMD ในฐานะผู้ดูแลระบบ.
ก่อนอื่นคุณต้องกำหนดค่า PSDrive สำหรับ HKEY_CLASSES_ROOT เนื่องจากไม่ได้ตั้งค่าตามค่าเริ่มต้น คำสั่งสำหรับสิ่งนี้คือ:
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
ตอนนี้คุณสามารถนำทางและแก้ไขรีจิสตรีคีย์และค่าต่างๆใน HKEY_CLASSES_ROOT เช่นเดียวกับที่คุณทำใน HKCU และ HKLM PSDrives ปกติ.
ในการกำหนดค่าดับเบิลคลิกเพื่อเปิดใช้งานสคริปต์ PowerShell โดยตรง:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(ค่าเริ่มต้น)' 0
ในการกำหนดค่าดับเบิลคลิกเพื่อเปิดสคริปต์ PowerShell ใน PowerShell ISE:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(ค่าเริ่มต้น) "แก้ไข"
หากต้องการคืนค่าเริ่มต้น (ตั้งค่าดับเบิลคลิกเพื่อเปิดสคริปต์ PowerShell ใน Notepad):
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(ค่าเริ่มต้น) "เปิด"
นั่นเป็นเพียงพื้นฐานของการเปลี่ยนการกระทำดับเบิลคลิกเริ่มต้น เราจะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับการปรับแต่งวิธีการจัดการสคริปต์ PowerShell เมื่อเปิดใน PowerShell จาก Explorer ในส่วนถัดไป โปรดทราบว่าการกำหนดขอบเขตป้องกันไม่ให้ PSDrives คงอยู่ตลอดเซสชัน ดังนั้นคุณอาจต้องการรวมบรรทัด New-PSDrive ไว้ที่จุดเริ่มต้นของสคริปต์การกำหนดค่าที่คุณสร้างขึ้นเพื่อจุดประสงค์นี้หรือเพิ่มลงในโปรไฟล์ PowerShell ของคุณ มิฉะนั้นคุณจะต้องเรียกใช้บิตด้วยตนเองก่อนที่จะพยายามทำการเปลี่ยนแปลงด้วยวิธีนี้.
การเปลี่ยนการตั้งค่า PowerShell ExecutionPolicy.
ExecutionPolicy ของ PowerShell เป็นอีกชั้นหนึ่งของการป้องกันการดำเนินการของสคริปต์ที่เป็นอันตราย มีหลายตัวเลือกสำหรับสิ่งนี้และสามารถตั้งค่าได้หลายวิธี จากส่วนใหญ่ไปสู่ความปลอดภัยขั้นต่ำตัวเลือกที่มีคือ:
- จำกัด - ไม่อนุญาตให้เรียกใช้สคริปต์ (การตั้งค่าเริ่มต้นสำหรับระบบส่วนใหญ่) ซึ่งจะป้องกันไม่ให้สคริปต์โปรไฟล์ของคุณทำงาน.
- AllSigned - สคริปต์ทั้งหมดต้องลงนามแบบดิจิทัลโดยผู้เผยแพร่ที่เชื่อถือได้เพื่อให้ทำงานได้โดยไม่ต้องแจ้งผู้ใช้ สคริปต์ที่ลงนามโดยผู้เผยแพร่ที่กำหนดไว้อย่างชัดเจนว่าไม่น่าเชื่อถือหรือสคริปต์ที่ไม่ได้ลงชื่อด้วยระบบดิจิตอลจะไม่ทำงาน PowerShell จะแจ้งให้ผู้ใช้ยืนยันหากสคริปต์ลงชื่อโดยผู้เผยแพร่ที่ยังไม่ได้กำหนดว่าเชื่อถือได้หรือไม่น่าเชื่อถือ หากคุณยังไม่ได้ลงชื่อสคริปต์โปรไฟล์ของคุณแบบดิจิทัลและสร้างความเชื่อถือในลายเซ็นนั้นจะไม่สามารถทำงานได้ โปรดระวังผู้เผยแพร่ที่คุณไว้วางใจเนื่องจากคุณยังคงสามารถเรียกใช้สคริปต์ที่เป็นอันตรายได้หากคุณเชื่อถือผิด.
- RemoteSigned - สำหรับสคริปต์ที่ดาวน์โหลดจากอินเทอร์เน็ตสิ่งนี้จะเหมือนกับ "AllSigned" อย่างมีประสิทธิภาพ อย่างไรก็ตามสคริปต์ที่สร้างขึ้นในเครื่องหรือนำเข้าจากแหล่งอื่น ๆ นอกเหนือจากอินเทอร์เน็ตได้รับอนุญาตให้ทำงานได้โดยไม่ต้องมีการยืนยัน ที่นี่คุณจะต้องระมัดระวังลายเซ็นดิจิทัลที่คุณเชื่อถือ แต่ต้องระวังสคริปต์ที่ไม่ได้ลงชื่อซึ่งคุณเลือกใช้ด้วย นี่คือระดับความปลอดภัยสูงสุดที่คุณสามารถมีสคริปต์โปรไฟล์ที่ใช้งานได้โดยไม่ต้องเซ็นชื่อแบบดิจิทัล.
- ไม่ จำกัด - สคริปต์ทั้งหมดได้รับอนุญาตให้เรียกใช้ แต่จะต้องมีการแจ้งให้ยืนยันสำหรับสคริปต์จากอินเทอร์เน็ต จากจุดนี้เป็นต้นไปคุณต้องหลีกเลี่ยงการเรียกใช้สคริปต์ที่ไม่น่าเชื่อถือ.
- บายพาส - ทุกอย่างทำงานโดยไม่มีการเตือน ระวังด้วยอันนี้.
- ไม่ได้กำหนด - ไม่มีการกำหนดนโยบายในขอบเขตปัจจุบัน สิ่งนี้ใช้เพื่ออนุญาตให้ย้อนกลับไปสู่นโยบายที่กำหนดในขอบเขตที่ต่ำกว่า (รายละเอียดเพิ่มเติมด้านล่าง) หรือค่าเริ่มต้นของระบบปฏิบัติการ.
ตามที่อธิบายโดยคำอธิบายของไม่ได้กำหนดนโยบายข้างต้นสามารถตั้งค่าในขอบเขตอย่างน้อยหนึ่งขอบเขต คุณสามารถใช้ Get-ExecutionPolicy พร้อมกับพารามิเตอร์ -List เพื่อดูขอบเขตทั้งหมดและคอนฟิกูเรชันปัจจุบัน.
ขอบเขตจะแสดงรายการตามลำดับความสำคัญโดยมีขอบเขตที่กำหนดไว้สูงสุดซึ่งแทนที่อื่น ๆ ทั้งหมด หากไม่มีการกำหนดนโยบายระบบจะกลับไปสู่การตั้งค่าเริ่มต้น (ในกรณีส่วนใหญ่จะถูก จำกัด ).
- MachinePolicy แสดงถึงนโยบายกลุ่มที่มีผลบังคับใช้ในระดับคอมพิวเตอร์ โดยทั่วไปจะใช้เฉพาะในโดเมน แต่สามารถทำได้ในท้องถิ่นเช่นกัน.
- UserPolicy แสดงถึงนโยบายกลุ่มที่มีผลกับผู้ใช้ โดยปกติจะใช้ในสภาพแวดล้อมขององค์กรเท่านั้น.
- กระบวนการเป็นขอบเขตเฉพาะสำหรับอินสแตนซ์ของ PowerShell นี้ การเปลี่ยนแปลงนโยบายในขอบเขตนี้จะไม่ส่งผลกระทบต่อกระบวนการ PowerShell อื่น ๆ ที่ดำเนินการอยู่และจะไม่ได้ผลหลังจากเซสชันนี้สิ้นสุดลง สิ่งนี้สามารถกำหนดค่าได้โดยพารามิเตอร์ -ExecutionPolicy เมื่อมีการเปิดตัว PowerShell หรือสามารถตั้งค่าด้วยไวยากรณ์ Set-ExecutionPolicy ที่เหมาะสมจากภายในเซสชัน.
- CurrentUser เป็นขอบเขตที่กำหนดค่าไว้ในรีจิสตรีท้องถิ่นและนำไปใช้กับบัญชีผู้ใช้ที่ใช้ในการเรียกใช้ PowerShell ขอบเขตนี้สามารถแก้ไขได้ด้วย Set-ExecutionPolicy.
- LocalMachine เป็นขอบเขตที่กำหนดค่าไว้ในรีจิสตรีท้องถิ่นและใช้กับผู้ใช้ทั้งหมดในระบบ นี่เป็นขอบเขตเริ่มต้นที่เปลี่ยนแปลงหาก Set-ExecutionPolicy รันโดยไม่มีพารามิเตอร์ -Scope เนื่องจากมีผลกับผู้ใช้ทุกคนในระบบจึงสามารถเปลี่ยนได้จากเซสชันที่ยกระดับเท่านั้น.
เนื่องจากบทความนี้ส่วนใหญ่เกี่ยวกับการรักษาความปลอดภัยเพื่ออำนวยความสะดวกในการใช้งานเราจึงกังวลเกี่ยวกับขอบเขตที่ต่ำกว่าสามขอบเขต การตั้งค่า MachinePolicy และ UserPolicy มีประโยชน์จริง ๆ เฉพาะในกรณีที่คุณต้องการบังคับใช้นโยบายที่ จำกัด ซึ่งไม่ได้ข้ามไปโดยง่าย ด้วยการเปลี่ยนแปลงระดับกระบวนการหรือด้านล่างเราสามารถใช้การตั้งค่านโยบายใด ๆ ที่เราเห็นว่าเหมาะสมกับสถานการณ์ที่กำหนดได้ตลอดเวลา.
เพื่อรักษาสมดุลระหว่างความปลอดภัยและการใช้งานนโยบายที่แสดงในภาพหน้าจอน่าจะดีที่สุด การตั้งค่านโยบาย LocalMachine เป็น Restricted โดยทั่วไปจะป้องกันการเรียกใช้สคริปต์โดยบุคคลอื่นที่ไม่ใช่คุณ แน่นอนว่าสิ่งนี้สามารถถูกข้ามได้โดยผู้ใช้ที่รู้ว่าพวกเขากำลังทำอะไรโดยไม่ต้องใช้ความพยายามมาก แต่ควรป้องกันไม่ให้ผู้ใช้ที่ไม่ใช้เทคโนโลยีเข้าใจถึงการก่อให้เกิดหายนะใน PowerShell การมี CurrentUser (i.e .: you) ถูกตั้งค่าเป็นไม่ จำกัด อนุญาตให้คุณเรียกใช้สคริปต์จากบรรทัดคำสั่งด้วยตนเองตามที่คุณต้องการ แต่จะเก็บเตือนความจำสำหรับสคริปต์ที่ดาวน์โหลดจากอินเทอร์เน็ต การตั้งค่า RemoteSigned ที่ระดับกระบวนการจะต้องดำเนินการในทางลัดไปยัง PowerShell.exe หรือ (ตามที่เราจะทำด้านล่าง) ในค่ารีจิสทรีที่ควบคุมพฤติกรรมของสคริปต์ PowerShell สิ่งนี้จะช่วยให้การทำงานดับเบิลคลิกเพื่อรันง่ายสำหรับสคริปต์ใด ๆ ที่คุณเขียนในขณะที่วางสิ่งกีดขวางที่แข็งแกร่งขึ้นสำหรับการเรียกใช้งานสคริปต์ (อาจเป็นอันตราย) จากแหล่งภายนอกโดยไม่ตั้งใจ เราต้องการทำสิ่งนี้ที่นี่เนื่องจากง่ายกว่าการคลิกสองครั้งที่สคริปต์โดยไม่ตั้งใจกว่าโดยทั่วไปคือการโทรด้วยตนเองจากเซสชันแบบโต้ตอบ.
หากต้องการตั้งค่านโยบาย CurrentUser และ LocalMachine เช่นเดียวกับในภาพหน้าจอด้านบนให้รันคำสั่งต่อไปนี้จากเซสชัน PowerShell ที่ยกระดับ:
Set-ExecutionPolicy Restricted Set-ExecutionPolicy ไม่ จำกัด -Scope CurrentUser
ในการบังคับใช้นโยบาย RemoteSigned เกี่ยวกับสคริปต์ที่เรียกใช้จาก Explorer เราจะต้องเปลี่ยนค่าภายในหนึ่งในรีจิสตรีคีย์ที่เราดูก่อนหน้านี้ สิ่งนี้มีความสำคัญอย่างยิ่งเพราะขึ้นอยู่กับ PowerShell หรือเวอร์ชั่น Windows การกำหนดค่าเริ่มต้นอาจข้ามการตั้งค่า ExecutionPolicy ทั้งหมดยกเว้น AllSigned หากต้องการดูว่าการกำหนดค่าปัจจุบันสำหรับคอมพิวเตอร์ของคุณคืออะไรคุณสามารถเรียกใช้คำสั่งนี้ (ตรวจสอบให้แน่ใจว่า HKCR PSDrive ถูกแมปก่อน):
Get-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command | เลือกวัตถุ '(ค่าเริ่มต้น)'
การกำหนดค่าเริ่มต้นของคุณอาจเป็นหนึ่งในสองสายต่อไปนี้หรือสิ่งที่คล้ายกัน:
(เห็นใน Windows 7 SP1 x64 พร้อม PowerShell 2.0)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "- ไฟล์" "% 1"
(เห็นใน Windows 8.1 x64 พร้อม PowerShell 4.0)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "ถ้า ((Get-ExecutionPolicy) - หนึ่ง 'AllSigned') Set-ExecutionPolicy -Scope กระบวนการบายพาส; & '% 1 '"
คนแรกไม่ได้เลวร้ายอย่างที่มันทำคือเรียกใช้สคริปต์ภายใต้การตั้งค่า ExecutionPolicy ที่มีอยู่ มันสามารถทำได้ดีกว่าโดยการบังคับใช้ข้อ จำกัด ที่เข้มงวดมากขึ้นสำหรับการดำเนินการที่เกิดอุบัติเหตุได้ง่ายขึ้น แต่นี่ไม่ได้มีจุดประสงค์เพื่อให้เกิดการคลิกครั้งแรก แต่อย่างใดและนโยบายเริ่มต้นมักจะถูก จำกัด หลังจากทั้งหมด อย่างไรก็ตามตัวเลือกที่สองคือการเลี่ยงผ่าน ExecutionPolicy ทั้งหมดที่คุณมีอยู่ - แม้จะถูก จำกัด เนื่องจากบายพาสจะถูกนำไปใช้ในขอบเขตกระบวนการจึงมีผลกับเซสชันที่เรียกใช้เมื่อสคริปต์รันจาก Explorer เท่านั้น อย่างไรก็ตามนี่หมายความว่าคุณสามารถสิ้นสุดการเรียกใช้สคริปต์ที่คุณอาจคาดหวัง (และต้องการ) นโยบายของคุณที่จะห้าม.
หากต้องการตั้งค่า ExecutionPolicy ระดับกระบวนการสำหรับสคริปต์ที่เปิดใช้งานจาก Explorer ตามภาพด้านบนคุณจะต้องแก้ไขค่ารีจิสตรีเดียวกันกับที่เราสอบถาม คุณสามารถทำได้ด้วยตนเองใน Regedit โดยเปลี่ยนเป็น:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "- ExecutionPolicy" "RemoteSigned" "-file" "% 1"
คุณสามารถเปลี่ยนการตั้งค่าจากภายใน PowerShell ได้หากต้องการ อย่าลืมทำเช่นนี้จากเซสชันที่ยกระดับโดยมีการแมป HKCR PSDrive.
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command '(ค่าเริ่มต้น) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -ExecutionPolicy "" - RemoteSigned "" -file "" % 1" '
เรียกใช้สคริปต์ PowerShell ในฐานะผู้ดูแลระบบ.
เนื่องจากเป็นความคิดที่ดีที่จะปิดใช้งาน UAC โดยสิ้นเชิงจึงเป็นแนวทางปฏิบัติด้านความปลอดภัยที่ไม่ดีในการเรียกใช้สคริปต์หรือโปรแกรมที่มีสิทธิ์ยกระดับเว้นแต่ว่าคุณต้องการให้พวกเขาดำเนินการที่ต้องใช้สิทธิ์ของผู้ดูแลระบบ ดังนั้นไม่แนะนำให้สร้าง UAC พรอมต์ลงในการดำเนินการเริ่มต้นสำหรับสคริปต์ PowerShell อย่างไรก็ตามเราสามารถเพิ่มตัวเลือกเมนูบริบทใหม่เพื่อให้เราสามารถเรียกใช้สคริปต์ได้อย่างง่ายดายในเซสชันที่ยกระดับเมื่อเราต้องการ นี่คล้ายกับวิธีที่ใช้ในการเพิ่ม“ เปิดด้วย Notepad” ในเมนูบริบทของไฟล์ทั้งหมด - แต่ที่นี่เราจะไปที่สคริปต์ PowerShell เป้าหมายเท่านั้น เราจะดำเนินการผ่านเทคนิคบางอย่างที่ใช้ในบทความก่อนหน้านี้โดยที่เราใช้ไฟล์แบตช์แทนการแฮ็กข้อมูลรีจิสตรีเพื่อเปิดสคริปต์ PowerShell ของเรา.
ในการทำสิ่งนี้ใน Regedit ให้กลับไปที่ปุ่ม Shell ที่:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ เชลล์
ในนั้นสร้างคีย์ย่อยใหม่ เรียกว่า "เรียกใช้ด้วย PowerShell (ผู้ดูแลระบบ)" ใต้นั้นให้สร้างคีย์ย่อยอีกอันหนึ่งชื่อว่า“ Command” จากนั้นให้ตั้งค่า“ (ค่าเริ่มต้น)” ภายใต้คำสั่งเป็น:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & PowerShell.exe เริ่มต้นกระบวนการ -ArgumentList '-ExecutionPolicy RemoteSigned - ไฟล์ \ "% 1 \"' -Verb "
การทำเช่นเดียวกันใน PowerShell จะต้องใช้สามบรรทัดในเวลานี้ หนึ่งตัวสำหรับแต่ละคีย์ใหม่และอีกอันตั้งค่า“ (ค่าเริ่มต้น)” สำหรับคำสั่ง อย่าลืมระดับความสูงและการจับคู่ HKCR.
รายการใหม่ 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run พร้อม PowerShell (ผู้ดูแลระบบ)' รายการใหม่ 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run ด้วย PowerShell (ผู้ดูแลระบบ) \ Command' Set-ItemProperty ' HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run ด้วย PowerShell (Admin) \ Command "(ค่าเริ่มต้น)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "& PowerShell.exe เริ่มต้นกระบวนการ -ArgumentList "-ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs "'
นอกจากนี้ให้ระวังอย่างยิ่งกับความแตกต่างระหว่างสตริงที่ใส่เข้าไปใน PowerShell และค่าจริงที่เข้าไปในรีจิสทรี โดยเฉพาะอย่างยิ่งเราต้องห่อสิ่งต่าง ๆ ทั้งหมดไว้ในเครื่องหมายคำพูดเดี่ยวและสองครั้งในเครื่องหมายคำพูดเดี่ยวภายในเพื่อหลีกเลี่ยงข้อผิดพลาดในการแยกวิเคราะห์คำสั่ง.
ตอนนี้คุณควรมีรายการเมนูบริบทใหม่สำหรับสคริปต์ PowerShell เรียกว่า "Run with PowerShell (Admin)".
ตัวเลือกใหม่จะวางไข่สองอินสแตนซ์ PowerShell ติดต่อกัน ตัวแรกเป็นเพียงตัวเรียกใช้งานตัวที่สองซึ่งใช้ Start-Process กับพารามิเตอร์“ -Verb RunAs” เพื่อร้องขอการยกระดับสำหรับเซสชันใหม่ สคริปต์ของคุณควรจะสามารถทำงานด้วยสิทธิ์ผู้ดูแลระบบหลังจากที่คุณคลิกผ่านการแจ้งเตือน UAC.
สัมผัสการตกแต่ง.
มีเพียงการปรับแต่งอีกสองสามข้อที่สามารถช่วยให้ชีวิตง่ายขึ้นอีกเล็กน้อย สำหรับวิธีการกำจัดฟังก์ชั่น Notepad ทั้งหมด? เพียงแค่คัดลอกค่า“ (ค่าเริ่มต้น)” จากคีย์คำสั่งภายใต้แก้ไข (ด้านล่าง) ไปยังตำแหน่งเดียวกันภายใต้เปิด.
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "% 1"
หรือคุณสามารถใช้ PowerShell บิตนี้ (กับผู้ดูแลระบบ & HKCR แน่นอน):
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command '(ค่าเริ่มต้น) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe ""% 1 "
ความรำคาญเล็กน้อยอีกอย่างหนึ่งก็คือนิสัยของคอนโซลจะหายไปเมื่อสคริปต์เสร็จสมบูรณ์ เมื่อสิ่งนั้นเกิดขึ้นเราจะไม่มีโอกาสตรวจสอบข้อผิดพลาดหรือข้อมูลที่เป็นประโยชน์อื่น ๆ สิ่งนี้สามารถดูแลได้โดยการหยุดชั่วคราวเมื่อสิ้นสุดสคริปต์แต่ละบทของคุณ อีกวิธีหนึ่งเราสามารถแก้ไขค่า“ (ค่าเริ่มต้น)” สำหรับคีย์คำสั่งของเราเพื่อรวมพารามิเตอร์“ -NoExit” ด้านล่างนี้คือค่าที่แก้ไข.
(ไม่มีการเข้าถึงของผู้ดูแลระบบ)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-NoExit" "- ExecutionPolicy" "RemoteSigned" "-file" "% 1"
(ด้วยการเข้าถึงของผู้ดูแลระบบ)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & PowerShell.exe เริ่มกระบวนการ -ArgumentList '-NoExit -ExecutionPolicy RemoteSigned -File \ "% 1 \"' - กริยา RunAs "
และแน่นอนเราจะให้คำสั่ง PowerShell แก่คุณด้วย เตือนความจำครั้งสุดท้าย: ระดับความสูง & HKCR!
(Non-Admin)
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command '(ค่าเริ่มต้น) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -NoExit "" -ExecutionPolicy "" RemoteSigned "" - ไฟล์ ""% 1 "'
(ผู้ดูแลระบบ)
Set-ItemProperty 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run พร้อม PowerShell (Admin) \ Command "(ค่าเริ่มต้น)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "- คำสั่ง" "" & กระบวนการเริ่มต้น PowerShell.exe -ArgumentList "- ไม่มีการดำเนินการ - ดำเนินการตามนโยบาย RemoteSigned - ไฟล์ \"% 1 \ "" - คำกริยา RunAs "'
เอามันไปปั่น.
เพื่อทดสอบสิ่งนี้เราจะใช้สคริปต์ที่สามารถแสดงการตั้งค่า ExecutionPolicy ให้เราทราบและจะเปิดตัวสคริปต์ด้วยสิทธิ์ผู้ดูแลระบบหรือไม่ สคริปต์จะถูกเรียกว่า "MyScript.ps1" และจะถูกเก็บไว้ใน "D: \ Script Lab" ในระบบตัวอย่างของเรา รหัสด้านล่างสำหรับการอ้างอิง.
ถ้า (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "ผู้ดูแลระบบ")) เขียนเอาท์พุท 'ทำงานเป็นผู้ดูแลระบบ!' อื่น ๆ Write-Output 'Running Limited!' รับ -ExecutionPolicy -List
การใช้การกระทำ“ Run with PowerShell”:
การใช้การกระทำ“ Run with PowerShell (Admin)” หลังจากคลิกผ่าน UAC:
เพื่อแสดงการดำเนินการ ExecutionPolicy ที่ขอบเขตกระบวนการเราสามารถทำให้ Windows คิดว่าไฟล์มาจากอินเทอร์เน็ตด้วยรหัส PowerShell นี้:
เพิ่มเนื้อหา -Path 'D: \ Script Lab \ MyScript.ps1' - ค่า "[ZoneTransfer] 'nZoneId = 3" - สตรีม' Zone.Identifier '
โชคดีที่เราเปิดใช้งาน -NoExit มิฉะนั้นข้อผิดพลาดนั้นก็จะกระพริบตาและเราก็ไม่รู้เหมือนกัน!
Zone.Identifier สามารถลบออกได้ด้วยสิ่งนี้:
ล้างเนื้อหา -Path 'D: \ Script Lab \ MyScript.ps1' - สตรีม 'Zone.Identifier'
การอ้างอิงที่มีประโยชน์:
- การเรียกใช้สคริปต์ PowerShell จากไฟล์แบตช์ - บล็อกการเขียนโปรแกรมของ Daniel Schroeder
- กำลังตรวจสอบสิทธิ์ผู้ดูแลระบบใน PowerShell - เฮ้ Scripting Guy! บล็อก