Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธีรันโปรแกรมโดยไม่มีสิทธิ์ Admin และข้าม UAC Prompt

โปรแกรมหลายตัวต้องการการยกระดับสิทธิ์ (โล่บนไอคอนแอป) เมื่อเริ่มต้น แต่จริงๆ แล้วไม่จำเป็นต้องมีสิทธิ์ Administrator สำหรับการทำงานปกติ ตัวอย่างเช่น สามารถให้สิทธิ์ผู้ใช้ด้วยตนเองบนโฟลเดอร์แอปใน ProgramFiles และ/หรือ Registry Keys ที่โปรแกรมใช้ ดังนั้นเมื่อเริ่มโปรแกรมภายใต้บัญชีผู้ใช้ Non-admin จะมี UAC Prompt ปรากฏและต้องการรหัสผ่าน Administrator (หาก User Account Control เปิดใช้งานบนคอมพิวเตอร์) เพื่อข้ามกลไกนี้ ผู้ใช้หลายคนแค่ปิด UAC หรือให้สิทธิ์ Admin แก่ผู้ใช้โดยเพิ่มบัญชีผู้ใช้เข้ากับกลุ่ม Local "Administrators" ทั้งสองวิธีไม่ปลอดภัย

ทำไมบางแอป Windows ไม่รันภายใต้ Standard Users และต้องการสิทธิ์ Administrator

แอปอาจต้องการสิทธิ์ Administrator เพื่อแก้ไขไฟล์บางไฟล์ (Logs, Configs ฯลฯ) ในโฟลเดอร์ของมันใน C:\Program Files (x86)\SomeApp โดยค่าเริ่มต้น ผู้ใช้ไม่มีสิทธิ์ Edit (Write และ Modify) บนไดเรกทอรีนี้ เพื่อให้โปรแกรมนี้ทำงานปกติ จำเป็นต้องมีสิทธิ์ Administrator เพื่อแก้ไขปัญหานี้ ต้องให้สิทธิ์ Modify และ/หรือ Write แก่ผู้ใช้ (หรือกลุ่ม Users ในตัว) บนโฟลเดอร์แอปที่ระดับระบบไฟล์ NTFS

หมายเหตุ. จริงๆ แล้วไม่แนะนำให้เก็บ Application Data ที่เปลี่ยนแปลงได้ในโฟลเดอร์ของมันภายใต้ C:\Program Files ควรเก็บ App Data ใน User Profile แต่เป็นเรื่องของความเกียจและความไม่เชี่ยวชาญของนักพัฒนาแอป

วิธีรันโปรแกรมที่ต้องการ Admin Privileges ภายใต้ Standard User

เราอธิบายไว้ก่อนหน้านี้วิธีปิด UAC Prompt สำหรับแอปเฉพาะโดยใช้พารามิเตอร์ RunAsInvoker แต่วิธีนี้ไม่เพียงพอต่อความยืดหยุ่น

ยังสามารถใช้ RunAs ด้วยรหัสผ่าน Administrator ที่บันทึกไว้ (ใน Windows Credentials Manager) โดยใช้ตัวเลือก /SAVECRED ก็ได้ แต่ก็ไม่ปลอดภัย เพราะผู้ใช้สามารถใช้รหัสผ่าน Administrator ที่บันทึกไว้เพื่อรันโปรแกรมใดๆ บนคอมพิวเตอร์นี้ได้

มาพิจารณาวิธีง่ายกว่า เพื่อบังคับให้โปรแกรมใดๆ รันโดยไม่มีสิทธิ์ Administrator (โดยไม่ต้องป้อนรหัสผ่าน Admin) และเปิดใช้งาน UAC (ระดับ 4, 3 หรือ 2 ของ UAC Slider)

มาใช้ Registry Editor เป็นตัวอย่าง — regedit.exe (อยู่ที่ C:\Windows\) สังเกตโล่ UAC ถัดจากไอคอนแอป ไอคอนนี้หมายความว่าจะขอการยกระดับสิทธิ์ผ่าน UAC เพื่อรันโปรแกรมนี้

