Carregue o Explorer do PowerShell com poucos privilégios

Carregue o Explorer do PowerShell com poucos privilégios

Eu tenho um script de manutenção do Powershell que funciona desta maneira:

kill explorer
do things
restart explorer

Este script é executado em modo elevado, mas eu precisaria reiniciar o Explorer sem privilégios de administrador. Qualquer ideia?

Obrigado

Responder1

Até onde eu sei, não é possível iniciar diretamente um processo não elevado (ou seja, com um token padrão de baixo privilégio) a partir de um processo elevado. Este não é um limite do PowerShell, é como funciona o UAC no Windows.

Dehttp://msdn.microsoft.com/en-us/library/windows/desktop/bb756914.aspx:

Uma pergunta frequente é como iniciar um aplicativo não elevado a partir de um processo elevado ou, mais fundamentalmente, como iniciar um processo usando meu token não elevado quando estiver executando o processo elevado. Como não existe uma maneira direta de fazer isso, a situação geralmente pode ser evitada iniciando o aplicativo original como usuário padrão e elevando apenas as partes do aplicativo que exigem direitos administrativos. Dessa forma, sempre há um processo não elevado que pode ser usado para iniciar aplicativos adicionais como o usuário de desktop atualmente conectado. Às vezes, porém, um processo elevado precisa fazer com que outro aplicativo seja executado sem elevação. Isso pode ser feito usando o agendador de tarefas do Windows Vista®. O processo elevado pode registrar uma tarefa para ser executada como o usuário da área de trabalho atualmente conectado.

Esse artigo menciona duas soluções possíveis:

  1. Execute o máximo possível do seu script no modo não elevado e eleve apenas as partes que precisam dele. Em outras palavras, elimine e reinicie o Explorer no script não elevado e execute um segundo script no modo elevado para "fazer coisas":

    Stop-Process -ProcessName explorer
    Start-Process PowerShell.exe -Verb Runas -ArgumentList "-File path_to_script\script.ps1"
    Start-Process explorer.exe
    

    O Runasverbo fará com que o segundo processo do PowerShell seja iniciado em modo elevado. No entanto, isso acionará um prompt do UAC; portanto, se esse script for executado de forma totalmente automatizada, essa não será uma boa solução.

  2. Crie uma tarefa agendada para iniciar o Explorer quando as operações elevadas forem concluídas, execute a tarefa e exclua-a. Você pode usarschtasks.exepara fazer isso:

    schtasks /Create /TN "foobar" /TR explorer.exe /SC OnLogon
    schtasks /Run /TN "foobar"
    schtasks /Delete /TN "foobar" /F
    

    Apenas certifique-se de escolher um nome para a tarefa que não entre em conflito com outro.

Você também pode combinar os dois métodos acima para criar uma tarefa agendada para executar o segundo script do PowerShell em modo elevado e o restante não elevado. Isso tem a vantagem de não produzir um prompt do UAC, mas apresenta o risco de segurança de que qualquer pessoa que tenha acesso de gravação ao script possa fazer praticamente qualquer coisa no seu computador. Dependendo de como exatamente você está executando e elevando seu script atual, isso pode ser um problema discutível.

Uma terceira opção, se o seu script for executado apenas por você, é configurá-lo para iniciar o novo processo explorer.exe com suas credenciais:

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (ConvertTo-SecureString -String "password" -AsPlainText -Force))
Start-Process explorer.exe -Credential $Cred

A desvantagem aqui é ter sua senha armazenada no script em texto simples. Você também pode armazená-lo em um arquivo separado em formato criptografado, digitando o seguinte em um prompt do PowerShell:

Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File C:\pw_encrypted.txt

Em seguida, digite sua senha (ela será mostrada como asteriscos no prompt do PS) e pressione Enter. Agora você pode usá-lo em seu script assim:

$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList @("username", (Get-Content C:\pw_encrypted.txt | ConvertTo-SecureString))
Start-Process explorer.exe -Credential $Cred

Responder2

A única coisa que vem à mente é usar o agendador de tarefas para reiniciar o Explorer. O processo inicial ou qualquer outro método parece manter o status elevado.

informação relacionada