В этой статье мы покажем, как в Windows выборочно отключить UAC (User Account Control) для определенной программы, не отключая службу контроля учетных записей полностью. Для подавления отображения запроса повышения привилегий UAC у приложения мы будет использовать флаг совместимости RunAsInvoker</strong>.
В моем случае я хочу отключить появления запроса User Account Control для произвольного приложения.
- При запуске программы от имени учетной записи с правами администратора появляется запрос UAC на подтверждение запуска

- Невозможен запуск программы от пользователя без прав администратора. Если программа запускается от имени пользователя, появляется окно запроса UAC для ввода пароля администратора

Мне нужно разрешить запуск этой программы из-под непривилегированного пользователя с подавлением запроса UAC. При этом не отключая контроль учетных записей полностью.
Это можно реализовать с помощью флага совместимости RunAsInvoker, который обеспечивает принудительный запуск приложения с теми же правами, что и родительское приложение, а появление окна UAC подавдяется. Т.е. например, при запуске приложения из проводника Windows (непривилегированный процесс), приложение будет также запущено в непривилегированном режиме.
Отключение UAC для программы с помощью Application Compatibility Toolkit
Нам понадобится утилита Application Compatibility Toolkit, которая входит в состав Windows ADK. Скачать актуальную версию ADK для Windows 11 и 10 можно здесь.
Запустите скачанный файл adksetup.exe и при установке (программе нужен доступ в Интернет) выберите только Application Compatibility Toolkit.
Или установите компонент командой:
adksetup.exe /features OptionId.ApplicationCompatibilityToolkit

В системе появится две версии Application Compatibility Administrator — 32-х и 64-х битная версия. Запустите версию Application Compatibility Administrator в зависимости от разрядности приложения, для которого вы хотите отключить запрос UAC.

Запустите утилиту Compatibility Administrator (32-bit) с правами администратора (!). В разделе Custom Databases, щелкните ПКМ по элементу New Database и выберите пункт Create New-> Application Fix.

В открывшемся окне нужно указать имя приложения, разработчика и путь к исполняемому файлу ( C:Program FilesSpecAppO2SpecAppO2.exe ).

Пропустите следующее окно мастера настройки (Compatibility Mode), нажав Next. В окне Compatibility Fixes отметьте опцию RunAsInvoker.
При желании можно убедиться, что приложение может работать без UAC, нажав на кнопку тестового запуска (Test Run).

В окне Matching Information можно указать какие параметры приложения нужно проверять при его запуске в режиме совместимости (ORIGINAL_FILENAME, версию, чексумму, размер, COMPANY_NAME и т.д.). В тестовой среде можно отключить все опции. Но в продуктивном окружении желательно настроить эти параметры для защиты от подмены файла.

Нажмите Finish и укажите имя файла, в который нужно сохранить созданный пакет исправления совместимости, например SpecAppO2_UAC_disabled.sdb . В этом файле будут содержаться инструкции по запуску приложения в режиме совместимости.

Осталось установить пакет с исправлением совместимости. Сделать это можно непосредственно из консоли Compatibility Administrator (выбрав в меню пункт Install). 
Файл SpecAppO2_UAC_disabled.sdb можно передать на другие компьютеры с приложением и применить (установить) его из командной строки:
sdbinst -q c:psregedit.sdb
Если все сделали правильно, появится сообщение об успешном применении пакета.
Installation of regedit complete.

После установки пакета, соответствующая запись появится в списке установленных программ Windows.

Попробуйте теперь запустить приложение в сессии обычного пользователя (без прав локального администратора). Теперь оно должно запуститься без появления запроса UAC.
Чтобы проверить, с какими привилегиями запущено приложение, откройте Task Manager и на вкладке процессов добавьте столбец Elevated. Убедитесь, что процесс вашего приложения запущен в непривилегированном режиме ( Elevated=No ).

Чтобы удалить исправление совместимости, выполните команду:
sdbinst –u c:psregedit.sdb
Включить флаг RUNASINVOKER для программы через реестр
Windows может автоматически применять флаг совместимости RUNASINVOKER для определенных программ. Для этого в ветке реестра HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers нужно создать строковый параметр (REG_SZ) содержащий полный путь к EXE файлу программы:
- Имя параметра:
C:Program FilesSpecAppO2SpecAppO2.exe - Значение:
RunAsInvoker

Можно создать такой параметр в реестре командой:
reg add "HKCUSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers" /v "полный_путь_к_приложению.exe" /t REG_SZ /d "RUNASINVOKER" /f
Если нужно включить режим совместимости приложения для всех пользователей компьютера, этот параметр нужно создать в ветке реестра: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers .
Теперь по умолчанию указанная программа будет всегда запускаться без запроса UAC, кроме случаев, когда запуск от имени администратора был выполнен принудительно.
Запуск приложения в режиме RunAsInvoker из командной строки
Есть еще вариант для запуск приложения без прав администратора и подавлением запроса UAC из командной строки (см. статью)
Для запуска программы с флагом совместимости RunAsInvoker из командной строки можно использовать такую команду:
cmd /C "set __COMPAT_LAYER=RunAsInvoker && start "" "C:Program FilesSpecAppO2SpecAppO2.exe""
Или создайте BAT со следующим кодом:
Set ApplicationPath= C:Program FilesSpecAppO2SpecAppO2.exe"
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"

При запуске этого bat файла под пользователем, указанное приложение запустится без появления запроса UAC.
Можно создать простой REG файл, применив который вы добавите в контекстное меню всех программ опцию запуска без повышения привилегий.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT*shellforcerunasinvoker] @="Run without privilege elevation" [HKEY_CLASSES_ROOT*shellforcerunasinvokercommand] @="cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" "%1"""

Теперь, щелкнув по любому приложению вы можете использовать опцию Run without privilege elevation.

Используем планировщик заданий для запуска приложения без запроса UAC
Еще один вариант запуска приложения без запроса UAC возможен за счет использования планировщика задания Windows. Он позволит убрать окно запроса повышения привилегий UAC, но фактически всегда запускать приложения с правами администратора в режиме Elevated. В отличии от других способов, этот способ будет работать только в сессии пользователя с правами администратора.
Идея в том, чтобы создать задание запуска программы в Task Scheduler, с включенной опцией Run with highest privileges.

Это задание можно создать вручную из графической консоли taskschd.msc, но проще использовать готовую команду для генерации такого задание. Откройте командную строку с правами админа и выполните:
schtasks /create /tn "RunGeekAppElevated" /tr "'C:Program FilesGeek Uninstallergeek.exe'" /SC ONCE /ST 12:00 /RL HIGHEST /F

Теперь для запуска нужного приложения без запроса UAC, но с правами администратора, нужно выполнить (не обязательно под админом) команду:
schtasks /run /tn "RunGeekAppElevated" /i

Для удобства, можно создать ярлык с этой командой на рабочем столе пользователя.
Проверьте, что программа запускается с правами админа ( Elevated=Yes ), но окно запроса контроля учетных записей не появляется.

Итак, мы рассмотрели, как отключить UAC для конкретной программы без полного отключения контроля учетных записей на компьютере. Это позволит вам запускать программы Windows под обычным пользователем без появления запроса UAC и без пароля администратора.

Добавить комментарий