หากรัน regedit.exe จะเห็นหน้าต่าง User Account Control ขอข้อมูลประจำตัว Administrator (Do you want to allow this app to make changes to your device?) หากไม่ให้รหัสผ่านและไม่ยืนยันการยกระดับ แอปจะไม่เริ่มต้น

ลองข้ามคำขอ UAC สำหรับโปรแกรมนี้ สร้างไฟล์ข้อความ run-as-non-admin.bat ที่มีโค้ดต่อไปนี้บน Desktop:

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

เพื่อบังคับให้ regedit.exe รันโดยไม่มีสิทธิ์ Administrator และซัพเพรส UAC Prompt ให้ลากไฟล์ EXE ที่ต้องการเริ่มต้นไปวางบนไฟล์ BAT นี้บน Desktop

Registry Editor ควรเริ่มต้นโดยไม่มี UAC Prompt และโดยไม่ต้องป้อนรหัสผ่าน Administrator หากเปิด Task Manager และเพิ่มคอลัมน์ Elevated จะเห็นว่ากระบวนการ regedit.exe ไม่มีสถานะ Elevated (รันด้วยสิทธิ์ Non-admin User)

ลองแก้ไขพารามิเตอร์ใดๆ ใน HKEY_LOCAL_MACHINE Registry Hive ตามที่เห็น ผู้ใช้ไม่สามารถแก้ไขรายการใน Registry Key นี้ได้ (ผู้ใช้ไม่มีสิทธิ์ Write บน System Registry Keys) แต่สามารถเพิ่มหรือแก้ไข Registry Keys และ Parameters ใน User Hive ของคุณ — HKEY_CURRENT_USER

สามารถรันแอปใดๆ ด้วยไฟล์ BAT ได้เช่นกัน เพียงระบุ Path ไปยัง Executable File

run-app-as-non-admin.bat
Set ApplicationPath="C:\Program Files\SomeApp\testapp.exe"
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"

ยังสามารถเพิ่ม Context Menu ให้รันทุกแอปโดยไม่ต้อง Elevate ได้ โดยสร้างไฟล์ RunAsUser.REG คัดลอกโค้ดต่อไปนี้ใส่ไป บันทึกและนำเข้า Windows Registry โดยดับเบิลคลิกบนไฟล์ REG (ต้องการสิทธิ์ Administrator เพื่อนำไปใช้)

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run as user without UAC privilege elevation"
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

หลังจากนั้น เพื่อรันแอปพลิเคชันใดๆ โดยไม่มีสิทธิ์ Administrator เพียงเลือก "Run as user without UAC privilege elevation" ใน Context Menu ของ File Explorer

สามารถปรับใช้ตัวเลือกนี้ไปยังคอมพิวเตอร์ทั้งหมดในโดเมนโดยการนำเข้าพารามิเตอร์ Registry ผ่าน GPO
เตือนอีกครั้ง. การใช้โปรแกรมในโหมด RUNASINVOKER ไม่จะให้สิทธิ์ Administrator แค่ซัพเพรส UAC Prompt และบอกโปรแกรมว่าให้รันด้วยสิทธิ์ของผู้ใช้ปัจจุบัน และไม่ขอยกระดับสิทธิ์ หากโปรแกรมจริงๆ ต้องการสิทธิ์สูงเพื่อแก้ไขการตั้งค่าระบบหรือไฟล์ มันจะไม่ทำงานหรือขอสิทธิ์ Admin อีกครั้ง

วิธี Bypass UAC ด้วย RunAsInvoker ใน __COMPAT_LAYER

ตัวแปรสภาพแวดล้อม __COMPAT_LAYER อนุญาตให้ตั้งค่าระดับความเข้ากันได้ต่างๆ สำหรับแอปพลิเคชัน (แท็บ Compatibility ในคุณสมบัติของไฟล์ EXE) โดยใช้ตัวแปรนี้ สามารถระบุการตั้งค่าความเข้ากันได้ที่จะใช้เมื่อเริ่มโปรแกรม ตัวอย่างเช่น เพื่อเริ่มแอปในโหมดความเข้ากันได้ Windows 8 และความละเอียด 640×480 ตั้งค่า:

