Existe algum comando que possa elevar o Prompt de Comando?

56

Em sistemas * nix, você pode obter um shell de root 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, 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.

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

    
por user2064000 16.04.2017 / 18:57

8 respostas

61

TL; DR - A única opção é gerar outro processo. (Um novo 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á em uma nova janela sendo criada.

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) habilitado, dois tokens de acesso separados são criados :

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

No momento em que um processo (por exemplo, CMD.EXE ) é criado, ele é atribuído a 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 tiver direitos de administrador, o token de usuário padrão filtrado será usado.

Uma vez que um processo foi criado, não é possível substituir seu token de acesso . 1 Neste MSDN Segurança de Aplicativos para Windows Desktop < a href="https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/86602194-c8f7-4c42-b349-fd78e1bdb5f2/ntsetinformationprocess-processaccesstoken-fails-with-statusnotsupported?forum=windowssecurity"> thread , um cartaz que se identifica como membro da equipe do Kernel do Windows:

The NT kernel was never intended to allow token switching once a process started running. This is because handles, etc. may have been opened in an old security context, inflight operations may use inconsistent security contexts, etc. As such, it typically does not make sense to switch a process' token once it has begun execution. However, this was not enforced until Vista. [emphasis mine] (Source thanks to @Ben N)

Observação: o controle de conta de usuário era 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 Prompt de Comando ou qualquer outro processo in-loco. 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 que tenha permissões mais altas sempre resultará em uma nova janela sendo criada 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 :

The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges.

    
por 16.04.2017 / 21:23
17

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

  • Iniciar cmd como administrador.
  • Isso deve começar com %SystemRoot%\system32\ - se não, cd .
  • 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 su ou sudo : você pode iniciá-lo sem parâmetros para fornecer um shell com privilégios administrativos ou pode executá-lo com /c para 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 de TCC start /elevated ... ): para um aplicativo de GUI isso é esperado, mas para um programa de linha de comando, você pode usar /k em vez de /c , para lhe dar uma chance de ver a saída; ou você pode executar por meio de um arquivo de lote ( sudo.cmd talvez?) que concatene & pause ao final da sua sequência de execução.

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

    
por 16.04.2017 / 23:27
9

Is there a command which can elevate the Command Prompt in place?

Existe uma maneira bastante inconveniente:

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

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

In other words, it should not spawn a new window or display UAC prompts.

Blasfêmia! Queime-o na fogueira! ;) Brincadeira à parte, não. Não há. 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 tivessem tão pouco quanto possível.

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

    
por 17.04.2017 / 15:23
2

Is there a similar command for Windows that does an in-place elevation without spawning a new window?

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

In other words, it should not spawn a new window or display UAC prompts.

Esqueça isso. Absolutamente esqueça isso. Isso vai contra o design do UAC. Se você conseguir, você está quebrando um processo de segurança fundamental. Espere que sua solução seja interrompida por um patch depois que a Microsoft souber e consertar qualquer processo que você possa fazer para contornar isso.

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

    
por 16.04.2017 / 20:46
2

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

Eu uso nircmd para elevar os processos da linha de comando. Seu comando seria nircmdc elevate cmd

    
por 16.04.2017 / 21:07
2

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

Nota: Um prompt do UAC irá aparecer. Escondendo isso não é possível, é assim que o UAC foi projetado.

Usage:
  rsudo.exe "[command]"

Baixar [Baixar não funciona , será atualizado em breve]

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

    
por 17.04.2017 / 20:48
0

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

Acesse o link e clique em Downloads e selecione o que você deseja.

O TCC / LE tem um START / ELEVATED, que inicia o programa com privilégios de administrador. (Apenas no Windows Vista ou posterior).

    
por 16.04.2017 / 19:11
-1

Este é estranho.

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

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

Outros podem achar útil.

    
por 28.11.2017 / 07:19