ฉันมีสคริปต์ manteinance Powershell ที่ทำงานในลักษณะนี้:
kill explorer
do things
restart explorer
สคริปต์นี้รันในโหมดยกระดับ แต่ฉันจะต้องเริ่มการทำงานของ explorer ใหม่โดยไม่ต้องมีสิทธิ์ระดับผู้ดูแล ความคิดใด ๆ
ขอบคุณ
ฉันมีสคริปต์ manteinance Powershell ที่ทำงานในลักษณะนี้:
kill explorer
do things
restart explorer
สคริปต์นี้รันในโหมดยกระดับ แต่ฉันจะต้องเริ่มการทำงานของ explorer ใหม่โดยไม่ต้องมีสิทธิ์ระดับผู้ดูแล ความคิดใด ๆ
ขอบคุณ
คำตอบ:
เท่าที่ฉันรู้มันเป็นไปไม่ได้ที่จะเปิดตัวกระบวนการที่ไม่ผ่านการยกระดับโดยตรง (เช่นด้วยโทเค็นสิทธิ์ต่ำมาตรฐาน) จากกระบวนการยกระดับ นี่ไม่ใช่ขีด จำกัด PowerShell แต่เป็นวิธีการทำงานของ UAC ใน Windows
จากhttp://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx :
คำถามที่ถามบ่อยคือวิธีการเปิดแอปพลิเคชันที่ไม่ผ่านการยกระดับจากกระบวนการยกระดับหรือขั้นพื้นฐานมากขึ้นฉันจะเปิดใช้งานกระบวนการโดยใช้โทเค็นที่ไม่ยกระดับได้อย่างไรเมื่อฉันเรียกใช้งาน เนื่องจากไม่มีวิธีโดยตรงในการทำเช่นนี้สถานการณ์มักจะสามารถหลีกเลี่ยงได้โดยการเรียกใช้แอปพลิเคชันดั้งเดิมในฐานะผู้ใช้มาตรฐานและยกระดับบางส่วนของแอปพลิเคชันที่ต้องการสิทธิ์ระดับผู้ดูแลระบบเท่านั้น วิธีนี้มีกระบวนการที่ไม่ผ่านการยกระดับเสมอซึ่งสามารถใช้เพื่อเปิดใช้งานแอปพลิเคชันเพิ่มเติมในฐานะผู้ใช้เดสก์ท็อปที่เข้าสู่ระบบในปัจจุบัน อย่างไรก็ตามบางครั้งกระบวนการที่มีการยกระดับจำเป็นต้องทำให้แอปพลิเคชันอื่นทำงานไม่ได้รับการยกระดับ สามารถทำได้โดยใช้ตัวกำหนดตารางงานภายใน Windows Vista® กระบวนการยกระดับสามารถลงทะเบียนงานเพื่อให้ทำงานในฐานะผู้ใช้เดสก์ท็อปที่ล็อกอินในปัจจุบัน
บทความนั้นกล่าวถึงวิธีแก้ปัญหาที่เป็นไปได้สองวิธี:
เรียกใช้สคริปต์ของคุณให้มากที่สุดในโหมดที่ไม่ผ่านการยกระดับเท่าที่จะทำได้และยกระดับสำหรับส่วนที่ต้องการเท่านั้น กล่าวอีกนัยหนึ่งคือฆ่าและรีสตาร์ท 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 ดังนั้นหากสคริปต์นี้ทำงานโดยอัตโนมัติอย่างสมบูรณ์นั่นไม่ใช่ทางออกที่ดี
สร้างภารกิจที่กำหนดเวลาไว้เพื่อเรียกใช้ 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
สิ่งเดียวที่อยู่ในใจคือการใช้ตัวจัดตารางเวลางานเพื่อเรียกใช้ตัวสำรวจอีกครั้ง กระบวนการเริ่มต้นหรือวิธีอื่นใดดูเหมือนว่าจะรักษาสถานะที่ยกระดับ