Forçar um programa a executar * sem * privilégios de administrador ou UAC?

122

Existe alguma maneira de forçar um programa que normalmente requer privilégios de administrador (via UAC) para ser executado sem eles? (ou seja: nenhum prompt do UAC e nenhum acesso ao sistema ).

Adicionado: sem modificar o próprio executável.


Apesar da resposta de James, eu encontrei algumas maneiras que quase podem ser feitas:

  1. Ao modificar o executável, posso remover a trustInfoentrada do manifesto (ou o manifesto inteiramente, para que eu possa usar um externo), permitindo que o programa inicie sem o UAC. Infelizmente, isso modifica o executável e sai logo após devido a um teste interno de soma de verificação.
  2. Usando o Process Explorer, posso iniciá-lo como um Usuário Limitado. No entanto, isso parece limitá-lo significativamente mais do que eu gostaria (ele funciona como o Modo Protegido IE e, portanto, pode acessar significativamente menos do que o meu usuário não elevado padrão).
Andrew Russell
fonte
1
Você especifica não modificar o executável, mas modificar o .exe é uma das suas tentativas?
Cutrightjm 20/04/12
3
@ekaj I especificado apenas que depois eu descobri que ele não iria funcionar;)
Andrew Russell
Você poderia especificar o programa, mesmo que não o use mais? Isso pode ajudar as pessoas a saber o que ele está tentando acessar que exige privilégios de administrador
cutrightjm
@ekaj Infelizmente não. No entanto, isso não é especialmente relevante: o UAC é acionado por um programa que solicita elevação durante a criação do processo (a maneira usual - como neste caso - é com um manifesto). Depois que um processo é iniciado, ele não pode alterar seu status de elevação - independentemente dos recursos restritos que ele tenta acessar.
22712 Andrew Russell
Se um programa não possui manifesto e se recusa a executar sem privilégios de administrador, provavelmente é devido à detecção do instalador do UAC. Eu postei esta pergunta e misha256 tem uma boa solução. Eu testei e posso confirmar que funciona. superuser.com/questions/857616/… Pesquisei e descobri que não há razão para a detecção do instalador existir. Observe que se os privilégios de administrador forem devidos a uma entrada de informações de confiança em um manifesto, obviamente isso não funcionará.
user1258361

Respostas:

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

Salve este texto <name_of_file>.rege adicione-o ao Registro do Windows. (Clicar duas vezes nele deve funcionar).

Depois, clique com o botão direito do mouse no aplicativo que você deseja executar sem privilégios administrativos e selecione "Executar sem elevação de privilégio".

Em alguns casos - uma pequena quantidade de 0,1% dos programas pode perguntar duas vezes sobre o prompt do UAC.

Vom
fonte
1
Eu costumava usar o shim do Application Compatibility Toolkit, mas isso era muito trabalhoso para cada executável e deixava o lixo eletrônico no registro para cada arquivo também. Este método funciona e eu gosto muito melhor.
Ben Voigt
2
Aceitar isso, pois parece ser o método mais direto, e eu finalmente consegui verificá-lo. Também tem a propriedade muito boa de ser trivialmente utilizável como uma linha de comando única (remova a parte externa "e depois se transforme \"em ").
Andrew Russell
1
Eu tenho o mesmo problema que @Derek, a aplicação parece manter constantemente re-pedir UAC, eu não confio-lo com acesso amplo sistema, mas eu preciso de sua funcionalidade ..
Gizmo
1
Você pode adicionar isso ao registro apenas para o usuário conectado no momento, alterando as chaves para: HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker e HKEY_CURRENT_USER \ Software \ Classes * \ shell \ forcerunasinvoker \ command
GodEater
1
@ jpmc26 Acho que /miné um erro. A solução funciona exatamente da mesma maneira sem ela. O vômito deve ter se misturado cmde startcomutado. Parece que cmd.exenão reclama de interruptores errados. Tente cmd /whatever, por exemplo.
Cdlvcdlv
53

Salvar em nonadmin.bat:

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

Agora você pode arrastar e soltar programas para executá-los sem administrador.

Isso não requer privilégios de administrador, como a alteração da chave do Registro. Além disso, você não irá desordenar o menu de contexto.

Baseado na resposta de Vom


Atualização: agora deve funcionar com programas que também possuem espaços no nome.

