É possível executar automaticamente um arquivo em lotes como administrador

48

Gostaria de saber se é possível abrir automaticamente um arquivo em lotes como administrador quando você clica duas vezes no arquivo em lotes, porque os comandos precisam ser executados com direitos administrativos.

Nota: Eu já sei sobre a solução de clicar com o botão direito do mouse no arquivo e clicar em Run As Administrator, mas essa não é uma solução automática.

Formiga
fonte
Eu era capaz de fazer isso funcionar para mim: stackoverflow.com/a/13811519/27928
Rohit
2
como dois cliques esquerdos são mais automáticos do que um esquerdo e um clique direito?
jiggunjer

Respostas:

44

Sim, você pode executar um arquivo em lotes com direitos administrativos. Infelizmente, você não pode fazer isso diretamente do arquivo em lote. Você precisaria primeiro criar um atalho para esse arquivo em lotes e alterar as propriedades desse atalho para fazer isso funcionar.

Para criar um atalho, existem várias maneiras, mas a maneira mais simples e rápida é usar a opção Enviar para no menu de contexto.

Right click batch file > Send to > Desktop (create shortcut)

Claro que você pode enviar o atalho para onde quiser. Para elevar o arquivo em lotes para execução como administrador, siga as etapas abaixo:

  1. Clique com o botão direito do mouse no atalho que você acabou de criar (deve estar na área de trabalho ou onde quer que você o envie)
  2. Na guia Atalho, clique no botão Avançado ....
  3. Marque a caixa de seleção Executar como administrador e pressione OK na janela modal e na janela principal de propriedades.
  4. Execute o atalho clicando duas vezes nele e o arquivo em lotes deve ser executado como administrador.
10100111001
fonte
1
Você sempre pode forçar o arquivo em lotes a chamar o atalho e fazer com que o atalho passe um parâmetro para saber para não chamar o atalho. Você inseriria algo como if "%~1" == "" start %USERPROFILE%\Desktop\Shortcut.lnk && GOTO :EOFlogo abaixo @echo offe criaria o link de atalho para em program.bat avez de apenas program.bat.
trlkly
2
Ifedi escreve: "A resposta aceita [da Tech1337] realmente funciona. Mas descobri que no Windows 7 eu tinha que suportar a caixa de diálogo do UAC toda vez que o atalho era clicado." <- Embora outra pessoa diga que funciona sem o UAC
barlop 31/05
Para mim, o atalho não é executado no diretório atual ao clicar duas vezes, embora o .bat o faça. Mesmo com a propriedade "Iniciar em:" no atalho preenchida. Portanto, verifique se o arquivo .bat especifica os caminhos completos do arquivo.
Rob Mosher
29

Como postado em uma resposta por Ben Gripka a outra pergunta:

REM --add the following to the top of your bat file--


@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
user399109
fonte
Sim, eu encontrei isso e estou usando o currnetly. Obrigado de qualquer forma!
Antp
Essencialmente o que eu estava procurando. Esperava que houvesse uma maneira de fazer isso sem usar o VB?
Chef Pharaoh
@ChefPharaoh, isso cria um console elevado para executar o arquivo em lotes. Você pode fazer o mesmo com um script do PowerShell.
jiggunjer
Essa foi a melhor resposta para mim.
kasperhj
4

A resposta aceita realmente funciona. Mas descobri que no Windows 7, eu tinha que suportar a caixa de diálogo do UAC toda vez que o atalho era clicado. Este IMHO diminui significativamente o "automaticamente" nesta questão!

Então descobri que, na minha própria situação, o .batarquivo em questão deve ser executado pelo Agendador de Tarefas. Nesse caso, marcar a Run with highest privilegesopção na Generalguia da tarefa cuida bem do problema. O .baté executado como administrador sem aborrecimentos.

PS: Eu não sabia que não podia fazer upload de imagens nesta resposta, porque tenho uma bela captura de tela comigo agora! Ou posso?

Ifedi Okonkwo
fonte
2
Se você adicionar links às imagens, alguém as incorporará para você.
Ramhound
@Ramhound. Adicionar links para as imagens? A imagem está na minha área de trabalho, não em algum lugar online. Ou, certamente, estou perdendo alguma coisa?
Ifedi Okonkwo
Sim; Você os carrega; Você simplesmente não pode incorporar as capturas de tela em sua resposta.
Ramhound
Ou esse botão de upload não estava lá ou eu estava meio cego ontem! Tenho certeza de que foi o último. De qualquer forma, concluí o upload do arquivo muito bem, apenas para saber que eu precisava de um representante de 10 para postar imagens. Obrigado, no entanto.
Ifedi Okonkwo
Você ainda pode colocar o link na resposta.
Ramhound
4

no Windows 7

  1. Crie um atalho para esse arquivo em lotes

  2. Clique com o botão direito do mouse no arquivo de atalho

  3. Clique no botão avançar para encontrar uma caixa de seleção para executar como administrador

