Como executar o programa na linha de comando com direitos elevados

44

Existe uma maneira de executar um programa ou comando com direitos elevados quando eu já estiver em uma linha de comando não elevada?

Exatamente a mesma ação que seria executada quando eu clicar no atalho do programa e selecione Executar como administrador .

O comando runas provavelmente não é uma solução - ele pede uma senha, mas eu só quero a caixa de diálogo do UAC .

Lukas Cenovsky
fonte

Respostas:

14

Parece que este utilitário - Hidden Start - fará o que você deseja se você usar a opção / uac. Aqui está um exemplo de linha de comando:

hstart /UAC "notepad.exe"

Isso abrirá a caixa de diálogo do UAC em vez de solicitar uma senha, como as runas fazem.

insira a descrição da imagem aqui

JeffP
fonte
2
Aviso: esse pequeno utilitário é de 20 $. Para aqueles com bolso pequeno, use RunAdmin em vez disso :)
WeGoToMars
Isso não ocorre no Windows 10
será
50

Existe uma maneira de fazer isso no PowerShell:

PS> Start-Process powershell -Verb runAs
Rustam
fonte
19
Parece funcionar bem. A partir da linha de comando, você pode fazer, por exemplopowershell -Command "Start-Process 'C:\program.exe' -Verb runAs"
marsze
7
Isso deve ser marcado como IMO da resposta certa / melhor - funciona sem utilitários de terceiros.
quer
5
Com base no @marsze - Fwiw, os argumentos no caso mais simples têm seu próprio valor citado, por exemplo powershell -Command "Start-Process 'gvim' 'c:\windows\system32\drivers\etc\hosts' -Verb runAs". Obrigado!
Ruffin
Como canalizar a saída do prompt de comando elevado para o meu script atualmente em execução?
veículo com rodas
@wheeler, estou quase certo que você não pode fazer isso, mas você pode retornar um código de saída:$p = Start-Process powershell -Verb runAs -ArgumentList "-Command ``"& { ``$Host.SetShouldExit(123) }``"" -PassThru; $p.ExitCode
Rustam
6

Com base Rustam 's resposta , você pode:

  • Crie um su.batarquivo em lote em algum lugar do seu% PATH% padrão, com a seguinte linha única:@powershell start -verb runas %*
  • Adicione esta função ao seu perfil do PowerShell $ :function su {start -verb runas @args}

Agora você pode emitir su <command> [parameters]em qualquer shell!

Nicolas Melay
fonte
2

O RunAdmin é um pequeno utilitário (150 KB) que permite executar um programa na linha de comando com direitos elevados (ele mostrará o UAC). E o oposto do Hidden Start é gratuito.

WeGoToMars
fonte
2

Isso funciona para mim em todas as plataformas, incluindo o Windows 10. Minhas necessidades são simples, talvez você possa adaptar a abordagem se precisar de energia .

Eu vim com um pequeno script chamado, sudo.cmdnomeado para o comando sudo do Linux. Funciona bem o suficiente para pensar. Descrevi os requisitos, as etapas a seguir e o script está próximo ao final com um exemplo. Primeiro uma palavra de aviso.

AVISO : O comando é executado no diretório System do Windows por padrão. Você vai querer umcdlugar seguro primeiro.

requisitos :

  • Execute o comando com o Administrador privilegiado no Windows .CMD
    ou no cmd-shell.
  • requer as verificações normais de privilégios do Windows no comando
    • Em outras palavras, o comando NÃO funcionará, a menos que eu já esteja logado com uma conta privilegiada.
  • Execute o comando com permissão de administrador e continue quando chamado dentro de um script. Portanto, aguarde o comando concluir.
  • Seja simples, sempre funcionará
  • Não é necessário inserir uma senha todas as vezes, se já estiver logado.
    • Um método melhor seria se eu pudesse digitar a senha uma vez, assim como o sudocomando real no Linux.

solução :

  1. Crie um script de comando para executar todos os argumentos passados, sudo.cmd
  2. Criar um atalho do Windows para o nome do script de comando que: sudo.lnk.
  3. Coloque o sudoatalho no PATH do Windows para que ele possa ser visto.
  4. Edite as propriedades de atalho, deixe o Start in:caminho vazio.
  5. Clique no Advancedbotão [ ] - VerificarRun as Administrator
  6. Habilite atalhos no caminho do Windows, use a variável de ambiente PATHEXT, viz.
d:> echo %PATHEXT%
    .lnk;.EXE;.CMD;.BAT;.COM

Quando você digita sudo dirna linha de comando, o Windows mostra o

User Account Control

Do you want to allow this app to make changes to this device?

  [YES]  [NO]

Pop-up de controle de acesso. Se você clicar em "[ NO]" nada acontecerá. O Windows mostrará uma Access is denied.mensagem " ".

