โหลด explorer จาก powershell ด้วยสิทธิ์ต่ำ


2

ฉันมีสคริปต์ manteinance Powershell ที่ทำงานในลักษณะนี้:

kill explorer
do things
restart explorer

สคริปต์นี้รันในโหมดยกระดับ แต่ฉันจะต้องเริ่มการทำงานของ explorer ใหม่โดยไม่ต้องมีสิทธิ์ระดับผู้ดูแล ความคิดใด ๆ

ขอบคุณ

คำตอบ:


6

เท่าที่ฉันรู้มันเป็นไปไม่ได้ที่จะเปิดตัวกระบวนการที่ไม่ผ่านการยกระดับโดยตรง (เช่นด้วยโทเค็นสิทธิ์ต่ำมาตรฐาน) จากกระบวนการยกระดับ นี่ไม่ใช่ขีด จำกัด PowerShell แต่เป็นวิธีการทำงานของ UAC ใน Windows

จากhttp://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx :

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

บทความนั้นกล่าวถึงวิธีแก้ปัญหาที่เป็นไปได้สองวิธี:

  1. เรียกใช้สคริปต์ของคุณให้มากที่สุดในโหมดที่ไม่ผ่านการยกระดับเท่าที่จะทำได้และยกระดับสำหรับส่วนที่ต้องการเท่านั้น กล่าวอีกนัยหนึ่งคือฆ่าและรีสตาร์ท explorer ในสคริปต์ที่ไม่ผ่านการยกระดับและเรียกใช้สคริปต์ที่สองในโหมดยกระดับเพื่อ "ทำสิ่งต่าง ๆ ":

    Stop-Process -ProcessName explorer
    Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1"
    Start-Process explorer.exe
    

    Runasคำกริยาจะทำให้เกิดกระบวนการ PowerShell ที่สองที่จะเริ่มต้นในโหมดการยกระดับ อย่างไรก็ตามสิ่งนี้จะทริกเกอร์พรอมต์ UAC ดังนั้นหากสคริปต์นี้ทำงานโดยอัตโนมัติอย่างสมบูรณ์นั่นไม่ใช่ทางออกที่ดี

  2. สร้างภารกิจที่กำหนดเวลาไว้เพื่อเรียกใช้ explorer เมื่อการดำเนินงานที่ยกระดับเสร็จแล้วให้เรียกใช้งานและลบงานนั้น คุณสามารถใช้schtasks.exeเพื่อทำสิ่งนี้:

    schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon
    schtasks /Run /TN "foobar"
    schtasks /Delete /TN "foobar" /F
    

    เพียงให้แน่ใจว่าได้เลือกชื่อสำหรับงานที่จะไม่ขัดแย้งกับงานอื่น

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

ตัวเลือกที่สามถ้าสคริปต์ของคุณรันโดยคุณเท่านั้นคือการกำหนดค่าให้เริ่มกระบวนการ explorer.exe ใหม่ด้วยข้อมูลประจำตัวของคุณ:

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (ConvertTo-SecureString -String "password" -AsPlainText -Force))
Start-Process explorer.exe -Credential $Cred

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

Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\pw_encrypted.txt

จากนั้นพิมพ์รหัสผ่านของคุณ (มันจะแสดงเป็นเครื่องหมายดอกจันในพรอมต์ PS) และกด Enter ตอนนี้คุณสามารถใช้มันในสคริปต์ของคุณเช่น:

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (Get-Content C:\pw_encrypted.txt | ConvertTo-SecureString))
Start-Process explorer.exe -Credential $Cred

1

สิ่งเดียวที่อยู่ในใจคือการใช้ตัวจัดตารางเวลางานเพื่อเรียกใช้ตัวสำรวจอีกครั้ง กระบวนการเริ่มต้นหรือวิธีอื่นใดดูเหมือนว่าจะรักษาสถานะที่ยกระดับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.