Принудительно запустить программу * без * прав администратора или UAC?

122

Есть ли способ заставить программу, которая обычно требует прав администратора (через UAC), работать без них? (т.е.: нет запроса UAC и нет общесистемного доступа .)

Добавлено: без изменения самого исполняемого файла.


Несмотря на ответ Джеймса, я нашел несколько способов, которыми это можно почти сделать:

  1. Изменяя исполняемый файл, я могу удалить trustInfoзапись из манифеста (или полностью из манифеста, чтобы я мог использовать внешний), что позволяет программе запускаться без UAC. К сожалению, это изменяет исполняемый файл, поэтому он завершается вскоре после проверки внутренней контрольной суммы.
  2. Используя Process Explorer, я могу запустить его как пользователь с ограниченными правами. Однако это, кажется, ограничивает его значительно больше, чем мне бы хотелось (он работает как защищенный режим IE и поэтому может получить доступ значительно меньше, чем мой стандартный пользователь без повышенных прав).
Эндрю Рассел
источник
1
Вы указываете, что не изменяете исполняемый файл, но изменение .exe является одним из ваших попыток?
cutrightjm
3
@ekaj Я только уточнил, что после того, как узнал, что это не сработает;)
Эндрю Рассел
Не могли бы вы указать программу, даже если вы больше ее не используете? Это может помочь людям узнать, к чему он пытается получить доступ, для чего требуются права администратора
cutrightjm
@ekaj К сожалению нет. Однако это не особенно актуально: UAC запускается программой, запрашивающей повышение прав при создании процесса (обычный способ - как в этом случае - с манифестом). После запуска процесса он не может изменить свое состояние повышения прав - независимо от того, к каким ограниченным ресурсам он пытается получить доступ.
Эндрю Рассел
Если программа не имеет манифеста и отказывается работать без прав администратора, это, скорее всего, связано с обнаружением установщика UAC. Я разместил этот вопрос, и у misha256 есть хорошее решение. Я проверил это, и я могу подтвердить, что это работает. superuser.com/questions/857616/… Я провел некоторое исследование и обнаружил, что нет никаких оснований для обнаружения установщика. Обратите внимание, что если права администратора связаны с записью trustinfo в манифесте, очевидно, это не будет работать.
user1258361

Ответы:

74
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run without privilege elevation"

[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

Сохраните этот текст <name_of_file>.regи добавьте его в реестр Windows. (Двойной щелчок по нему должен помочь.)

Затем щелкните правой кнопкой мыши приложение, которое вы хотите запустить без прав администратора, и выберите «Запуск без повышения привилегий».

В некоторых случаях - небольшое количество 0,1% программ могут дважды спрашивать о подсказке UAC.

Vom
источник
1
Раньше я использовал прокладку Application Compatibility Toolkit, но это было много работы для каждого исполняемого файла и оставил мусор в реестре для каждого файла. Этот метод работает, и мне он нравится намного лучше.
Бен Фойгт
2
Принятие этого, так как это кажется самым простым методом, и я ( наконец-то! ) Смог это проверить. Также имеет очень приятное свойство тривиального использования в качестве единовременной командной строки (удалите внешнюю "и затем поверните \"в ").
Эндрю Рассел
1
У меня та же проблема, что и у @Derek, кажется, что приложение постоянно повторяет запрос UAC, я не доверяю ему доступ к системе, но мне нужна его функциональность ..
Gizmo
1
Вы можете добавить это в реестр только для текущего зарегистрированного пользователя, изменив ключи на: HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker и HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command
GodEater
1
@ jpmc26 Я думаю, что /minэто ошибка. Решение работает точно так же без него. Фом, должно быть, перепутал cmdи startпереключается. Кажется, что cmd.exeне жалуется на неправильные переключатели. Попробуйте cmd /whatever, например.
cdlvcdlv
53

Сохранить в nonadmin.bat:

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

Теперь вы можете перетаскивать программы, чтобы запустить их без администратора.

Это не требует прав администратора, как изменение этого раздела реестра. Также вы не будете загромождать контекстное меню.

На основании ответа Вома


Обновление: теперь должно работать с программами, в имени которых также есть пробелы.

Hjulle
источник
Я пробовал это на некоторых программах, требующих доступа к моим дискам, и он не мог их обнаружить или вообще не работал: / (rufus rufus.akeo.ie, например)
keinabel
7
@keinabel Это, вероятно, потому что им действительно нужен админ для работы. Этот скрипт предназначен для программ, требующих прав администратора, но не выполняющих то, что требуется. Необработанный доступ к дискам - типичная вещь администратора.
Хюлле
2
Довольно аккуратно! Был в состоянии установить XAMPP, используя этот метод.
Кришнарадж
Мне кажется, это не работает для любых исполняемых файлов в каталоге «C: \ Program Files \ ...». Я получаю Windows cannot find 'C:\Program'. Make sure you typed the name correctly, and then try again. Я пробовал эту команду вручную несколько раз с небольшими изменениями и не повезло. Есть идеи?
Джейк Смит
1
У меня была такая же проблема с расположением файла в папке с пробелами. Решил это, удалив несколько двойных кавычек: cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% 1"
ragnar
35

Я надеюсь, что я не слишком поздно для вечеринки, но я искал похожий вопрос и, не видя ответа здесь, я обнаружил, что встроенная RunAsкоманда Windows , при запуске от имени администратора, может сделать это с помощью /trustlevelswitch.

RUNAS /trustlevel:<TrustLevel> program

/showtrustlevels  displays the trust levels that can be used
                  as arguments to /trustlevel.
/trustlevel       <Level> should be one of levels enumerated
                  in /showtrustlevels.

Это сработало в моем случае. По иронии судьбы, запуск программы явно без повышения прав требует командной строки с повышенными правами . Пойди разберись. :) Надеюсь, это поможет вам.