Hjulle
fonte
Eu tentei em alguns programas que requerem acesso em meus discos e não poderia detectá-los ou não funcionou em primeiro lugar: / (rufus rufus.akeo.ie por exemplo)
keinabel
7
@keinabel Isso é provavelmente porque eles realmente precisavam de administrador para trabalhar. Este script é para programas que exigem privilégios de administrador sem realmente fazer algo que exija. O acesso bruto às unidades é uma coisa típica do administrador.
Hjulle
2
Muito arrumado! Conseguiu instalar o XAMPP usando este método.
Krishnaraj
Isso não parece estar funcionando para mim para nenhum executável no diretório "C: \ Arquivos de Programas \ ...". Eu recebo um Windows cannot find 'C:\Program'. Make sure you typed the name correctly, and then try again. Eu tentei esse comando manualmente várias vezes com pequenas variações e sem sorte. Alguma ideia?
Jake Smith
1
Eu tive o mesmo problema com o local do arquivo em uma pasta com espaços. Resolvido removendo algumas aspas duplas: cmd / min / C "set __COMPAT_LAYER = RUNASINVOKER && start" "% 1"
ragnar
35

Espero não estar muito atrasado para a festa, mas estava procurando uma pergunta semelhante e, sem ver uma resposta aqui, descobri que o RunAscomando interno do Windows , quando executado como administrador, pode fazer isso com o /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.

Isso funcionou no meu caso. Ironicamente, iniciar um programa explicitamente sem elevação requer um prompt de comando elevado . Vai saber. :) Espero que ajude você.

Mxx
fonte
Posso confirmar que isso não funciona. Acabei de testar e recebi um erro: "ERRO RUNAS: Não foi possível executar - (nome do programa aqui). A operação solicitada requer elevação".
user1258361
9
@ user1258361 você tem que executar este comando a partir da linha elevada, assim como eu escrevi em negrito ...
Mxx
Parece não exigir um prompt elevado no Windows 7 ...
SamB 09/09
4
Testado com prompt elevado, linha de comando usada runas / trustlevel: 0x20000 (programa), o programa foi executado como administrador de qualquer maneira. Para referência, 0x20000 é usuário básico.
precisa saber é o seguinte
2
requer um prompt de comando elevado ... é claro que sim. Caso contrário, você não tem direitos de administrador e qualquer processo iniciado também não terá.
Twisty Imitador de
16

Se você possui um aplicativo específico que deseja sempre executar sem o UAC, pode direcioná-lo ao Registro (adicione o texto a um arquivo REG e importe-o para o Registro):

Windows Registry Editor Version 5.00

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

Ao contrário desta resposta , esta solução não requer clique alternativo ou alteração na interação do usuário.

A Microsoft chama esse processo adicionando o RunAsInvoker "Calço de Compatibilidade" .

palswim
fonte
1
Muito obrigado! Esta foi a única coisa que funcionou para mim! Eu tinha um aplicativo que estava sendo chamado no menu de contexto do Windows e estava sempre aparecendo como administrador, apesar de ser chamado corretamente de qualquer outro lugar. Após essa correção, o aplicativo começou a ser chamado corretamente.
usuário
3

Resolvi esse problema hoje usando o kit de ferramentas de personalização de aplicativos da Microsoft.

Eu segui as instruções em um artigo da república tecnológica .

Basicamente:

1) você recebe o kit de ferramentas da MS aqui .

2) Clique em Corrigir

3) Escolha a opção RunAsInvoker

4) Clique com o botão direito do mouse na correção e escolha Instalar

user53639
fonte
Sua resposta faz exatamente o oposto do efeito desejado. A pergunta original era como forçar um aplicativo que solicita privilégios elevados para executar sem elevar. Sua resposta ainda usa o UAC, mas apenas desativa esse prompt. Essa é uma resposta errada para esta pergunta.
Mxx
@mxx realmente não. Se o usuário atual for limitado (ou você tiver o UAC ativado), o processo será iniciado com privilégios limitados por completo.
LogicDaemon
1
@LogicDaemon Se você realmente ler o artigo, verá que ele explica que, se você seguir essas etapas, executará um aplicativo como administrador sem aviso do UAC . É o oposto do que o OP pediu.
Mxx
@mxx nope. Leia no technet o que o RunAsInvoker realmente faz. Na verdade, é isso que o iniciador de tópicos solicitou, embora isso funcione apenas para aplicativos mais antigos.
LogicDaemon
Desde que o Explorer, um cmd não administrador ou qualquer outro processo padrão seja o pai, o RunAsInvoker será executado com os mesmos direitos limitados. (O Explorer é restrito por padrão, caso contrário, nunca pediria para você excluir um arquivo.) Na verdade, parece funcionar mesmo com novos aplicativos. RunAsInvoker significa que ele herda exatamente o mesmo token ACL.
SilverbackNet
3

