Змусити програму запускати * без * прав адміністратора чи 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/… Я провів декілька досліджень і виявив, що немає причини для виявлення інсталятора. Зауважте, що якщо права адміністратора пов'язані із записом довіри довідки в маніфесті, очевидно, це не вийде.
користувач1258361

Відповіді:


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.


1
Раніше я використовував пробіл інструментарію сумісності застосунків, але це було багато роботи для кожного виконуваного файлу, а також неприємні файли залишалися в реєстрі для кожного файлу. Цей метод працює, і мені це подобається набагато краще.
Ben Voigt

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це помилка. Рішення працює точно так само без нього. Vom повинні бути змішані cmdта startвимикачі. Здається, що cmd.exeне скаржиться на неправильні комутатори. Спробуйте cmd /whatever, наприклад.
cdlvcdlv

53

Зберегти в nonadmin.bat:

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

Тепер ви можете перетягувати програми до цього, щоб запускати їх без адміністратора.

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

Виходячи з відповіді Вома


Оновлення: тепер слід працювати з програмами, які також мають пробіли в імені.


Я спробував це в деяких програмах, що вимагають доступу на мої накопичувачі, і він не міг їх виявити або не працював в першу чергу: / (наприклад, rufus rufus.akeo.ie )
keinabel

7
@keinabel Це, мабуть, тому, що їм насправді потрібен адміністратор для роботи. Цей сценарій призначений для програм, які вимагають права адміністратора, фактично не роблячи щось, чого цього вимагає. Сирий доступ до накопичувачів - типова справа адміністратора.
Hjulle

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 , коли запускається як адміністратор, може це робити з /trustlevelкомутатором.

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.

Це спрацювало в моєму випадку. За іронією долі, запуск програми явно без піднесення вимагає підвищеного командного рядка . Піди розберися. :) Сподіваюся, це допоможе тобі.


Я можу підтвердити, що це не працює. Я щойно перевірив його і отримав помилку: "ПОМИЛКА RUNAS: Неможливо запустити - (назва програми тут). Запрошена операція вимагає підвищення".
користувач1258361

9
@ user1258361 вам потрібно запустити цю команду з підвищеного підказки, як я писав жирним шрифтом ...
Mxx,

Здається, не вимагає підвищеного запиту на Windows 7 ...
SamB

4
Тестовано з підвищеним підказкою, використаний командний рядок runas / trustlevel: 0x20000 (програма), програма все одно працювала як адміністратор. Для довідки, 0x20000 є базовим користувачем.
користувач1258361

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 сумісності" .



1
Дуже дякую! Це було єдине, що працювало для мене! У мене була програма, яку викликали з контекстного меню Windows, і вона завжди з'являлася адміністратором, незважаючи на те, що вона викликається правильно з будь-якого іншого місця. Після цього виправлення програму почали правильно називати.
користувач

3

Я вирішив цю проблему сьогодні за допомогою інструментарію налаштування програм MS.

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

В основному:

1) ви отримаєте інструментарій від MS тут .

2) Клацніть Виправити

3) Оберіть опцію RunAsInvoker

4) Клацніть правою кнопкою миші виправлення та виберіть Встановити


Ваша відповідь робить прямо протилежний бажаному ефекту. Оригінальне питання полягало в тому, як змусити додаток, який просить підвищити привілеї, працювати без підвищення рівня. У вашій відповіді все ще використовується UAC, але він просто вимикає це підказку. Це неправильна відповідь на це питання.
Mxx

@mxx насправді ні. Якщо поточний користувач обмежений (або у вас включений UAC), процес буде запущений з обмеженими привілеями.
LogicDaemon

1
@LogicDaemon Якщо ви насправді прочитали статтю, ви побачите, що вона пояснює, що якщо дотримуватися цих кроків, ви запускаєте додаток як адміністратор без підказки UAC . Це протилежне тому, що просила ОП.
Mxx

@mxx nope. Прочитайте на техніці, чим насправді RunAsInvoker. Це дійсно те, про що попросив запуск теми, хоча це працює лише для старих додатків.
LogicDaemon