Verifique a imagem abaixo

Captura de tela

fedmich
fonte
1
Você está dizendo o mesmo que a resposta aceita.
Antp
Sim, eu só queria criar uma lista simples com captura de tela para todos que estão com pressa.
fedmich
3
Se alguém está com pressa eu duvido que eles vão rolar para o fundo para os answer.thanks qualquer maneira
Antp
3

Você pode usar meu script Batch_Admin para elevar automaticamente o Administrador para uso em qualquer tipo de script próprio do Lote, ou BAT ou .CMD. Essa função garante o trabalho em um ambiente padrão, com ferramentas padrão e da mesma maneira em diferentes sistemas Windows. Ele usa vários comandos padrão e internos do Windows. Não use outros scripts externos. Ele pode ser usado para chamar qualquer programa como administrador, não apenas scripts como lote. Basta criar um pequeno script, que chama o programa que requer permissão Administartor. Coloque isso em qualquer pasta PATH de pesquisa (de% PATH%).

Para usá-lo, basta inserir a seguinte linha (exatamente como) em seu script de Lote pai, que deve ser executado como Administrador. É melhor fazer isso na parte superior do script pai e é melhor que primeiro, que será chamado ainda mais através do CALL, alguns sub-scripts (veja a explicação detalhada abaixo).

net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Isso pode ser inserido em qualquer script filho, chamado pela sintaxe CALL. Para exibir uma mensagem enquanto ela ainda não possui privilégios de administrador, por exemplo. por 5 segundos antes de chamar Batch_Admin, defina a variável "ShowAdminInfo" no número de segundos

SET ShowAdminInfo=5
net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*

Então, como funciona:

• Chama UAC.ShellExecute por meio do VBScript para obter permissões de usuário

• Lote executa o script, ou BAT ou CMD

• O chamador de script pode ter um espaço de nome longo incluído na chamada entre aspas

• Devolva todos os parâmetros de chamada que o script mestre passou na linha de comando, como se não houvesse transmissão da chamada e iniciasse algo do zero, também com caracteres especiais, como pontos de exclamação (!) E porcentagem (%), e também entre parênteses ()

• Mantém um local de script mestre se a chamada ocorreu no diretório em que esse script é o mestre

• Auxiliar exibe uma mensagem se definirmos a variável "ShowAdminInfo", por exemplo. por 5 segundos, o que pode impedir a passagem imediata dos direitos do administrador, fornecendo informações adicionais e a possibilidade de uma decisão informada. Exemplos de configurações que devem ser definidas: SET ShowAdminInfo = 5 Por padrão, como essa variável não está definida, ela não é exibida.

• O script também está chamando no caminho de pesquisa do sistema% PATH% e a partir de recursos de rede, como: \ Computer \ share \ test.bat

• Evita mal-entendidos ao escrever os arquivos auxiliares necessários quando o script chama vários Batch_Admin quase ao mesmo tempo. Ele usa o número aleatório de 1 a 100

• Mas o melhor é usá-lo no script pai. A transição para os direitos de administrador sempre exige que você execute o script completamente novamente, em uma nova janela, em um novo ambiente, sem recorrer às variáveis ​​definidas anteriormente em nosso script e os valores dessas variáveis ​​não passaram depois para chamar como administrador . Apenas o script será executado novamente.

Abaixo de um script completo Batch_Admin. Informações estendidas sobre isso estão no meu site.

Copie o seguinte texto no Bloco de Notas e salve-o em disco como: Batch_Admin.bat

@echo off
if "%~1"=="" (echo *** Batch_Admin ***&echo.&echo Automatically get admin rights for another Batch. See info inside.&TIMEOUT /T 30>nul&goto:eof)

::  A D M I N I S T R A T O R   - Automatically get admin rights for script batch. Paste this on top:    net session >nul 2>nul&if errorlevel 1  Batch_Admin "%~0" %*
::                                Also keep Batch directory localisation and then set variable:   PATH_BAT
::                                if earlier variable "ShowAdminInfo" is empty (not defined) then no info, else showing info with number of seconds
::
::                                Elaboration:  Artur Zgadzaj
setlocal
setlocal DisableDelayedExpansion

SET "Localy="
if exist "%~1"      SET "Localy=YES"
if exist "%~1.BAT"  SET "Localy=YES"
if exist "%~1.CMD"  SET "Localy=YES"
if defined Localy   FOR %%I IN ("%~1") DO SET "PATH_BAT=%%~dI%%~pI"

 SET P1=%~1
 SET Parameters=%*
 SET Parameters=%Parameters:!=^^!%
setlocal EnableDelayedExpansion
 SET Parameters=!Parameters:%P1%=!
 SET Parameters=!Parameters:%%=%%%%!