Se é um exearquivo de instalação (instalação) que requer privilégios de administração, há um truque para executá-lo sem acesso elevado:

Se o nome do arquivo contiver palavras como setupou o installWindows forçá-lo à força com acesso elevado, mesmo que ele não precise de acesso elevado:

insira a descrição da imagem aqui

Se o arquivo .exe tiver um manifesto, essas heurísticas de elevação não se aplicarão.

Isso está documentado nos documentos do UAC (Controle de conta de usuário):

A detecção do instalador detecta arquivos de instalação, o que ajuda a impedir que as instalações sejam executadas sem o conhecimento e consentimento do usuário.

A detecção do instalador se aplica apenas a:

  • Arquivos executáveis ​​de 32 bits.

  • Aplicativos sem um atributo de nível de execução solicitado.

  • Processos interativos em execução como usuário padrão com o UAC ativado.

Antes de um processo de 32 bits ser criado, os seguintes atributos são verificados para determinar se é um instalador:

  • O nome do arquivo inclui palavras-chave como "instalar", "configurar" ou "atualizar".

  • ...

Modo de leitura aqui: https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works

Shayan
fonte
2
Obviamente, isso só funciona quando o manifesto do aplicativo não especifica explicitamente que deve ser elevado.
Daniel B
3
@DanielB: na verdade, esse truque só funciona quando não há manifesto
AntoineL
1
Votado. Boa observação. Um link para documentos oficiais também seria bom.
Denis Nikolaenko 22/07
@DenisNikolaenko Ty, fonte adicionada :)
Shayan
1

Enquanto em sua pergunta, Andrew afirmou que o seguinte não funcionou completamente:

Ao modificar o executável, posso remover a entrada trustInfo do manifesto (ou o manifesto inteiramente, para que eu possa usar um externo), permitindo que o programa inicie sem o UAC. Infelizmente, isso modifica o executável e sai logo após devido a um teste interno de soma de verificação.

Consegui modificar um arquivo. Manifest externo para o software que estava usando e alterar

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

para

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

Acontece que o software que eu estava usando realmente não exigia direitos de administrador, então eu pude executá-lo em uma conta de Usuário Padrão sem UAC ou senhas de administrador. Obrigado!

Aurimas
fonte
Pode ser mais fácil editar o executável, pois o manifesto pode ser incluído apenas no arquivo. Observe que o prefixo do espaço para nome ms_asmv2:também pode ser omitido. Além disso, é possível que a alteração do tamanho do bloco xml incorporado possa corromper o binário; portanto, "requireAdministrator" deve ser alterado para "asInvoker" preenchido no mesmo comprimento com espaços antes do uiAccess.
kdb
-2

Corrigi esse problema alterando as permissões na pasta que continha o programa.

Eu adicionei cada usuário que executará esse programa e dei a eles privilégios de "controle total". Isso resolveu o problema e eu deixei a opção "executar como administrador" desmarcada.

Não tenho preocupações com a segurança dos usuários que executarão o programa.

Tim D
fonte
-5

Não, se um programa requer UAC, ele está tentando acessar algo fora da sua sandbox. O programa não será executado corretamente sem o acesso elevado.

Se você quiser apenas se livrar da notificação, poderá desativar o UAC.

Desabilitar o UAC no Windows Vista: Inicie, digite "usuário". Clique em "Contas de usuário". Na janela exibida, clique em "Configurações de controle de conta de usuário" e, em seguida, desative o UAC.

Desabilitar o UAC no Windows 7: Iniciar, digite "usuário". Clique em "Configurações de controle de conta de usuário". Arraste a barra de opções até o final para "Never Notify".

James watt
fonte
7
Desabilitar o UAC não é o que estou tentando alcançar. Além disso: sua descrição de como o UAC funciona está correta apenas em um sentido geral. É possível que um programa solicite o UAC quando não for estritamente necessário. E o UAC acontece antes do início do programa - uma vez em execução, se ultrapassar suas permissões, ele simplesmente obterá erros de permissão negada.
Andrew Russell
Semântica à parte, você não pode "desativar" as notificações do UAC para um programa específico enquanto ainda limita seu acesso.
James Watt
James: Na verdade - parece que você pode - atualizei minha pergunta.
Andrew Russell
Antes de modificar o código do programa, eu estaria interessado em saber de uma solução que funcione, se você encontrar uma.
James Watt