Поки батьків, cmd без адміністратора, або будь-який інший стандартний процес є батьківським, RunAsInvoker буде працювати з такими ж обмеженими правами. (Провідник за замовчуванням працює з обмеженим доступом, інакше він ніколи не попросить вас підняти для видалення файлу.) Насправді він, здається, працює навіть із новими програмами. RunAsInvoker означає, що він успадковує такий же маркер ACL.
SilverbackNet

3

Якщо це файл налаштування (встановлення), exeякий вимагає права адміністратора, є хитрість запустити його без підвищеного доступу:

Якщо ім'я файлу містить такі слова як Windows setupабо installWindows змушує запускати його з підвищеним доступом, навіть якщо йому не потрібен підвищений доступ:

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

Якщо файл .exe має в ньому маніфест, ці евристики для піднесення не застосовуються.

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

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

Виявлення інсталятора стосується лише:

  • 32-бітні виконувані файли.

  • Програми без запитуваного атрибута рівня виконання.

  • Інтерактивні процеси, що працюють як звичайний користувач із включеним UAC.

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

  • Ім’я файлу включає ключові слова, такі як "встановити", "встановити" або "оновити".

  • ...

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


2
Звичайно, що працює лише тоді, коли в маніфесті програми не вказано прямо, він повинен працювати підвищеним.
Даніель Б

3
@DanielB: насправді ця хитрість працює лише тоді, коли ніякого маніфесту немає
AntoineL

1
Отримано. Гарне спостереження. Посилання на офіційні документи також було б непоганим.
Денис Ніколаєнко

@DenisNikolaenko Ty, додав джерело :)
Шаян

1

Під час свого запитання Ендрю заявив, що наступне не зовсім працює:

Змінивши виконуваний файл, я можу видалити запис маніфесту trustInfo (або маніфест цілком, тому я можу використовувати зовнішній), що дозволяє програмі запускатися без UAC. На жаль, це змінює виконуваний файл, тому він закінчується незабаром після внутрішнього тесту контрольної суми.

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

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

до

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

Виявляється, програмне забезпечення, яке я використовував, насправді не вимагало прав адміністратора, тому мені вдалося запустити його в обліковому записі Standard User без UAC або паролів адміністратора. Дякую!


Можливо, буде легше редагувати виконуваний файл, оскільки маніфест може бути просто включений у файл. Зауважте, що префікс простори імен ms_asmv2:також може бути опущений. Крім того, можливо, що зміна розміру вбудованого блоку xml може пошкодити двійковий код, тому "requAdministrator" слід змінити на "asInvoker", накладений на однакову довжину з пробілами перед uiAccess.
kdb

-2

Я вирішив цю проблему, змінивши дозволи на папку, яка містила програму.

Я додав кожного користувача, який буде запускати цю програму, і надав їм привілеї "повного контролю". Це вирішило проблему, і я залишив прапорець "запустити як адміністратор".

Я не маю жодних проблем щодо безпеки користувачів, які запускають програму.


-5

Ні, якщо для програми потрібен UAC, вона намагається отримати доступ до чогось поза її пісочницею. Програма не буде працювати правильно без підвищеного доступу.

Якщо ви просто хочете позбутися сповіщення, ви можете відключити UAC.

Вимкнути UAC у Windows Vista: запустіть, введіть "user". Клацніть на "Облікові записи користувачів". У спливаючому вікні натисніть "Налаштування контролю облікових записів користувачів", а потім вимкніть UAC.

Вимкнути UAC в Windows 7: запустіть, введіть "користувач". Клацніть на "Налаштування контролю облікових записів користувачів". Перетягніть панель вибору до кінця до "Ніколи не повідомляти".


7
Відключення UAC - це не те, чого я намагаюся досягти. Також: ваш опис того, як працює UAC, правильний лише в загальному сенсі. Програма може запитувати UAC тоді, коли він цього не потребує. І UAC відбувається до запуску програми - після запуску програми, якщо вона вийде за рамки дозволів, вона просто отримає помилки, відхилені у дозволі.
Ендрю Рассел

Якщо не говорити про семантику, ви не можете "відключити" сповіщення UAC для певної програми, обмежуючи їх доступ.
Джеймс Ватт

Джеймс: Насправді - схоже, що можна - я оновив своє запитання.
Ендрю Рассел

Окрім зміни самого програмного коду, мені було б цікаво дізнатися про робоче рішення, якщо ви знайдете його.
Джеймс Ватт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.