Quando você clica em "[ YES]", o comando do diretório é executado com privilégios elevados. É claro que você provavelmente deseja algo mais interessante, como parar ou consultar um serviço:

 sudo sc query SDRSVC

SDRSVC é o nome do serviço para "Serviço de Backup do Windows", mostra o seguinte em uma janela Cmd separada:

  [sudo]

   administrator
  ---------------

  sc query SDRSVC

SERVICE_NAME: SDRSVC
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

  [done]

Press any key to continue . . .

O sudo.cmdscript em si é muito básico. Como eu disse, minhas necessidades são simples. Eu só quero parar e iniciar serviços enquanto implanto código para teste.

sudo.cmd:

 @echo off
 @rem    sudo.cmd
         cd /d %temp%
 @echo.
 @echo.   administrator
 @echo.  ---------------
         cd 
 @echo.
 @rem  _________________________________________________
 @rem      -- Print usage . . .
        @if    [""]      ==["%~1"]   goto USAGE
        @if /i ["--HELP"]==["%~1"]   goto USAGE
 @rem  _________________________________________________
 @rem
 @echo.  %*
 @rem
         %*
 @rem
         set EXIT_STATUS=%ERRORLEVEL%
 @rem  -- -- -- -- --  
 @echo.
 @echo.  [done]
 @rem  ______________________________________________________
 :Exit
 @echo.
 @pause
  exit /b  %EXIT_STATUS%
 @rem  ______________________________________________________
 :USAGE
 @echo.
 @echo  ^Usage:
 @echo.    sudo ^<complete command line^>
 @echo.
 @echo.  Attempts to rune the: ^<complete command line^>
 @echo.  under Administrator priviliges.  Relies on Windows 
 @echo.  prompt for elevated privileges.
 @rem  ______________________________________________________
 @goto Exit

O pausecomando aguarda você revisar os resultados. Se você remover pausea janela de administração, fechará e não saberá se o comando funcionou ou não. O ERRORLEVELcomando from também é retornado.

vai
fonte
2

Isso funciona no Windows 10, não foi testado com outras versões do Windows.

Um exemplo para abrir o bloco de notas com direitos de administrador no cmd.exe, que inicia o PowerShell, que solicita as permissões elevadas.

C:\>start powershell -command "&{start-process -filepath notepad -verb RunAs}"

Isso fornecerá uma caixa de diálogo do UAC (se ativada) com [Sim] [Não] ou solicitará a senha do administrador.

Outro exemplo para abrir o arquivo hosts com o bloco de notas seria:

C:\>start powershell -command "&{start-process -filepath notepad 'C:\Windows\System32\drivers\etc\hosts' -verb RunAs}"

Mais informações: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6

Alex
fonte
Os argumentos para o executável devem ser um -ArgumentListparâmetro, não apenas parâmetros adicionais para iniciar o processo.
Appleshell
0

Dê uma olhada no Start ++ - ele tem essa funcionalidade, além de muitas outras coisas úteis. Para executar com o prompt do UAC, basta usar sudoo nome do seu programa na linha de comando, como mostrado aqui:

texto alternativo

Aqui estão alguns outros recursos (você também pode adicionar os seus):

texto alternativo

texto alternativo

John T
fonte
Parece também bom, mas eu já uso o FARR, que tem funcionalidade semelhante ao Start ++ e mais (é claro, exceto o sudo).
Lukas Cenovsky
2
O link diz Bem-vindo a: brandontools.com. Esta página da Web está estacionada GRÁTIS. Quer comprar brandontools.com?
Xmojmr
1
como @xmojmr diz, esse site está morto. Se você conhece um novo local (não encontrei um tão rapidamente), atualize o link na resposta.
Abel
-1

Você pode definir __COMPAT_LAYER=RunAsAdmin. Em seguida, os comandos serão executados em um nível elevado separado cmd.

Exemplo .bat:

rem Run next command elevated to Admin.
set __COMPAT_LAYER=RunAsAdmin
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Group Policy\{35378EAC-683F-11D2-A89A-00C04FBBCFA2}" /t REG_DWORD /v "NoBackgroundPolicy" /d "1"
rem Disable elevation
set __COMPAT_LAYER=
rem continue non elevated
reg add "HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Internet Explorer\Main" /t REG_SZ /v "Start Page" /d "https://www.google.com" /f

Todas as opções do Modo de compatibilidade estão listadas no MS Application Compatibility Toolkit.

Michel
fonte
Este arquivo em lotes está terrivelmente quebrado. Você não pode usar ;como um delimitador de comentários. "Os arquivos em lote não reconhecem o ponto e vírgula e geralmente causam uma mensagem de erro sobre um comando incorreto."
DavidPostill