Запуск програми без прав адміністратора і придушенням запиту UAC

Багато програм при запуску вимагають підвищення прав (значок щита у іконки), однак насправді для їх нормальної роботи прав адміністратора не потрібно (наприклад, ви вручну надали необхідні права користувачам на каталог програми в ProgramFiles і гілки реєстру, які використовуються програмою). Відповідно, при запуску такої програми з-під простого користувача, якщо на комп'ютері включений контроль облікових записів, з'явиться запит UAC і від користувача зажадає ввести пароль адміністратора. Щоб обійти цей механізм багато просто відключають UAC або надають користувачеві права адміністратора на комп'ютері, додаючи його в групу локальних адміністраторів. Природно, обидва ці способи небезпечні.

зміст:

  • Навіщо звичайному додатком можуть знадобиться права адміністратора
  • Запуск програми, що вимагає права адміністратора від звичайного користувача
  • Мінлива оточення __COMPAT_LAYER і параметр RunAsInvoker

Навіщо звичайному додатком можуть знадобиться права адміністратора

Права адміністратора можуть знадобитися програмі для модифікації деяких файлів (логи, конфігурації і т.д.) у власній папці у C: \ Program Files (x86) \ SomeApp). За замовчуванням у користувачів немає прав на редагування даного каталогу, відповідно, для нормальної роботи такої програми потрібні права адміністратора. Щоб вирішити цю проблему, потрібно під адміністратором на рівні NTFS вручну призначити на папку з програмою право на зміну / запис для користувача (або групи Users).

Примітка. Насправді практика зберігання змінюються даних програми у власному каталозі в C: \ Program Files невірна. Правильніше зберігати дані програми в профілі користувача. Але це питання вже про лінь і некомпетентність розробників.

Запуск програми, що вимагає права адміністратора від звичайного користувача

Раніше ми вже описували, як можна відключити запит UAC для конкретної програми, за допомогою параметра RunAsInvoker. Однак цей метод недостатньо гнучкий. Також можна скористатися RunAs зі збереженням пароля адміністратора / SAVECRED (також небезпечно). Розглянемо більш простий спосіб примусового запуску будь-якої програми без прав адміністратора (і без введення пароля адміністратора) при включеному UAC (4,3 або 2 рівень повзунка UAC).

Для прикладу візьмемо утиліту редагування реєстру - regedit.exe (Вона знаходиться в каталозі C: ​​\ windows \ system32). При запуску regedit.exe з'являється вікно UAC і, якщо не підтвердити підвищення привілеї, редактор реєстру не починається.

Створимо на робочому столі файл run-as-non-admin.bat з наступним текстом:

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

Тепер для примусового запуску додатка без права адміністратора і придушення запиту UAC, просто перетягніть потрібний exe файл на цей bat файл на робочому столі.

Після цього редактор реєстру повинен запуститься без появи запиту UAC. Відкривши диспетчер процесів, і додамо стовпець Elevated (З більш високим рівнем дозволів), ви побачите, що в системі є процес regedit.exe з непідвищення статусом (запущений з правами користувача).

Спробуйте відредагувати будь-який параметр в гілці HKLM. Як ви бачите доступ на редагування реєстру в цій гілці заборонений (у даного користувача немає прав на запис в системні гілки реєстру). Але ви можете додавати і редагувати ключі у власній гілці реєстру користувача - HKCU.

Аналогічним чином можна запускати через bat файл і конкретне додаток, досить вказати шлях до виконуваного файлу.

run-app-as-non-admin.bat

Set ApplicationPath = "C: \ Program Files \ MyApp \ testapp.exe"
cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% ApplicationPath%"

Також можна додати контекстне меню, яке додає у всіх додатків можливість запуску без підвищення прав. Для цього створіть наступний reg файл і імпортуйте його до реєстру.

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

Після цього для запуску будь-якої програми без прав адміністратора досить вибрати пункт "Run as user without UAC elevation"В контекстному меню.

Мінлива оточення __COMPAT_LAYER і параметр RunAsInvoker

Мінлива оточення __COMPAT_LAYER дозволяє встановлювати різні рівні сумісності для додатків (вкладка сумісність у властивостях exe файлу). За допомогою цієї змінної можна вказати настройки сумісності, з якими потрібно запускати програму. Наприклад, для запуску програми в режимі сумісності з Windows 7 і дозволом 640 × 480, встановіть:

set __COMPAT_LAYER = Win7RTM 640x480

З цікавих нам опцій змінної __COMPAT_LAYER виділимо наступні параметри:

  • RunAsInvoker - запуск програми з привілеями батьківського процесу без запиту UAC.
  • RunAsHighest - запуск програми з максимальними правами, доступними користувачеві (запит UAC з'являється якщо у користувача є права адміністратора).
  • RunAsAdmin - запуск додаток з правами адміністратора (запит AUC з'являється завжди).

Тобто параметр RunAsInvoker не надає права адміністратора, а тільки блокує появи вікна UAC.