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


9

Estou tentando escrever um arquivo em lotes 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 do prompt de comando pisca brevemente e desaparece. Não consigo dizer o que há nesta janela. O serviço não está parado.

runas sem / salvadas

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

Esses comandos solicitam uma senha, mas exibem o mesmo comportamento dos comandos acima - uma janela do prompt de comando é exibida rapidamente e o serviço não é parado.

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

Isso é possível e, se sim, o que estou fazendo de errado?


adicione o comando "pause" no final para impedi-lo de fechar
Martin

Já tenho uma pausa no final do meu arquivo em lotes, mas os comandos estão iniciando outro prompt de comando - não sei como parar isso.
Stuart Leyland-Cole -

tente direcionar a saída para um arquivo e veja se ele imprime algo para ele: "runas / user: (nome do PC) (nome de usuário do administrador)" net stop \ "(nome do serviço) \" ">> log.txt"
Martin

Tenho que executar o comando com a opção / savecred, caso contrário, o prompt da senha aparecerá no arquivo de log. Se eu executar, runas /user:(PC name)\(username) /savecred "net stop \"(service name)\"" >> log.txtnada será gerado no arquivo de log.
Stuart Leyland-Cole

Confira a página de depuração em lote de Rob van der Woude: robvanderwoude.com/battech_debugging.php . Mais importante, faça o download do LOGBATCH.BAT e execute-o como tal: LOGBATCH.BAT yourbatch.bat any_parameters_your_batch_needse ele criará um arquivo de log contendo todos os comandos / ações executadas por yourbatch.batDeixe-nos saber o que você vê lá.
precisa saber é

Respostas:


12

Você pode adicionar o seguinte ao seu script e ele forçará a execução elevada. 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"
:--------------------------------------

Tudo isso é impresso Requesting administrative privileges...na tela até o tempo limite.
The Muffin Man

@O Muffin Man. Adicione seus comandos no final do arquivo em lotes e eles serão executados após a elevação.
pelms

11
Este método é excelente. não requer dependências adicionais (como psexec).
William

Entrou em um loop infinito com que script ...
JackTheKnife

0

divida seu arquivo em lotes em dois. A parte que você deseja executar como pasta admincmd no system32. A parte que você deseja executar no cmd normal cole-a na pasta regular e, a partir daqui, chame o segundo arquivo em lote que existe system32. Dessa forma, a segunda parte sempre é executada em admincmd. Eu tentei e funciona para mim.


0

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


0

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

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

http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx

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)\""

Eu tentei os 3 seguintes comandos: runas /user:$PcName\$Username /savecred "elevate.cmd sc stop \"$ServiceName\"", runas /user:$PcName\$Username /savecred "elevate.cmd net stop \"$ServiceName\"", runas /user:$PcName\$Username /savecred "elevate.cmd net stop $ServiceName"e cada um deles retorna este erro: ERRO RUNAS: Não é possível executar - net stop elevate.cmd alfrescoTomcat -2147467259: Erro não especificado
Stuart Leyland-Cole

3 arquivo de lote linha que irá executar comandos elevada: github.com/kasajian/pseudo
zumalifeguard

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 e observações.


0

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

@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"

0

Esse código permite que o cmd solicite a senha do usuário. O usuário deve digitar sua senha e, em seguida, executable.batela será executada 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.