setlocal DisableDelayedExpansion
 SET Parameters=%Parameters:~3%

net session >nul 2>nul&if not errorlevel 1  goto Administrator_OK

if not defined ShowAdminInfo   goto skip_message_Administrator
echo.
echo Script:  %~1
echo.
echo *****************************************************************
echo ***    R U N N I N G     A S     A D M I N I S T R A T O R    ***
echo *****************************************************************
echo.
echo Call up just as the Administrator. You can make a shortcut to the script and set:
echo.
echo          shortcut ^> Advanced ^> Running as Administrator
echo.
echo     Alternatively run once "As Administrator"
echo     or in the Schedule tasks with highest privileges
echo.
echo Cancel Ctrl-C or wait for launch  %ShowAdminInfo%  seconds ...
TIMEOUT /T %ShowAdminInfo% > nul

:skip_message_Administrator
MD %TEMP% 2> nul
SET /A $Admin$=%RANDOM% * 100 / 32768 + 1

SET "Percent="
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul
echo %Parameters% > "%TEMP%\$Admin_%$Admin$%_Test.bat"
if not exist "%TEMP%\$Admin_%$Admin$%_Test.bat"  SET Percent=^"
del "%TEMP%\$Admin_%$Admin$%_Test.bat" 2>nul

echo @SET "PATH_BAT=%PATH_BAT%"               > "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
echo @SET "BatchFullName=%BatchFullName%"    >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"
if defined Localy  (echo @CD /D "%PATH_BAT%" >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat")
echo @"%~1" %Parameters% %Percent% >> "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat"

echo SET UAC = CreateObject^("Shell.Application"^)                                   > "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
echo UAC.ShellExecute "%TEMP%\$Admin_%$Admin$%_Batch_Start.bat", "", "", "runas", 1 >> "%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
"%TEMP%\$Admin_%$Admin$%_Batch_getPrivileges.vbs"
endlocal
exit /B

:Administrator_OK
"%~1" %Parameters%
goto:eof
REM *** A D M I N I S T R A T O R  - Automatically get admin rights  (The End)  ***
Artur Zgadzaj
fonte
Eu acho que isso é semelhante ou idêntico ao anterior resposta: superuser.com/a/852877/375935
jiggunjer
1

Como alternativa, você pode criar um segundo arquivo em lotes, permitindo executar qualquer coisa como administrador, enquanto digita a senha do administrador apenas uma vez. A senha é salva em um token de autenticação e requer algum conhecimento real do computador.

runas /savecred /user:(domain)\(admin user) "(file path to exe,bat,whatever)"
Brapapple
fonte
1
@echo off        
:: BatchGotAdmin        
:-------------------------------------        
REM  --> Check for permissions  
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"  
REM --> If error flag set, we do not have admin.  
if '%errorlevel%' NEQ '0' (    echo Requesting administrative privileges...    goto UACPrompt) else ( goto gotAdmin )  
:UACPrompt  
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"  
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"  
    "%temp%\getadmin.vbs"  
    exit /B
:gotAdmin  
chkdsk

Isso também funciona SOURCE: https://social.technet.microsoft.com/Forums/windows/en-US/bc8a4561-d97e-4339-9b1c-9b90e54a7f92/request-elevation-inside-cmdbatch-file

Josue Moreno Cervantes
fonte
Você pode explicar sua solução?
Scai
1
Outra versão do superuser.com/a/852877/375935
jiggunjer
0

Você pode usar um utilitário de linha de comando elevate. (link para download - https://drive.google.com/open?id=0Bz7qe_olclTwVGZLUklFMHNxQ00 )

Usage: Elevate [-?|-wait|-k] prog [args]
-?    - Shows this help
-wait - Waits until prog terminates
-k    - Starts the the %COMSPEC% environment variable value and
                executes prog in it (CMD.EXE, 4NT.EXE, etc.)
prog  - The program to execute
args  - Optional command line arguments to prog
T.Todua
fonte
Isso não traz um panac UAC?
Antp
que traz à tona ... no entanto, é melhor do que nada (ver "acesso negado" ..)
T.Todua
Não é realmente "automático", é
Antp 17/11/2015
0

É um exemplo para executar o bastão como administrador. Funciona para mim.

É assim:

if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
  echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
:eof
start Cmd /k "netsh wlan show profile"
pause </

cls
Color 0A
@echo off
echo.
cls
set/p ProfileName=Type the name of the current Wifi signal? 
echo.
start Cmd /k "netsh wlan show profile name=%ProfileName% key=clear"
pause </
exit
pause
JoshMoreNo
fonte
Bem-vindo ao Super Usuário! Embora isso possa responder à pergunta, seria uma resposta melhor se você pudesse fornecer alguma explicação para isso.
DavidPostill
No entanto, outra variante do superuser.com/a/852877/375935
jiggunjer