Arquivo em lote com comandos para executar como administrador e usuário padrão

8

Estou tentando escrever um arquivo de lote que precisa executar alguns comandos usando uma conta de administrador local (iniciar / parar um serviço) e alguns comandos usando o usuário conectado (copiar arquivos do diretório do usuário) e estou encontrando problemas. Eu tentei os seguintes comandos:

runas com / savecred

runas /user:(PC name)\(admin username) /savecred "net stop \"(service name)\""
runas /user:(PC name)\(admin username) /savecred "sc stop \"(service name)\""

Ao usar /savecred , não é solicitada uma senha. Em vez disso, uma janela de prompt de comando pisca brevemente e desaparece. Eu não sou capaz de dizer o que está nesta janela. O serviço não está parado.

runas sem / savecred

runas /user:(PC name)\(admin username) "net stop \"(service name)\""
runas /user:(PC name)\(admin username) "sc stop \"(service name)\""

Esses comandos me pedem uma senha, mas exibem o mesmo comportamento dos comandos acima - uma janela de prompt de comando aparece brevemente e o serviço não é interrompido.

Idealmente, gostaria de salvar a senha para a sessão, pois precisarei executar mais comandos com os detalhes.

Isso é possível e, em caso afirmativo, o que estou fazendo de errado?

    
por Stu 23.01.2014 / 12:17

7 respostas

11

Você pode adicionar o seguinte ao seu script e forçá-lo a ser elevado. Não há necessidade de baixar nada.

:: 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
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------
    
por 21.05.2014 / 18:07
0

divida seu arquivo de lote em dois. A parte que você deseja executar como admincmd e cole no system32. A parte que você deseja executar em cmd normal e colá-lo na pasta normal, & daqui chame o segundo arquivo de lote que é lá é system32. Desta forma, a segunda parte sempre corre em admincmd. Eu tentei e & funciona para mim.

    
por 23.09.2014 / 07:24
0

Se você não se importar com softwares de terceiros, tente executar como senha runasspc. Ele salvará sua senha em um arquivo criptografado. A senha não precisa ser exposta no arquivo de lote.

    
por 23.09.2014 / 08:14
0

O comando "Runas" não "sudo" seu comando.

Para fazer isso a partir de um arquivo de lote, você precisa "elevar" os comandos que está gerando. Faça o download dos scripts do Elevate Powertoy.

link

Inicie seus comandos como:

runas /user:(PC name)\(admin username) /savecred "elevate.cmd net stop \"(service name)\""

ou

runas /user:(PC name)\(admin username) /savecred "elevate sc stop \"(service name)\""
    
por 24.01.2014 / 05:05
0

O que eu uso é o seguinte código:

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

(
    :: Check Admin rights and create VBS Script to elevate
    >nul fsutil 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 >nul cscript /nologo "%TEMP%\elevate.vbs" 2>&1
        exit /b
    )

    :: Delete elevation script if exist
    if exist "%~1" >nul del /f "%~1" 2>&1
)

pushd "%~dp0"

.... your code ....

popd

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

    
por 03.04.2018 / 17:23
0

Resposta simplificada (além de user325534) se você só precisa começar a trabalhar em algum diretório com acesso evevido:

@echo off

set MyWorkDir=D:\dev\

echo Requesting administrative privileges...

echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd", "/C start /D %MyWorkDir% cmd", "", "runas", 1 >> "%temp%\getadmin.vbs"

"%temp%\getadmin.vbs"
    
por 10.09.2018 / 12:10
0

Esse código permite que o cmd solicite a senha do usuário. O usuário deve digitar sua senha e, em seguida, o executable.bat será executado como administrador

main.bat

@echo off
color 1f
Title Main
Goto start
:Start
runas /user:%username% executable.bat
pause

executable.bat

all code that runs as administrator
    
por 18.02.2015 / 17:11