Forzare l'esecuzione di un programma * senza * privilegi di amministratore o Controllo dell'account utente?


122

Esiste un modo per forzare un programma che normalmente richiede privilegi di amministratore (tramite UAC) per funzionare senza di loro? (ovvero: nessun prompt UAC e nessun accesso a livello di sistema .)

Aggiunto: senza modificare l'eseguibile stesso.


Nonostante la risposta di James, ho trovato alcuni modi in cui si può quasi fare:

  1. Modificando il file eseguibile posso rimuovere la trustInfovoce dal manifest (o manifest interamente, in modo da poterne utilizzare uno esterno), consentendo al programma di avviarsi senza UAC. Sfortunatamente questo modifica l'eseguibile, quindi esce poco dopo a causa di un test di checksum interno.
  2. Utilizzando Process Explorer posso avviarlo come utente limitato. Tuttavia, questo sembra limitarlo significativamente più di quanto vorrei (funziona come la modalità protetta IE e quindi può accedere in modo significativamente inferiore a quello che il mio utente non elevato standard può).

1
Si specifica di non modificare il file eseguibile, ma la modifica di .exe è uno dei modi tentati?
cutrightjm,

3
@ekaj Ho specificato che solo dopo aver scoperto che non avrebbe funzionato;)
Andrew Russell,

Potresti forse specificare il programma, anche se non lo usi più? Ciò potrebbe aiutare le persone a sapere a cosa sta tentando di accedere che richiede privilegi di amministratore
cutrightjm

@ekaj Purtroppo no. Tuttavia non è particolarmente rilevante: UAC è attivato da un programma che richiede elevazione durante la creazione del processo (il solito modo - come in questo caso - è con un manifest). Una volta avviato, un processo non può modificarne lo stato di elevazione, indipendentemente dalle risorse riservate a cui tenta di accedere.
Andrew Russell,

Se un programma non ha manifest e rifiuta di essere eseguito senza privilegi di amministratore, è molto probabilmente dovuto al rilevamento dell'installatore UAC. Ho pubblicato questa domanda e misha256 ha una buona soluzione. L'ho provato e posso confermare che funziona. superuser.com/questions/857616/… Ho fatto alcune ricerche e ho scoperto che non esiste alcun motivo per l'esistenza del Rilevatore installatori. Nota che se i privilegi di amministratore sono dovuti a una voce trustinfo in un manifest, ovviamente questo non funzionerà.
user1258361

Risposte:


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\"\""

Salvare questo testo <name_of_file>.rege aggiungerlo al registro di Windows. (Fare doppio clic su di esso dovrebbe fare il trucco.)

Successivamente, fai clic con il pulsante destro del mouse sull'app che desideri eseguire senza privilegi di amministratore e seleziona "Esegui senza elevazione dei privilegi".

In alcuni casi, una piccola quantità dello 0,1% dei programmi può chiedere due volte il prompt UAC.


1
Ero solito usare lo shim di Application Compatibility Toolkit, ma quello era molto lavoro per ogni eseguibile e lasciavo spazzatura nel registro per ogni file. Questo metodo funziona e mi piace molto meglio.
Ben Voigt,

