В одной из предыдущих статей блога мы разбирали тему запуска определённых программ без “назойливого” окна Контроля учётных записей. B разбирали именно вариант обхода Контроля для конкретной программы с помощью Планировщика заданий. Таким методом пользуются сами программы ещё на этапе собственной установки в Windows. Что до меня, избавляться от этой “назойливости” отключением UAC полностью как функции я КРАЙНЕ не рекомендую. Несмотря на то, что система открыто позволяет это сделать, а настройки отключения Контроля находятся в, что называется, шаговой доступности, я не всегда порой понимаю, зачем Microsoft вообще позволяет это пользователям делать. Но, так или иначе, вопрос о том, как избежать появления окна для отдельных программ насущен. Так что вернёмся к этой теме и рассмотрим вопрос как запускать программу без окна Контроля учётных записей. В конце статьи маленькая видеоиллюстрация на тему, как всё это дело выглядит вживую.
Про что в статье?
- Переменные среды
- Причём здесь App-V?
- Обходим UAC батником
- Модернизируем ярлык программы для обхода UAC
- Добавим для обхода UAC специальный пункт в контекстное меню файлов
Я позволю себе немного теории, чтобы вы сориентировались в происходящем. Как уже говорилось, мы рассмотрим два метода к решению вопроса. И тот и другой будут основаны на манипуляциях с переменными, позволяющими устанавливать “среды совместимости”. С настройками исполнительных файлов в этой части, думаю, сталкивался каждый. Проверьте контекстное меню любого исполнительного файла на примере установщика популярного архиватора:
В нашей ситуации мы будем использовать возможности корректировать переменные в последней части окна, позволяющие запуск программы от имени администратора и по отношению к пользователям. И для этого можно предложить несколько вариантов развития событий. Все они, как я сказал, крутятся вокруг переменной __COMPAT_LAYER. Есть несколько опций для уточнения настроек, о которых следует помнить. Во вкладке они пере нами, а в качестве флагов для будущих команд они представлены так:
- 256Color – 8-ми разрядный цвет (256)
- 640×480 – Запуск с разрешением 640×480
- DisableThemes – Отключение визуальных эффектов
- Win98 – Запустить программу в режиме совместимости с Windows 98/Windows ME
- Win2000 – Запустить программу в режиме совместимости с Windows 2000
- WINXPSP3 – Запустить программу в режиме совместимости с Windows XP
- VistaSP2 – Запустить программу в режиме совместимости с Windows Vista
- Win7RTM – Запустить программу в режиме совместимости с Windows 7
- Win8RTM – Запустить программу в режиме совместимости с Windows 8
и т.д. С полным списком опций можно ознакомиться здесь. Таким образом, назначение переменной для конкретного случая выглядело бы примерно так:
set __COMPAT_LAYER=Win2000 640x480
Установленные настройки будут существовать до тех пор, пока есть сама переменная __COMPAT_LAYER. И переменную можно убить, остановив исполнение консольной команды, где она была прописана. Либо вручную направив “пустую” команду конкретному исполнительному файлу в виде
set __COMPAT_LAYER=
Такой подход к запуску любого исполнительного файла позволяет использовать один из самых интересных вариантов исключения окна Контроля учётных записей с помощью простого батника. То бишь batch-скрипта. Т.е. скрипт вы запустили, окно UAC не появилось. Но повторный запуск программы вновь заставит окно Контроля появиться как ни в чём не бывало, предотвращая несанкционированный запуск. Таким образом, окно UAC не появляется ИМЕННО тогда, когда это нужно пользователю.
Откуда растут ноги или кусок теории про App-V
Microsoft App-V, она же функция виртуализации приложений – компонент серверных и настольных операционных систем, функция которых разделять и изолировать устанавливаемые извне приложения со стороны от самой ОС-и и остальных программ. Программа “перехватывается” системой и динамически (в режиме онлайн) обрабатывается для показа пользователю. В нашем случае используется одна из главных возможностей функции App-V (но далеко не единственных) – Совместимость приложений различных поколений для одной и той же платформы. И от версии к версии системы менялся подход самой App-V по отношению к устанавливаемым в Windows программам. Так, в Windows XP, не имея административных прав, пользователь с некоторыми программами полноценно вообще работать не мог. А вот со времён появления Vista все приложения обязали использовать файл-манифест, уточняющий запрашиваемый уровень прав. Среди них были:
- asInvoker – запуск с ограниченными правами до момента, пока расширенные права не затребуются отдельной командой или со стороны другого запущенного от имени администратора процесса.
- highestAvailable – административный уровень; нужны права администратора, если пользователь админ; если пользователь не принадлежит к административной группе, доступ к функциям программы и её возможностям будет ограничен.
- requireAdministrator – требует административных прав; программа вообще не запустится, пока ей не предоставятся права.
В общем, учитывая тот факт, что редкая программа использовала “безобидные” функции и никуда по закоулкам системы не лазала, мало что в Windows можно запустить без предоставления ей расширенных прав. Т.е. минуя окно UAC. Частично решить этот вопрос и было призвано добавление переменой к пакету __COMPAT_LAYER=RunAsInvoker. Она заставляла систему отпихивать в сторону запрашиваемый уровень прав в виртуальной среде операндом asInvoker. К слову сказать, примерно такие же возможности достигаются утилитами SigCheck и Process Explorer от Sysyinternals. А с помощью Resource Hacker манифест можно просматривать напрямую. Но не суть.
СРАЗУ
Установка переменной __COMPAT_LAYER (первые символы – двойное подчёркивание) не повышает уровень ваших привилегий до административных. Если у вашей учётной записи таковых не имеется. Она именно не позволяет появиться окну Контроля и разрешает программе запуститься от имени любого пользователя. Таким образом использование перемененной безопасно до тех пор, пока некто не заполучит чудесным образом права Администратора. Так что любая вариация с переменными RunAsHighest (заставит UAC появиться, если права Администратора есть) или RunAsAdmin (инициирует окно Контроля всегда) относительно безопасны.
Как запускать программу без Контроля учётных записей с помощью батника?
Суть метода заключается в следующем. Каждая из запускаемых программ будет проходить процедуру присвоения переменных в режиме совместимости. Назначать вручную мы ничего не станем. Для этого подойдут возможности командной консоли, в среде которой выбранное приложение и запустится. Для этого:
- открываем Блокнот и вводим код:
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" "%1""
закроем его, присвоив произвольное имя, но с расширением .bat. Чтобы так сделать, вам придётся заставить Windows отображать скрытые файлы и папки.
Или скачать готовый приготовленный мною батник в архиве по ссылке:
Скачать архив с бат-файлом Запуск без UAC
Распакуйте и расположите его на Рабочем столе. Суть работы с ним проста: зацепите ярлык нужного файла .exe и перетащите на распакованный батник. Программа запустится без окна предупреждения со стороны Контроля учётных записей. Способ не всегда срабатывает при обращении к ярлыкам, созданным именно системой (в момент установки программы) из-за витиеватых настроек символьных ссылок. Потому, кому такой способ придется по душе, советую создать ярлык на рабочем столе самостоятельно с указанием на Расположение объекта. Либо воспользоваться другими способами.
Как запускать программу без Контроля учётных записей с ярлыка?
Команду выше можно применять для конкретной программы, скорректировав путь в ярлыке к ней. Для этого в поле адреса ярлыка добавим слева
cmd.exe /c SET __COMPAT_LAYER=RunAsInvoker & START “”
Т.е. вместо, допустим
"C:\Program Files\VS Revo Group\Revo Uninstaller Pro\RevoUninPro.exe"
Должно стать:
C:\Windows\System32\cmd.exe /c SET __COMPAT_LAYER=RunAsInvoker & START "" "C:\Program Files\VS Revo Group\Revo Uninstaller Pro\RevoUninPro.exe"
По необходимости смените значок ярлыка, поискав подходящий в папке с этой программой.
Вариант три: настройки реестра
С той же целью вы можете прописать в контекстном меню исполнительных файлов особый пункт. Назовём его, скажем, Запуск без окна UAC.
Для этого в текстовом редакторе типа NotePad++ (Window-возный Блокнот не подойдёт для русской локали) пропишите вот этот код:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Запуск без окна UAC"
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /whatever /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""
Сохраните файл с расширением .reg. Если соберётесь прописать контекстный пункт вручную с помощью:
- NotePad++ и ему подобного на русском, укажите кодировку Windows-1251
- Блокнота, задайте в поле команды @=”Запуск без окна UAC” вместо указанного имя типа “No_UAC”, чтобы контекстное меню выглядело без кракозябров:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="No_UAC"
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /whatever /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""
Если от пункта устанете или ошибётесь на первых порах в названии, удалите параметр из cmd от имени администратора:
reg delete HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker
Как всегда, можете скачать готовый вариант reg-файла с К76 в архиве:
Скачать Запуск программы без UAC из контекстного меню
Проверяйте. Всем успехов.