set __COMPAT_LAYER=Win8RTM 640x480

ตัวแปร __COMPAT_LAYER มีตัวเลือกบางอย่างที่เราสนใจ มีพารามิเตอร์ดังนี้:

  • RunAsInvoker – รันแอปด้วยสิทธิ์ของกระบวนการหลักโดยไม่มี UAC Prompt
  • RunAsHighest – รันโปรแกรมด้วยสิทธิ์สูงสุดที่ผู้ใช้มี (UAC Prompt จะปรากฏหากผู้ใช้มีสิทธิ์ Administrator)
  • RunAsAdmin – รันแอปเป็น Administrator (UAC Prompt ปรากฏทุกครั้ง)

หมายความว่าพารามิเตอร์ RunAsInvoker ไม่ให้สิทธิ์ Administrator แค่ซัพเพรส UAC Prompt เท่านั้น

โค้ด CMD ต่อไปนี้เปิดโหมด RunAsInvoker สำหรับกระบวนการปัจจุบันและรันโปรแกรมที่ระบุโดยไม่ยกระดับสิทธิ์:

set __COMPAT_LAYER=RUNASINVOKER
start "" "C:\Program Files\MyApp\testapp.exe"

เปิดใช้งานโหมด RunAsInvoker ใน Manifest ของไฟล์ EXE

как กล่าวข้างต้น Windows 10 แสดงไอคอนโล่ UAC สำหรับโปรแกรมที่ต้องการ Elevation เพื่อรัน นักพัฒนาตั้งค่าความต้องการนี้เมื่อคอมไพล์แอปพลิเคชันใน Manifest ของโปรแกรม

สามารถแก้ไข Manifest ของไฟล์ EXE ใดๆ และปิดใช้งานข้อกำหนดให้รันโปรแกรมในโหมด Elevated

เพื่อแก้ไข Manifest โปรแกรม สามารถใช้เครื่องมือฟรี Resource Hacker เปิดไฟล์ Executable ของแอปใน Resource Hacker

ในตัวอย่างนี้ จะแก้ไข Manifest ของเครื่องมือ Autologon.exe โดย Sysinternals ซึ่งใช้สำหรับ Logon Windows อัตโนมัติโดยไม่ต้องใช้รหัสผ่าน

ใน Tree ด้านซ้าย ไปที่ส่วน Manifest และเปิด Manifest โปรแกรม สังเกตส่วน XML ต่อไปนี้:

<requestedPrivileges>
  <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>

เพราะตัวเลือก requireAdministrator Windows จึงพยายามรันโปรแกรมนี้เป็น Administrator เสมอ

เปลี่ยน requireAdministrator เป็น asInvoker และบันทึกการเปลี่ยนแปลงในไฟล์ EXE

หากไฟล์ Executable ของแอปลงนามด้วย MS Authenticode (Code Signing Certificate) หลังแก้ไขไฟล์ EXE อาจหยุดทำงานหรือแจ้งเตือน

ในกรณีนี้ สามารถบังคับให้โปรแกรมใช้ External Manifest File สร้างไฟล์ข้อความธรรมดา appname.exe.manifest (เช่น Autologon.exe.manifest) ในไดเรกทอรีกับไฟล์ EXE และคัดลอกโค้ด Manifest จาก Resource Hacker ใส่ไป เปลี่ยน requireAdministrator เป็น asInvoker บันทึกไฟล์ Manifest

เพื่อให้ Windows พยายามใช้ External Manifest File เสมอเมื่อเปิดไฟล์ EXE ให้เปิดใช้งานพารามิเตอร์ Registry พิเศษ:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide" /v PreferExternalManifest /t REG_DWORD /d 1 /f

รีสตาร์ท Windows และตรวจสอบว่าโปรแกรมใช้ External Manifest File ที่บอกให้รันโดยไม่มีสิทธิ์ Administrator