Estou tentando escrever um arquivo em lotes para meus usuários executarem suas máquinas Vista com o UAC. O arquivo está reescrevendo o arquivo de hosts, portanto, ele precisa ser executado com permissões de administrador. Preciso enviar a eles um email com um link para o arquivo .bat. O comportamento desejado é que, quando clicam com o botão direito do mouse no arquivo e dizem Abrir, eles recebem uma daquelas caixas de diálogo do UAC que tornam a tela escura e os obriga a responder se desejam conceder ao aplicativo permissão para executar como administrador. Em vez disso, eles estão apenas vendo "Acesso negado" na janela da linha de comando.
Isso é possível de maneira diferente?
Respostas:
Este script faz o truque! Basta colá-lo na parte superior do seu arquivo bat. Se você deseja revisar a saída do seu script, adicione um comando "pause" na parte inferior do arquivo em lotes.
ATUALIZAÇÃO: Este script agora está ligeiramente editado para suportar argumentos de linha de comando e um sistema operacional de 64 bits.
Obrigado Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadmin
fonte
Aqui está uma frase que eu tenho usado:
Notas:
fonte
am_admin
if not "%1"=="am_admin" (powershell start -verb runas '%0' 'am_admin "%~1" "%~2"' & exit)
os parâmetros será uma acima de onde eles estavam'am_admin %*'
para passar tudo, não funciona bem com aspas e espaços: / Você pode usarshift
em lote para ativar o primeiro argumento, corrigindo todos os argumentos, exceto%0
.cd /D %~dp0
depoisif not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
Aqui está o meu código! Parece grande, mas são principalmente linhas de comentário (as linhas que começam com: :).
Recursos:
Verificação de pasta mapeada (avisa se o administrador não pode acessar a unidade mapeada)
Pode ser usado como uma biblioteca externa (verifique minha postagem neste tópico: https://stackoverflow.com/a/30417025/4932683 )
Basta anexá-lo ao final do seu arquivo em lotes ou salvá-lo como uma biblioteca (veja acima)
Exemplo de como usá-lo
fonte
&fc;: 2>nul
inset "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
estava definindo o nível de erro como 1. Eu removi esse bit e funcionou perfeitamente. Estou usando o Windows 10 Home.fc;:
: eof logo depois? Também não sei por que esse problema causou o problema, pois ele deveria estar sendo executado.echo/%TEMP%| findstr /C:"(" >nul
testes testam se há um(
caractere na sua%temp%
variável de ambiente e só devem executar a parte após&&
positiva. É estranho o motivo pelo qual seu(
teste está retornando positivo.Outra abordagem é
e depois
Denis
[Adicionado posteriormente - Sim, não observei a data deste tópico.]
fonte
A solução de Ben Gripka causa loops infinitos. Seu lote funciona assim (pseudo-código):
Como você pode ver, isso causa um loop infinito, se o VBS falhar ao solicitar privilégios de administrador.
No entanto, o loop infinito pode ocorrer, embora os privilégios de administrador tenham sido solicitados com êxito.
A verificação no arquivo em lotes de Ben Gripka é propensa a erros. Eu brinquei com o lote e observei que os privilégios de administrador estão disponíveis, embora a verificação falhe. Curiosamente, a verificação funcionou como esperado, se eu iniciasse o arquivo em lotes no Windows Explorer, mas não funcionou quando iniciei no IDE.
Então, sugiro usar dois arquivos em lotes separados. O primeiro gera o VBS que chama o segundo arquivo em lote:
O segundo, chamado "my_commands.bat" e localizado no mesmo diretório que o primeiro, contém seus comandos reais:
Isso não causa loops infinitos e também remove a verificação de privilégios de administrador propensa a erros.
fonte
Outra solução do PowerShell ...
Não se trata de executar um script em lote conforme o administrador, mas como elevar outro programa do lote ...
Eu tenho um arquivo em lotes "wrapper" para um exe. Eles têm o mesmo "nome de arquivo raiz", mas extensões alternativas. Eu sou capaz de iniciar o exe como administrador e definir o diretório de trabalho para o que contém o script, com a seguinte chamada de PowerShell de uma linha :
Mais informações
Há várias
Start-Process
opções adicionais que você pode aplicar! Confira: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6Note que eu uso o
@
prefixo. Isso é equivalente@echo off
a uma linha. Eu uso%~n0
aqui para obter o "nome raiz" do script em lote e concatenar o.exe
para apontar o binário adjuvante. O uso de%~dp0
fornece o caminho completo para o diretório em que o lote reside. E, é claro, o-Verb RunAs
parâmetro fornece a elevação .fonte
Sei que essa não é uma solução para OP, mas como tenho certeza de que existem muitos outros casos de uso aqui, pensei em compartilhar.
Eu tive problemas com todos os exemplos de código nestas respostas, mas então encontrei: http://www.robotronic.de/runasspcEn.html
Ele não apenas permite que você execute como administrador, mas também verifica o arquivo para garantir que não foi adulterado e armazena as informações necessárias com segurança. Admito que não é a ferramenta mais óbvia para descobrir como usar, mas para aqueles que escrevem código, deve ser bastante simples.
fonte
@echo off
etitle
pode vir antes deste código:Muitas das outras respostas são exageradas se você não precisar se preocupar com o seguinte:
cd %~dp0
mudará para o diretório que contém o arquivo em lotes)fonte
O acima funciona no meu Windows 10 versão 1903
fonte
Como tenho problemas com esse script, exibindo um novo prompt de comando, ele próprio é executado novamente, em loop infinito (usando o Win 7 Pro), sugiro que tente outra abordagem: Como posso elevar automaticamente meu arquivo em lotes, para que ele solicite Direitos de administrador do UAC, se necessário?
Cuidado, você deve adicionar isso no final do script, conforme declarado em uma edição, para voltar ao diretório de scripts após os privilégios serem elevados: cd / d% ~ dp0
fonte
Baseado no post de toster-cx e em outros posts interessantes nesta página, obtive informações sobre como configurar e resolver meu problema. Eu tive um problema semelhante no qual desejava que o utilitário Limpeza de Disco fosse executado semanalmente duas vezes na segunda e quinta-feira durante o horário de almoço (por exemplo, 14h). No entanto, isso exigia direitos elevados.
Compartilhando arquivo em lote que pode ajudar outros iniciantes como eu -
Muito obrigado por este fórum e pelo Rems POST aqui [ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need-to-pass-parameters-to-script ] [1]
Sua postagem ajudou a configurar argumentos opcionais ao agendar a tarefa.
fonte
Há também a consulta FSUTIL desta postagem, que também está vinculada no ss64.com com o seguinte código:
Enquanto o FSUTIL estiver presente, é uma alternativa confiável.
fonte
Você não pode solicitar direitos de administrador de um arquivo em lotes, mas pode escrever um script de host de scripts do Windows em% temp% e executá-lo (que por sua vez executa seu lote como administrador). Você deseja chamar o método ShellExecute no Shell. Objeto de aplicativo com "runas" como verbo
fonte
Use
mshta
para solicitar direitos de administrador:Ou, usando o PowerShell:
fonte
use o comando runas. Mas acho que você não pode enviar um arquivo .bat com facilidade.
fonte
runas
comando não pode ser usado para provocar elevação.