Como executar o comando de arquivo em lote com permissões elevadas?

5

Estou escrevendo um arquivo em lote que distribuirei entre os usuários. Eu preciso executar alguns comandos com permissões elevadas. Minha solução inicial foi usar:

runas /noprofile /user:Administrator SOME_COMMAND  

No entanto, muitas máquinas (incluindo a minha) têm a conta de administrador oculta inativa e, portanto, não têm uma senha de administrador configurada. Eu também não posso especificar outro nome de usuário, pois máquinas diferentes terão usuários diferentes. Existe uma maneira de replicar a ação "clique direito - > Executar como administrador" por meio de um arquivo de lote? Eu não me importo com o prompt aparecendo, eu só não quero que o usuário explicitamente clique com o botão direito e execute como administrador.

    
por hazrmard 06.08.2016 / 05:42

3 respostas

5

Você pode aproveitar o PowerShell, presente em todos os sistemas Windows modernos.

Divida os comandos que precisam de elevação em um arquivo de lote separado, por exemplo, %código%. Então, quando for a hora de executá-los, use isso em seu script não elevado:

powershell -command "Start-Process elevated.bat -Verb runas"

A parte elevated.bat é o que causa o prompt de elevação. Se o arquivo de lote original já estiver sendo executado como administrador ou se os prompts do UAC estiverem desativados, o novo arquivo será elevado sem um prompt.

Observe que o diretório atual do processador em lote elevado será iniciado como -Verb runas . Se isso for um problema, você pode usar essa versão alternativa para que ela seja iniciada no mesmo diretório que o script não elevado:

powershell -command "Start-Process cmd -ArgumentList '/c %CD% && elevated.bat' -Verb runas"

Isso faz com que a nova System32 instance seja primeiro cmd no diretório fornecido pela variável cd do prompt não-gerado e execute o arquivo de lote desejado.

    
por 13.08.2016 / 01:49
1

O que eu uso é o seguinte código:

::#################################################################################################################################
:: Elevate this script                                                                                                            #
::#################################################################################################################################

(
    :: Check Admin rights and create VBS Script to elevate
    >nul fsutil dirty query %SYSTEMDRIVE% 2>&1 || (

        :: Very little red console
        mode con cols=80 lines=3 
        color cf

        :: Message
        title Please wait...
        echo.
        echo                         Requesting elevated shell...

        :: Create VBS script
        echo Set UAC = CreateObject^("Shell.Application"^)>"%TEMP%\elevate.vbs"
        echo UAC.ShellExecute "%~f0", "%TEMP%\elevate.vbs", "", "runas", 1 >>"%TEMP%\elevate.vbs"
        if exist "%TEMP%\elevate.vbs" start /b /wait >nul cscript /nologo "%TEMP%\elevate.vbs" 2>&1

        :: Delete elevation script if exist
        if exist "%TEMP%\elevate.vbs" >nul del /f "%TEMP%\elevate.vbs" 2>&1

        exit /b
    )    
)

pushd "%~dp0"

.... your code ....

popd

Coloque-o após o seu @echo off e comentários.

    
por 03.04.2018 / 17:28
0

RunAdmin permite que você execute um programa a partir da linha de comando com direitos elevados (mostrará o UAC para que o usuário possa inserir credenciais).

    
por 27.01.2017 / 20:28