Cargue el explorador desde powershell con privilegios bajos

Cargue el explorador desde powershell con privilegios bajos

Tengo un script de mantenimiento de Powershell que funciona de esta manera:

kill explorer
do things
restart explorer

Este script se ejecuta en modo elevado, pero necesitaría reiniciar el explorador sin privilegios de administrador. ¿Alguna idea?

Gracias

Respuesta1

Hasta donde yo sé, no es posible iniciar directamente un proceso no elevado (es decir, con un token estándar de bajos privilegios) desde un proceso elevado. Este no es un límite de PowerShell, así es como funciona UAC en Windows.

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

Una pregunta frecuente es cómo iniciar una aplicación no elevada desde un proceso elevado o, más fundamentalmente, cómo iniciar un proceso usando mi token no elevado una vez que estoy ejecutando el proceso elevado. Dado que no existe una forma directa de hacer esto, la situación generalmente se puede evitar iniciando la aplicación original como usuario estándar y elevando solo aquellas partes de la aplicación que requieren derechos administrativos. De esta manera, siempre hay un proceso no elevado que se puede utilizar para iniciar aplicaciones adicionales como el usuario de escritorio que ha iniciado sesión actualmente. A veces, sin embargo, un proceso elevado necesita que otra aplicación se ejecute sin niveles elevados. Esto se puede lograr utilizando el programador de tareas de Windows Vista®. El proceso elevado puede registrar una tarea para ejecutarla como el usuario de escritorio que ha iniciado sesión actualmente.

Ese artículo menciona dos posibles soluciones:

  1. Ejecute la mayor parte posible de su secuencia de comandos en modo no elevado y eleve solo aquellas partes que lo necesiten. En otras palabras, cierre y reinicie el explorador en el script no elevado y ejecute un segundo script en modo elevado para "hacer cosas":

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

    El Runasverbo hará que el segundo proceso de PowerShell se inicie en modo elevado. Sin embargo, esto activará un mensaje de UAC, por lo que si este script se va a ejecutar de forma totalmente automática, no es una buena solución.

  2. Cree una tarea programada para iniciar el explorador cuando finalicen las operaciones elevadas, ejecute la tarea y elimínela. Puedes usarschtasks.exepara hacer esto:

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

    Sólo asegúrate de elegir un nombre para la tarea que no entre en conflicto con otra.

También puede combinar los dos métodos anteriores para crear una tarea programada para ejecutar el segundo script de PowerShell en modo elevado y el resto no elevado. Esto tiene la ventaja de no generar un aviso de UAC, pero presenta el riesgo de seguridad de que cualquiera que tenga acceso de escritura al script puede hacer prácticamente cualquier cosa en su computadora. Sin embargo, dependiendo de cómo esté ejecutando y elevando exactamente su script actual, esto podría ser un problema discutible.

Una tercera opción, si solo usted ejecuta su script, es configurarlo para iniciar el nuevo proceso explorer.exe con sus credenciales:

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

La desventaja aquí es tener su contraseña almacenada en el script en texto sin formato. También puede almacenarlo en un archivo separado en forma cifrada, escribiendo lo siguiente en un mensaje de PowerShell:

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

Luego escriba su contraseña (se mostrará como asteriscos en el mensaje de PS) y presione Enter. Ahora puedes usarlo en tu script así:

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

Respuesta2

Lo único que me viene a la mente es utilizar el programador de tareas para reiniciar el explorador. El proceso de inicio o cualquier otro método parece mantener el estado elevado.

información relacionada