2
Accettarlo perché sembra essere il metodo più semplice e ( finalmente! ) Sono stato in grado di verificarlo. Ha anche la proprietà molto bella di essere banalmente utilizzabile come una riga di comando una tantum (rimuovi l'esterno "e poi trasformalo \"in ").
Andrew Russell,

1
Ho lo stesso problema di @Derek, l'applicazione sembra continuare a richiedere continuamente il controllo dell'account utente, non mi fido di esso con accesso a livello di sistema ma ho bisogno della sua funzionalità ..
Gizmo

1
Puoi aggiungerlo al registro solo per l'utente attualmente connesso modificando le chiavi in: HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker e HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command
GodEater

1
@ jpmc26 Penso che /minsia un errore. La soluzione funziona esattamente allo stesso modo senza di essa. Il Vom deve essere confuso cmde startcambiare. Sembra che cmd.exenon si lamenti di interruttori sbagliati. Prova cmd /whatever, per esempio.
cdlvcdlv,

53

Salva in nonadmin.bat:

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

Ora puoi trascinare e rilasciare i programmi su questo per eseguirli senza admin.

Ciò non richiede i privilegi di amministratore come la modifica della chiave di registro. Inoltre, non ingombrerai il menu di scelta rapida.

Basato sulla risposta di Vom


Aggiornamento: ora dovrebbe funzionare anche con programmi che hanno spazi nel nome.


L'ho provato su alcuni programmi che richiedono l'accesso sui miei dischi e non è stato in grado di rilevarli o non ha funzionato in primo luogo: / ( ad esempio rufus rufus.akeo.ie )
keinabel,

7
@keinabel Probabilmente è perché avevano davvero bisogno dell'amministratore per funzionare. Questo script è per i programmi che richiedono privilegi di amministratore senza effettivamente fare qualcosa che lo richieda. L'accesso non elaborato alle unità è una tipica cosa da amministratore.
Hjulle,

2
Piuttosto pulito! È stato in grado di installare XAMPP usando questo metodo.
Krishnaraj

Questo non sembra funzionare per me per alcun eseguibile nella directory "C: \ Programmi \ ...". Ho un Windows cannot find 'C:\Program'. Make sure you typed the name correctly, and then try again. Ho provato questo comando manualmente più volte con lievi variazioni e senza fortuna. Qualche idea?
Jake Smith,

1
Ho avuto lo stesso problema con la posizione del file in una cartella con spazi. Risolto rimuovendo alcune doppie virgolette: cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% 1"
ragnar

35

Spero di non essere troppo tardi per la festa, ma stavo cercando una domanda simile e senza vedere una risposta qui ho scoperto che il RunAscomando integrato di Windows , quando eseguito come amministratore, può farlo con /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.

Questo ha funzionato nel mio caso. Ironia della sorte, l'avvio di un programma esplicitamente senza elevazione richiede un prompt dei comandi elevato . Vai a capire. :) Spero che ti aiuti.


Posso confermare che non funziona. Ho appena provato e ho ricevuto un errore: "ERRORE RUNAS: impossibile eseguire - (nome del programma qui). L'operazione richiesta richiede l'elevazione".
user1258361

9
@ user1258361 devi eseguire questo comando da un prompt elevato, proprio come ho scritto in grassetto ...
Mxx

Non sembra richiedere un prompt elevato su Windows 7 ...
SamB

4
Testato con prompt elevato, riga di comando utilizzata runas / trustlevel: 0x20000 (programma), programma eseguito comunque come amministratore. Per riferimento, 0x20000 è l'utente di base.
user1258361,

2
richiede un prompt dei comandi elevato ... ovviamente lo fa. Altrimenti sei già senza diritti di amministratore e anche a qualsiasi processo che avvierai mancheranno.
Twisty Impersonator,

16

Se si dispone di un'applicazione particolare che si desidera eseguire sempre senza UAC, è possibile indirizzarla al Registro di sistema (aggiungere il testo a un file REG e importarlo nel Registro di sistema):

Windows Registry Editor Version 5.00

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

A differenza di questa risposta , questa soluzione non richiede alcun clic alternativo o modifica all'interazione dell'utente.

Microsoft chiama questo processo aggiungendo RunAsInvoker "Compatibilità Shim" .


La risposta a una domanda diversa, ma correlata ha fornito l'ispirazione per questa risposta.
Palswim,

1
Grazie mille! Questa è stata l'unica cosa che ha funzionato per me! Avevo un'applicazione che veniva chiamata dal menu di scelta rapida di Windows ed era sempre presente come amministratore, nonostante fosse chiamata correttamente da qualsiasi altra parte. Dopo questa correzione, l'applicazione ha iniziato a essere chiamata correttamente.
utente

3

Ho risolto questo problema oggi usando il toolkit di personalizzazione dell'applicazione MS.

Ho seguito le istruzioni in un articolo sulla repubblica tecnologica .

Fondamentalmente:

1) ottieni il toolkit da MS qui .

2) Fai clic su Correggi

3) Scegli l' opzione RunAsInvoker

4) Fare clic con il tasto destro del mouse sulla correzione e selezionare Installa


La tua risposta fa esattamente l'opposto dell'effetto desiderato. La domanda originale era come forzare un'app che richiede privilegi elevati per l'esecuzione senza elevazione. La tua risposta usa ancora UAC ma disabilita solo quel prompt. Questa è una risposta sbagliata per questa domanda.
Mxx,

@mxx attualmente no. Se l'utente corrente è limitato (o hai UAC abilitato), il processo verrà avviato con privilegi limitati.
LogicDaemon

1
@LogicDaemon Se effettivamente leggi l'articolo, vedrai che spiega che se segui questi passaggi, eseguirai un'app come amministratore senza il prompt UAC . Questo è l'opposto di quanto richiesto dall'OP.
Mxx

@mxx no. Continuate a leggere technet cosa RunAsInvoker effettivamente fare. Questo è davvero ciò che ha richiesto topicstarter, anche se funziona solo per le app meno recenti.
LogicDaemon

Finché Explorer, un cmd non amministratore o qualsiasi altro processo standard è il genitore, RunAsInvoker verrà eseguito con gli stessi diritti limitati. (Explorer viene eseguito per impostazione predefinita, altrimenti non ti chiederà mai di elevare per eliminare un file.) In realtà sembra funzionare anche con nuove app. RunAsInvoker significa che eredita esattamente lo stesso token ACL.
SilverbackNet,

