Existe um comando que pode elevar o prompt de comando?


61

Nos sistemas * nix, você pode obter um shell raiz assim:

$ su # or 'sudo -s'
#

O shell raiz é gerado no mesmo terminal.

Estou tentando encontrar algo que faça uma elevação semelhante no local no prompt de comando do Windows. Em outras palavras, ele não deve gerar uma nova janela ou exibir prompts do UAC. Até agora, consegui fazer uma tarefa agendada que ignora o UAC, mas a janela elevada do prompt de comando não é gerada no local.

Existe um comando semelhante para o Windows que realiza uma elevação no local sem gerar uma nova janela?


31
note que o su / sudo -s também inicia um novo processo de shell. É apenas que os processos elevados estão conectados ao mesmo terminal, para que pareçam elevados no local.
Lie Ryan

"não deve aparecer uma nova janela ou exibir solicitações do UAC" Você está dizendo que não deve exigir interação gráfica? Ou você não quiser ser solicitado em tudo ? Por exemplo, sudoàs vezes, solicita uma senha, mas o faz com uma interface de texto. Estou me perguntando como os servidores Nano (que eu acredito que nem oferecem uma GUI para Área de Trabalho Remota por padrão) lidam com isso.
precisa

2
@ jpmc26 A interação na interface de texto está correta.
user2064000

@ jpmc26 Gostaria de saber se o servidor Nano ainda tem UAC. Como é otimizado para contêineres, não parece muito útil. Também foi desativado nas versões Server Core, IIRC. Se você tiver ativado acidentalmente, você tem toda uma pilha de problemas :)
Luaan

2
@ user2064000 O prompt do UAC é (pelo menos por padrão para binários não Windows) iniciado na Área de Trabalho Segura, não na área de trabalho atual do usuário. Além de ser um pouco irritante, isso foi projetado para impedir que outros processos interfiram no prompt do UAC. Além disso, se a autenticação for necessária, ela deverá estar na Área de trabalho segura, e alguns administradores também poderão exigir uma sequência Ctrl-Alt-Del para provar que o Windows está usando a senha e não outro processo de representação de um prompt de senha. Portanto, digitar uma senha na janela do cmd provavelmente não voaria da perspectiva de segurança da Microsoft.
Calchas

Respostas:


65

TL; DR - A única opção é gerar outro processo. (Uma nova cmd.exe.) No caso do prompt de comando, iniciar uma nova instância com um token de acesso com permissões mais altas sempre resultará na criação de uma nova janela .


Não é possível conceder permissões adicionais a um processo já em execução .

Quando um usuário com direitos administrativos efetua login em uma máquina Windows com o Controle de Conta de Usuário (UAC) ativado, dois tokens de acesso separados são criados :

  1. Um com acesso total de administrador e
  2. Um segundo "token filtrado" com acesso padrão do usuário

No momento em que um processo (por exemplo CMD.EXE) é criado, é atribuído um desses dois tokens de acesso . Se o processo for executado "elevado" como Administrador, o token de acesso não filtrado será usado. Se o processo não receber direitos de administrador, o token de usuário padrão filtrado será usado.

Após a criação de um processo, não é possível substituir seu token de acesso . 1 Neste segmento do MSDN Application Security para Windows Desktop , um pôster que se identifica como membro da Equipe do Kernel do Windows declara:

O kernel do NT nunca teve a intenção de permitir a troca de token depois que um processo começou a ser executado. Isso ocorre porque os identificadores etc. podem ter sido abertos em um contexto de segurança antigo, as operações a bordo podem usar contextos de segurança inconsistentes etc. Como tal, normalmente não faz sentido alternar o token de um processo após o início da execução. No entanto, isso não foi imposto até o Vista . [ênfase minha] (Fonte, graças a @Ben N )

Nota: O Controle de Conta de Usuário foi introduzido com o lançamento do Windows Vista .

Esta resposta do superusuário cita duas fontes adicionais que confirmam o mesmo:

Portanto, simplesmente não é possível elevar o prompt de comando ou qualquer outro processo no local. A única opção é gerar outro processo com um novo token de acesso (que pode ser outra instância do processo original, se desejado). No caso do prompt de comando, iniciar uma nova instância com um token de acesso com permissões mais altas sempre resultará na criação de uma nova janela e, se os prompts do UAC estiverem ativados no sistema, eles também serão acionados.


1 Você pode ajustar os privilégios em um token de acesso existente com a função AdjustTokenPrivileges , mas de acordo com o MSDN :

A função AdjustTokenPrivileges não pode adicionar novos privilégios ao token de acesso. Ele só pode ativar ou desativar os privilégios existentes do token.