Mxx
источник
Я могу подтвердить, что это не работает. Я только что проверил это и получил ошибку: «ОШИБКА RUNAS: Невозможно запустить - (имя программы здесь). Запрошенная операция требует повышения прав».
user1258361
9
@ user1258361 Вы должны запустить эту команду из привилегированного приглашения, как я написал жирным шрифтом ...
Mxx
Похоже, что для Windows 7 не требуется повышенное приглашение ...
SamB
4
Протестировано с повышенными привилегиями, используется runas / trustlevel: 0x20000 (программа) из командной строки, программа все равно запускалась от имени администратора. Для справки: 0x20000 - основной пользователь.
user1258361
2
требует командной строки с повышенными правами ... конечно, это так. В противном случае у вас уже нет прав администратора, и любой процесс, который вы запускаете, также будет лишен их.
Twisty Impersonator
16

Если у вас есть конкретное приложение, которое вы хотите всегда запускать без UAC, вы можете настроить его для Реестра (добавьте текст в файл REG и импортируйте его в Реестр):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\example\\application.exe"="RunAsInvoker"

В отличие от этого ответа , это решение не требует альтернативного щелчка или изменения для взаимодействия с пользователем.

Microsoft называет этот процесс добавлением RunAsInvoker «Shim совместимости» .

palswim
источник
Ответ на другой, но связанный с этим вопрос послужил источником вдохновения для этого ответа.
Palswim
1
Большое спасибо! Это было единственное, что сработало для меня! У меня было приложение, которое вызывалось из контекстного меню Windows, и оно всегда появлялось как администратор, несмотря на то, что оно вызывалось правильно из любого места. После этого исправления приложение стало вызываться правильно.
пользователь
3

Я решил эту проблему сегодня, используя инструментарий для настройки приложений MS.

Я следовал инструкциям в статье из технической республики .

В основном:

1) Вы получаете инструментарий от MS здесь .

2) Нажмите Исправить

3) Выберите опцию RunAsInvoker

4) Щелкните правой кнопкой мыши по исправлению и выберите «Установить».

user53639
источник
Ваш ответ делает в точности противоположность желаемого эффекта. Первоначальный вопрос заключался в том, как заставить приложение, которое запрашивает повышенные привилегии, работать без повышения прав. Ваш ответ по-прежнему использует UAC, но просто отключает эту подсказку. Это неправильный ответ на этот вопрос.
Mxx
@mxx на самом деле нет. Если текущий пользователь ограничен (или у вас включен UAC), тогда процесс будет запущен с ограниченными правами.
LogicDaemon
1
@LogicDaemon Если вы действительно прочитаете статью, то увидите, что она объясняет, что если вы выполните эти шаги, вы запустите приложение от имени администратора без запроса UAC . Это противоположно тому, что попросил ОП.
Mxx
@ MXX Нет. Читайте на сайте TechNet , что на самом деле сделать RunAsInvoker. Это действительно то, о чем просил themestarter, хотя это работает только для старых приложений.
LogicDaemon
Пока Explorer, командный пользователь, не являющийся администратором, или любой другой стандартный процесс является родительским, RunAsInvoker будет работать с теми же ограниченными правами. (Проводник по умолчанию работает с ограничениями, в противном случае он никогда не попросит вас повысить права на удаление файла.) На самом деле он работает даже с новыми приложениями. RunAsInvoker означает, что он наследует тот же токен ACL.
SilverbackNet,
3