3

Se è un file di installazione (installazione) exeche richiede il privilegio di amministrazione, c'è un trucco per eseguirlo senza accesso elevato:

Se il nome del file contiene parole come setupo installwindows lo esegue forzatamente con accesso elevato anche se non necessita di accesso elevato:

inserisci qui la descrizione dell'immagine

Se il file .exe contiene un manifest, queste euristiche per l'elevazione non si applicano.

Questo è documentato nei documenti UAC (User Account Control):

Il rilevamento dell'installer rileva i file di installazione, il che aiuta a impedire l'esecuzione delle installazioni all'insaputa dell'utente e senza il consenso dell'utente.

Il rilevamento dell'installatore si applica solo a:

  • File eseguibili a 32 bit.

  • Applicazioni senza un attributo del livello di esecuzione richiesto.

  • Processi interattivi in ​​esecuzione come utente standard con UAC abilitato.

Prima di creare un processo a 32 bit, vengono controllati i seguenti attributi per determinare se si tratta di un programma di installazione:

  • Il nome del file include parole chiave come "installa", "imposta" o "aggiorna".

  • ...

Modalità di lettura qui: https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works


2
Ovviamente, ciò funziona solo quando il manifest dell'applicazione non specifica esplicitamente che deve essere elevato.
Daniel B,

3
@DanielB: in realtà questo trucco funziona solo quando non c'è manifest
AntoineL

1
Upvoted. Buona osservazione. Un collegamento a documenti ufficiali sarebbe anche bello.
Denis Nikolaenko,

@DenisNikolaenko Ty, fonte aggiunta :)
Shayan,

1

Mentre era nella sua domanda, Andrew ha affermato che il seguente non ha funzionato:

Modificando l'eseguibile posso rimuovere la voce trustInfo dal manifest (o manifest interamente, in modo da poterne utilizzare uno esterno), consentendo al programma di avviarsi senza UAC. Sfortunatamente questo modifica l'eseguibile, quindi esce poco dopo a causa di un test di checksum interno.

Sono stato in grado di modificare un file .manifest esterno per il software che stavo usando e cambiare

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

per

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

Risulta che il software che stavo usando non richiedeva davvero i diritti di amministratore, quindi sono stato in grado di eseguirlo su un account utente standard senza UAC o password di amministratore. Grazie!


Potrebbe essere più semplice modificare l'eseguibile, in quanto il file manifest potrebbe essere incluso nel file. Si noti che anche il prefisso dello spazio dei nomi ms_asmv2:potrebbe essere omesso. Inoltre, è possibile che la modifica delle dimensioni del blocco XML incorporato possa danneggiare il file binario, pertanto "Require Administrator" deve essere modificato in "asInvoker" con la stessa lunghezza riempita di spazi prima di uiAccess.
kdb,

-2

Ho risolto questo problema modificando le autorizzazioni sulla cartella che conteneva il programma.

Ho aggiunto ogni utente che eseguirà quel programma e gli ho dato i privilegi di "pieno controllo". Ciò ha risolto il problema e ho lasciato deselezionata l'opzione "Esegui come amministratore".

Non ho alcun problema di sicurezza per gli utenti che eseguiranno il programma.


-5

No, se un programma richiede UAC, sta tentando di accedere a qualcosa al di fuori della sua sandbox. Il programma non funzionerà correttamente senza l'accesso elevato.

Se desideri semplicemente eliminare la notifica, puoi disabilitare UAC.

Disabilita UAC su Windows Vista: Start, digita "user". Fai clic su "Account utente". Nella finestra che si apre, fai clic su "Impostazioni controllo account utente", quindi disattiva UAC.

Disabilita UAC su Windows 7: Start, digita "user". Fai clic su "Impostazioni controllo account utente". Trascina la barra di scelta fino in fondo su "Non avvisare".


7
Disabilitare UAC non è ciò che sto cercando di ottenere. Inoltre: la descrizione di come funziona UAC è corretta solo in senso generale. È possibile che un programma richieda il controllo dell'account utente quando non è strettamente necessario. E il controllo dell'account utente si verifica prima dell'avvio di un programma: una volta in esecuzione, se supera le sue autorizzazioni, otterrà semplicemente errori negati.
Andrew Russell,

Semantica a parte, non è possibile "disabilitare" le notifiche UAC per un programma specifico, pur limitandone l'accesso.
James Watt,

James: In realtà - sembra che tu possa - ho aggiornato la mia domanda.
Andrew Russell,

A corto di modificare il codice del programma stesso, sarei interessato a conoscere una soluzione funzionante se ne trovi una.
James Watt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.