19

Embora eu seja um usuário entusiasta TCC-LE, existe uma solução que não precisa de nenhum novo programa: -

  • Comece cmdcomo administrador.
  • Isso deve iniciar você %SystemRoot%\system32\- se não estiver cdlá.
  • copy cmd.exe cmdadmin.exe(ou qualquer nome que você escolher, como su.exe).
  • Agora execute o Explorer e localize cmdadmin.exe.
  • Clique com o botão direito e selecione Propriedades .
  • Na guia Compatibilidade, selecione executar como administrador (ou defina-o para todos os usuários).

Agora cmdadminé seu suou sudo: você pode iniciá-lo sem parâmetros para fornecer um shell com privilégios administrativos ou executá-lo /cpara executar um único comando nesse modo. Dependendo de suas políticas, você pode ou não ser solicitado a confirmar.

Observe que isso sempre abrirá uma nova janela (assim como a solução TCC start /elevated ...): para um aplicativo GUI, isso é esperado, mas para um programa de linha de comando, você pode usar em /kvez de /c, para ter a chance de ver a saída ; ou você pode executar através de um arquivo em lotes ( sudo.cmdtalvez?) que concatena & pauseo final da sua sequência de execução.

Em ambos os casos, não é exatamente o mesmo que suou sudo, mas é o mais próximo que você vai chegar. Ao definir o layout das janelas manualmente, a nova janela pode ser criada diretamente abaixo e adjacente ao original.


Este é provavelmente o mais próximo que o OP pode chegar do comportamento sudo, com a ressalva de ainda ter que lidar com uma nova janela / processo sendo gerado. Embora provavelmente não seja a melhor ideia do ponto de vista de segurança, desabilitar todos os prompts do UAC eliminaria a necessidade de responder ao prompt do UAC quando o processo elevado fosse iniciado.
Eu digo Reinstate Monica

@ Twisty - Obrigado pelo comentário. Eu estava ciente das implicações de segurança, mas elas não são piores que a premissa original de que a conta permite Executar como administrador . Cabe a quem o implementa decidir se deseja lembretes constantes sempre que invocados.
AFH

2
Eu não estava mencionando as implicações de segurança para seu benefício, mas para outros leitores. No entanto, discordo que desabilitar os prompts do UAC não é pior do que executar como administrador. Os prompts do UAC podem impedir que um usuário conectado como administrador conceda direitos administrativos indesejados a um processo. Sem os avisos, o usuário perde essa oportunidade.
Eu digo Reinstate Monica

@ Twisty - Apenas isso. Minha resposta veio de motivos semelhantes. Obrigado novamente.
AFH

11
em vez de copiar o cmd.exe, crie um link simbólico para ele. Dessa maneira, se o Windows o atualizar e corrigir os erros de segurança, você não executará uma versão antiga #mklink cmdadmin.exe cmd.exe
Josef

11

Existe um comando que pode elevar o prompt de comando?

Existe uma maneira bastante inconveniente:

powershell -Command "Start-Process 'cmd.exe' -Verb runAs"

Havia maneiras melhores, mas a Microsoft as fechou. Claro, você sempre pode arregaçar as mangas e escrever seu próprio script equivalente sudoao código-fonte que acabei de fornecer.

Em outras palavras, ele não deve gerar uma nova janela ou exibir prompts do UAC.

Blasfêmia! Queime-o na estaca! ;) Brincadeira à parte, não. Não existe. Isso seria um bug e uma vulnerabilidade de segurança. A Microsoft fez um esforço explícito para garantir que o processo elevado e o padrão tenham o mínimo em comum possível.

Crianças inteligentes que estão pensando em dois back-ends (um padrão e um elevado) e um front-end gráfico para ambos devem ler sobre o isolamento da sessão 0 .


2

Existe um comando semelhante para o Windows que realiza uma elevação no local sem gerar uma nova janela?

Não existe um comando desse tipo. Embora eu não tenha provado isso, acredito nisso porque vi várias maneiras de usar código / software extra para solucionar esse problema.

Em outras palavras, ele não deve gerar uma nova janela ou exibir prompts do UAC.

Esqueça. Absolutamente esqueça. Isso vai contra o design do UAC. Se você pudesse gerenciar isso, está quebrando um processo de segurança fundamental. Espere que sua solução seja interrompida após o conhecimento e a correção da Microsoft, seja qual for o processo que você possa fazer para solucionar esse problema.

A solução para evitar solicitações do UAC é ter uma elevação alta para começar. O UAC não deve incomodá-lo se você estiver suficientemente autorizado. Se você começar com uma elevação mais baixa (geralmente recomendada para obter benefícios de segurança) e tentar fazer algo que exija elevação mais alta, espere a interação do UAC.


