Você sabe como se você é o usuário administrativo de um sistema e pode apenas clicar com o botão direito do mouse em um script em lote e executá-lo como Administrador sem inserir a senha do administrador?
Gostaria de saber como fazer isso com um script do PowerShell. Não quero inserir minha senha; Eu só quero imitar o método com o botão direito do mouse em Executar como administrador .
Tudo o que li até agora exige que você forneça a senha do administrador.
powershell
administrator
chrips
fonte
fonte
gsudo
. Um sudo de código aberto para Windows que permite executar como administrador na linha de comando. Um pop-up do UAC será exibido.Respostas:
Se o console atual não estiver elevado e a operação que você estiver tentando executar exigir privilégios elevados, poderá iniciar o PowerShell com a Run as administratoropção:
fonte
start-process -verb runAs "<cmd>" -argumentlist "<args1> <args2>"
;)Win
+X
Como discutido aquiAqui está uma adição à sugestão de Shay Levi (basta adicionar estas linhas no início de um script):
Isso resulta no script atual sendo passado para um novo processo do PowerShell no modo Administrador (se o Usuário atual tiver acesso ao modo Administrador e o script não for iniciado como Administrador).
fonte
if (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)))
if
declaração e colocar umthrow
dentro do bloco then.if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
[Security.Principal.WindowsBuiltInRole]::Administrator)
) deve ser preferido ao argumento de cadeia"Administrator"
- eu encontrei ambientes endurecidos de segurança com renomeado builtin papéisScript do PowerShell com elevação automática
Windows 8.1 / PowerShell 4.0 ou superior
Uma linha :)
fonte
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" `"$args`"" -Verb RunAs; exit }
Benjamin Armstrong postou um excelente artigo sobre scripts do PowerShell com auto-elevação . Há um pequeno problema com seu código; uma versão modificada com base nas correções sugeridas no comentário está abaixo.
Basicamente, ele obtém a identidade associada ao processo atual, verifica se é um administrador e, se não, cria um novo processo do PowerShell com privilégios de administrador e encerra o processo antigo.
fonte
$newProcess = new-object System.Diagnostics.ProcessStartInfo “cmd.exe” $newProcess.Arguments = ‘/c ‘ + [System.Environment]::GetCommandLineArgs() $newProcess.WorkingDirectory = [environment]::CurrentDirectory
Você pode criar um arquivo em lotes (
*.bat
) que executa o script do PowerShell com privilégios administrativos ao clicar duas vezes. Dessa forma, você não precisa alterar nada no script do PowerShell . Para fazer isso, crie um arquivo em lotes com o mesmo nome e local do script do PowerShell e coloque nele o seguinte conteúdo:É isso aí!
Aqui está a explicação:
Supondo que o script do PowerShell esteja no caminho
C:\Temp\ScriptTest.ps1
, seu arquivo em lotes deve ter o caminhoC:\Temp\ScriptTest.bat
. Quando alguém executa esse arquivo em lotes, as seguintes etapas ocorrerão:O cmd executará o comando
Uma nova sessão do PowerShell será aberta e o seguinte comando será executado:
Outra nova sessão do PowerShell com privilégios administrativos será aberta na
system32
pasta e os seguintes argumentos serão passados para ela:O seguinte comando será executado com privilégios administrativos:
Uma vez que os argumentos do caminho e nome do script são aspas duplas, eles podem conter espaço ou caracteres de aspas simples (
'
).A pasta atual mudará de
system32
paraC:\Temp
e o scriptScriptTest.ps1
será executado. Depois que o parâmetro-NoExit
for passado, a janela não será fechada, mesmo que o script do PowerShell gere alguma exceção.fonte
sudo
comando e configurando o usuário no processo automatizadoNOPASSWD: ALL
nosudoers
arquivo .Aqui está um trecho auto-elevável para scripts do Powershell que preserva o diretório de trabalho :
Preservar o diretório de trabalho é importante para scripts que executam operações relativas ao caminho. Quase todas as outras respostas não preservam esse caminho, o que pode causar erros inesperados no restante do script.
Se você preferir não usar um script / snippet auto-elevável e desejar apenas uma maneira fácil de iniciar um script como administrador (por exemplo, no menu de contexto do Explorer), veja minha outra resposta aqui: https: // stackoverflow .com / a / 57033941/2441655
fonte
Usando
#Requires -RunAsAdministrator
ainda não foi declarado. Parece estar lá apenas desde o PowerShell 4.0.
http://technet.microsoft.com/en-us/library/hh847765.aspx
Para mim, isso parece ser uma boa maneira de fazer isso, mas ainda não tenho certeza da experiência de campo. Os tempos de execução do PowerShell 3.0 provavelmente ignoram isso ou, pior ainda, dão um erro.
Quando o script é executado como um não administrador, o seguinte erro é fornecido:
fonte
Parameter RunAsAdministrator requires an argument
. @akauppi Não estou convencido de que eles sempre estejam pensando.Você pode adicionar facilmente algumas entradas do registro para obter um menu de contexto "Executar como administrador" para
.ps1
arquivos:(atualizado para um script mais simples do @ Shay)
Basicamente,
HKCR:\Microsoft.PowershellScript.1\Shell\runas\command
defina o valor padrão para chamar o script usando o Powershell.fonte
(default)
parte?"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit -command "& '%1'"
O código postado por Jonathan e Shay Levy não funcionou para mim.
Encontre o código de trabalho abaixo:
fonte
Você precisa executar novamente o script com privilégios administrativos e verificar se o script foi iniciado nesse modo. Abaixo, escrevi um script que tem duas funções: DoElevatedOperations e DoStandardOperations . Você deve colocar seu código que requer direitos de administrador no primeiro e operações padrão no segundo. o variável IsRunAsAdmin é usada para identificar o modo de administrador.
Meu código é uma extração simplificada do script da Microsoft que é gerada automaticamente quando você cria um pacote de aplicativos para aplicativos da Windows Store.
fonte
Adicionando meus 2 centavos. Minha versão simples baseada em net session, que funciona o tempo todo até agora no Windows 7 / Windows 10. Por que complicar demais?
basta adicionar na parte superior do script e ele será executado como administrador.
fonte
if (!(net session 2>&1 | Out-Null)) { ...
@ycomp... } else { echo "your message" }
.cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
Set-ExecutionPolicy -ExecutionPolicy <PolicyName>
, você pode configurá-lo comobypass
Masbypass
pode ser perigoso. Configurá-lo paraAllSigned
Esse comportamento é por design. Existem várias camadas de segurança, já que a Microsoft realmente não queria que os arquivos .ps1 fossem o mais recente vírus de email. Algumas pessoas acham que isso é contrário à própria noção de automação de tarefas, que é justa. O modelo de segurança do Vista + é "des-automatizar" as coisas, fazendo com que o usuário as aceite.
No entanto, eu suspeito que, se você iniciar o PowerShell como elevado, ele poderá executar arquivos em lote sem solicitar a senha novamente até fechar o PowerShell.
fonte
Você também pode forçar o aplicativo a abrir como administrador, se você tiver uma conta de administrador, é claro.
Localize o arquivo, clique com o botão direito do mouse em> propriedades> Atalho> Avançado e marque Executar como Administrador
Clique em OK.
fonte
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
é onde reside o atalho do PowerShell. Ele também ainda vai para um local diferente para invocar o 'exe' real (%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe
).Como o PowerShell é orientado por perfil de usuário quando se trata de permissões; se seu nome de usuário / perfil tiver permissões para fazer algo, então, nesse perfil, no PowerShell você também poderá fazê-lo. Dito isto, faria sentido que você alterasse o atalho localizado no seu perfil de usuário, por exemplo,
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
,.Clique com o botão direito do mouse e clique em Propriedades. Clique no botão "Avançado" na guia "Atalho", localizado logo abaixo do campo de texto "Comentários", ao lado direito de outros dois botões, "Abrir local do arquivo" e "Alterar ícone", respectivamente.
Marque a caixa de seleção "Executar como administrador". Clique OK, então Applye OK. Mais uma vez, clique com o botão direito do mouse no ícone 'Windows PowerShell' localizado em
C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShell
e selecione "Fixar no menu Iniciar / barra de tarefas".Agora, sempre que você clicar nesse ícone, ele chamará o UAC para escalação. Depois de selecionar 'SIM', você notará o console do PowerShell aberto e será rotulado como "Administrador" na parte superior da tela.
Para dar um passo adiante ... você pode clicar com o botão direito do mouse no mesmo atalho de ícone no local do seu perfil do Windows PowerShell e atribuir um atalho de teclado que fará exatamente a mesma coisa que se você clicasse no ícone adicionado recentemente. Então, onde está escrito "Tecla de atalho", coloque uma combinação de teclas / botões do teclado como: Ctrl+ Alt+ P P(para PowerShell) . Clique Applye OK.
Agora tudo o que você precisa fazer é pressionar a combinação de botões que você atribuiu e você verá o UAC ser chamado. Depois de selecionar 'SIM', você verá um console do PowerShell aparecer e "Administrador" exibido na barra de título.
fonte
Eu encontrei uma maneira de fazer isso ...
Crie um arquivo em lotes para abrir seu script:
Em seguida, crie um atalho, na área de trabalho, digamos (clique com o botão direito do mouse em Novo -> Atalho ).
Em seguida, cole-o no local:
Ao abrir pela primeira vez, você precisará digitar sua senha uma vez. Isso o salvará no gerenciador de credenciais do Windows.
Depois disso, você poderá executar como administrador sem precisar digitar um nome de usuário ou senha de administrador.
fonte
O problema com as respostas @pgk e @Andrew Odri é quando você tem parâmetros de script, especialmente quando são obrigatórios. Você pode resolver esse problema usando a seguinte abordagem:
Aqui está como seria o código se o script tivesse o ComputerName e parâmetros obrigatórios Port :
fonte
Várias respostas aqui são próximas, mas um pouco mais de trabalho do que o necessário.
Crie um atalho para o seu script e configure-o para "Executar como Administrador":
Properties...
Target
de<script-path>
parapowershell <script-path>
Run as administrator
fonte
Outra solução mais simples é que você também pode clicar com o botão direito do mouse em "C: \ Windows \ System32 \ cmd.exe" e escolher "Executar como Administrador" e executar qualquer aplicativo como administrador sem fornecer nenhuma senha.
fonte
Estou usando a solução abaixo. Ele lida com stdout / stderr via recurso de transcrição e passa o código de saída corretamente para o processo pai. Você precisa ajustar o caminho da transcrição / nome do arquivo.
fonte
Aqui está como executar um comando do powershell elevado e coletar seu formulário de saída em um arquivo em lotes do Windows em um único comando (ou seja, não gravar um script do powershell ps1).
Acima, você vê, primeiro, inicio um PowerShell com prompt elevado e, em seguida, peço que inicie outro PowerShell (sub shell) para executar o comando.
fonte
Além da resposta de Shay Levy, siga a configuração abaixo (apenas uma vez)
PATH
pastas, por exemplo. Pasta Windows \ System32Após a instalação:
powershell Start-Process powershell -Verb runAs <ps1_file>
Agora você pode executar tudo em apenas uma linha de comando. O acima funciona no Windows 8 Basic de 64 bits.
fonte
A maneira mais confiável que eu encontrei é envolvê-lo em um arquivo .bat auto-elevável:
O .bat verifica se você já é administrador e reinicia o script como administrador, se necessário. Também impede que janelas "cmd" estranhas se abram com o quarto parâmetro de
ShellExecute()
definido como0
.fonte
EXIT
para aGOTO :EOF
e excluí o segundo. Além disso, o ANDcd %~dp0
deve sercd /d %~dp0
o primeiro comando após o@echo off
. Dessa forma, você não precisa do caminho absoluto dos.ps1
dois, apenas coloque-o na mesma pasta que o.bat
. Se você precisar ver o resultado, altere o quarto parâmetro para1
.mshta
comando?cmd
processo de chamada , para que não o "conserte", mas estou feliz por você poder modificá-lo de acordo com suas necessidades.cmd
(eu não fiz). Mas com relação às outras mudanças, acho que são correções, porque minha versão funcionaria para nós dois, enquanto a sua não funciona para mim, ou seja, a minha é mais geral (aborda o cenário de unidades diferentes). Enfim, uma abordagem muito inteligente.Eu nunca vi minha própria maneira de fazer isso antes, então tente isso. É muito mais fácil seguir e tem uma pegada muito menor:
Muito simplesmente, se a sessão atual do Powershell tiver sido chamada com privilégios de administrador, o SID conhecido do Grupo de Administradores aparecerá nos Grupos quando você capturar a identidade atual. Mesmo se a conta for membro desse grupo, o SID não será exibido, a menos que o processo tenha sido invocado com credenciais elevadas.
Quase todas essas respostas são uma variação do método imensamente popular de Ben Armstrong, da Microsoft, de como realizá-lo, sem realmente entender o que está realmente fazendo e de que outra forma imitar a mesma rotina.
fonte
Para anexar a saída do comando a um nome de arquivo de texto que inclua a data atual, você pode fazer algo assim:
fonte
Este é um esclarecimento ...
A credencial RUNAS / SAVECRED do powershell "não é segura", tentou e adiciona a identidade e a senha de administrador ao cache de credenciais e pode ser usada em outro lugar OOPS !. Se você fez isso, sugiro que verifique e remova a entrada.
Revise seu programa ou código, pois a política da Microsoft é que você não pode ter código misto de usuário e administrador no mesmo blob de código sem o UAC (o ponto de entrada) para executar o programa como administrador. Isso seria sudo (a mesma coisa) no Linux.
O UAC possui 3 tipos, não veja, um prompt ou um ponto de entrada gerado no manifesto do programa. Ele não eleva o programa, portanto, se não houver UAC e precisar de administração, ele falhará. O UAC, embora como um requisito de administrador, seja bom, evita a execução de código sem autenticação e o cenário de códigos mistos em execução no nível do usuário.
fonte
Acontece que foi muito fácil. Tudo o que você precisa fazer é executar um cmd como administrador. Em seguida, digite
explorer.exe
e pressione Enter. Isso abre o Windows Explorer . Agora clique com o botão direito do mouse no script do PowerShell que você deseja executar, escolha "executar com o PowerShell", que o iniciará no PowerShell no modo de administrador.Pode solicitar que você ative a política, digite Y e pressione enter. Agora, o script será executado no PowerShell como administrador. Caso esteja tudo vermelho, significa que sua política ainda não foi afetada. Em seguida, tente novamente e deve funcionar bem.
fonte