Если это установочный (установочный) exeфайл, требующий прав администратора, есть способ запустить его без повышенных прав доступа:

Если имя файла содержит такие слова, как setupили installWindows, принудительно запускает его с повышенными правами доступа, даже если ему не нужны повышенные права доступа:

введите описание изображения здесь

Если в файле .exe есть манифест, эти эвристики для повышения прав не применяются.

Это задокументировано в документах UAC (Контроль учетных записей):

Обнаружение установщика обнаруживает установочные файлы, что помогает предотвратить запуск установок без ведома и согласия пользователя.

Обнаружение установщика относится только к:

  • 32-битные исполняемые файлы.

  • Приложения без запрошенного атрибута уровня выполнения.

  • Интерактивные процессы, выполняемые как обычный пользователь с включенным контролем учетных записей.

Перед созданием 32-разрядного процесса проверяются следующие атрибуты, чтобы определить, является ли он установщиком:

  • Имя файла включает в себя такие ключевые слова, как «установить», «настройка» или «обновление».

  • ...

Режим чтения здесь: https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works

Шаян
источник
2
Конечно, это работает только тогда, когда в манифесте приложения явно не указано, что оно должно выполняться с повышенными правами.
Даниэль Б
3
@DanielB: на самом деле этот трюк работает только тогда, когда нет манифеста
AntoineL
1
Upvoted. Хорошее наблюдение. Ссылка на официальные документы также была бы хороша.
Денис Николаенко
@DenisNikolaenko Ty, добавил источник :)
Шаян
1

В то время как в своем вопросе Андрей заявил, что следующее не совсем работает:

Изменяя исполняемый файл, я могу удалить запись trustInfo из манифеста (или полностью манифеста, чтобы я мог использовать внешний), что позволяет программе запускаться без UAC. К сожалению, это изменяет исполняемый файл, поэтому он завершается вскоре после проверки внутренней контрольной суммы.

Мне удалось изменить внешний файл .manifest для программного обеспечения, которое я использовал, и изменить

<ms_asmv2:requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

в

<ms_asmv2:requestedExecutionLevel level="asInvoker" uiAccess="false" />

Оказывается, что используемое мной программное обеспечение на самом деле не требовало прав администратора, поэтому я смог запустить его с учетной записью обычного пользователя без UAC или паролей администратора. Спасибо!

Aurimas
источник
Вместо этого может быть проще отредактировать исполняемый файл, поскольку манифест может быть просто включен в файл. Обратите внимание, что префикс пространства имен ms_asmv2:также может быть опущен. Кроме того, возможно, что изменение размера встроенного блока xml может повредить двоичный файл, поэтому «requireAdministrator» следует изменить на «asInvoker», дополненный пробелами той же длины с пробелами перед uiAccess.
КДБ
-2

Я исправил эту проблему, изменив разрешения для папки, в которой находилась программа.

Я добавил каждого пользователя, который будет запускать эту программу, и дал им права «полного контроля». Это позаботилось о проблеме, и я оставил флажок «Запуск от имени администратора» без проверки.

У меня нет проблем с безопасностью для пользователей, которые будут запускать программу.

Тим Д
источник
-5

Нет, если программе требуется UAC, она пытается получить доступ к чему-либо за пределами своей песочницы. Программа не будет правильно работать без повышенных прав доступа.

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

Отключить UAC в Windows Vista: запустите, введите «пользователь». Нажмите «Учетные записи пользователей». В появившемся окне нажмите «Настройки контроля учетных записей», а затем отключите UAC.

Отключить UAC в Windows 7: Пуск, введите «пользователь». Нажмите «Настройки контроля учетных записей». Перетащите панель выбора до самого конца, чтобы «Никогда не уведомлять».

Джеймс Уотт
источник
7
Отключение UAC - это не то, чего я пытаюсь добиться. Кроме того: ваше описание того, как работает UAC, верно только в общем смысле. Для программы возможно запросить UAC, когда это строго не нужно. И UAC происходит до того, как программа запускается - после запуска, если она выходит за пределы своих разрешений, она просто получит ошибки, в которых отказано в разрешении.
Эндрю Рассел
Помимо семантики, вы не можете «отключить» уведомления UAC для конкретной программы, все же ограничивая их доступ.
Джеймс Уотт
Джеймс: На самом деле - похоже, ты можешь - я обновил свой вопрос.
Эндрю Рассел
Если не считать изменения самого кода программы, мне было бы интересно узнать о работающем решении, если вы его найдете.
Джеймс Уотт