Os prompts do UAC já podem ser ignorados com uma tarefa agendada; Estou procurando algo que faça a elevação no local em vez de gerar uma nova janela do prompt de comando.
user2064000

Se você fizer isso, poderá realmente configurar a Tarefa agendada sem atender aos requisitos do UAC? Quanto à desova, estou dizendo que não espero, porque notei que todas as soluções elevadas que vi até agora envolveram o início de um novo processo. Acho que a elevação tecnológica sem iniciar um novo processo pode ser feita, pois os programas de instalação podem solicitar o UAC após o início, mas não me lembro de ter visto soluções prontamente disponíveis, facilmente importáveis ​​para um arquivo em lotes.
TOOGAM

De fato; Tarefas agendadas derrotam completamente o UAC. Uma vez elevado, você pode elevar para o SYSTEM por meio de serviços e usar o token de substituição no processo original do cmd.exe.
Joshua

Há um script PowerToy um tanto oficial que faz o trabalho básico; você pode digitar elevate cmdpara abrir uma nova janela de prompt de comando com um prompt do UAC (o site também possui comandos de menu de contexto!). Ou, é claro, basta pressionar Ctrl + Shift + Clique no ícone da barra de tarefas de qualquer janela de prompt de comando para fazer o mesmo - é o que costumo fazer com mais frequência. (O que eu sei não é o que o OP pediu, mas o que o OP pediu está bloqueada por design.)
Miral

2

O que você deseja é impossível no Windows, porque não suporta esse conceito. Você precisa iniciar um novo processo com permissões mais altas .

Eu uso o nircmd para elevar processos da linha de comando. Seu comando serianircmdc elevate cmd


2

Eu vi essa pergunta e surgiu com uma solução simples. Este é um pequeno utilitário chamado rsudo, que executa comandos escalados a partir de uma janela CMD comum.

Nota: Um prompt do UAC será exibido. Ocultar isso não é possível, é assim que o UAC foi projetado.

Usage:
  rsudo.exe "[command]"

Download [O download não está funcionando, será atualizado em breve]

Nota: Os comandos são executados em uma nova janela. Se você deseja visualizar a saída, executersudo.exe "pause && [command]"


Não deve ser rsudo.exe "[command] && pause"?

@fleet Não, um erro faz com que pausepara ser executado primeiro e depois
rahuldottech

Rahul, obrigado! Alguma chance de código fonte? ;) (Ou talvez eu estava apenas olhando no lugar errado no seu site).
CXW

@cwz sure! Vou editar isso quando eu chegar em casa e adicionar uma postagem no blog: D
rahuldottech

0

Esse aqui é estranho.

Você pode tentar fazer um ssh em seu próprio computador, que usaria o mesmo terminal existente, mas seria realmente um terminal completamente diferente.

Vai funcionar, mas provavelmente não é o que você deseja.

Outros podem achar útil.


-1

Tente o prompt de comando TCC / LE do JPSOFT Take Command . Ele vem nas versões de 32 e 64 bits e é gratuito, a menos que você queira mais funcionalidades.

Vá para https://jpsoft.com/, clique em Downloads e selecione o que deseja.

O TCC / LE possui um START / ELEVATED, que inicia o programa elevado com privilégios totais de administrador. (Somente Windows Vista ou posterior.)


11
Como isso está relacionado à questão?
usar o seguinte comando

@DavidGrainger, verifica-se que a opção / Elevated ainda não me permite ignorar o UAC e fazer a elevação no local (consulte a pergunta para obter detalhes). Estou esquecendo de algo?
user2064000

Este é um substituto para o prompt de comando do Windows. Além disso, iniciá-lo elevado não é diferente de iniciar o prompt de comando interno elevado.
Eu digo Restabelecer Monica

A única maneira de alterar as configurações do UAC para "Nunca notificar" Quando a notificação do UAC for exibida, clique no link "Mostrar mais detalhes" e selecione o link "Mostrar quando esta notificação deve aparecer". Selecione a configuração que funciona. Você pode alterá-lo novamente quando terminar, para que ações indesejadas sejam capturadas por ele. isso pode ser realizado nas configurações do Windows.
David Grainger

O TCC / LE também faz muitas outras coisas. Eu tentei com o UAC definido como nunca e, em seguida, usei "Iniciar / Elevado / PGM" C: \ Arquivos de Programas \ IrfanView \ i_view64.exe "/ thumbs" para abrir um programa Elevado.
David Grainger
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.