Ejecute el script de PowerShell como administrador

  1. Uso del cmdlet Start-Process para ejecutar el script de PowerShell como administrador
  2. Ejecute el script de PowerShell con argumentos como administrador
  3. Ejecute PowerShell Script como administrador mientras conserva el directorio de trabajo
Ejecute el script de PowerShell como administrador

La mayoría de los scripts que escribimos y ejecutamos requerirán permisos, lo que lleva a un administrador a ejecutar los scripts desde un indicador elevado de PowerShell. En PowerShell, elevamos nuestros permisos ejecutando Windows PowerShell con privilegios de administrador e ingresando nuestras credenciales de administrador.

Sin embargo, es posible que necesitemos ejecutar nuestros scripts sin problemas para situaciones específicas sin ingresar las credenciales de administrador. Por lo tanto, podemos integrar varios comandos de autoelevación al comienzo de nuestros scripts, y le mostraremos cómo hacerlo en este artículo.

Uso del cmdlet Start-Process para ejecutar el script de PowerShell como administrador

El cmdlet Start-Process inicia uno o más procesos, archivos ejecutables o de script, o cualquier archivo que un software instalado pueda abrir en la computadora local, incluido Windows PowerShell.

Con este cmdlet y un conjunto de parámetros, podemos ejecutar Windows PowerShell como administrador.

Para este ejemplo, hemos creado un script Hello_World.ps1, que generará una cadena simple Hello World dentro de nuestra consola.

Hello_World.ps1:

Write-Output 'Hello World!'

Podemos usar el archivo de PowerShell anterior como ejemplo para comprobar y verificar si estamos ejecutando nuestros scripts con privilegios de administrador. Para comenzar, ejecute el fragmento de código a continuación.

Nota: Es posible que Windows PowerShell aún deba solicitar su confirmación debido al Control de cuentas de usuario (UAC) de su computadora local. No recomendamos deshabilitar completamente UAC por motivos de seguridad.

Start-Process powershell -verb RunAs -ArgumentList ".\Hello_World.ps1"

Al ejecutar el script anterior, generará una nueva instancia de Windows PowerShell con derechos administrativos. La única advertencia para el script ejecutado anteriormente es que si necesitamos pasar argumentos a nuestro archivo de PowerShell, no transferiremos los argumentos a la consola administrativa recién generada.

Ejecute el script de PowerShell con argumentos como administrador

Este ejemplo puede tomar nuestro script anterior de una sola línea y revisarlo dentro de múltiples declaraciones condicionales.

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        $Command = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
        Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $Command
        Exit
 }
}

# Place your script here
Write-Output 'Hello World!'

Anteriormente, ejecutamos nuestro script de PowerShell llamando a un archivo separado, pero podemos simplemente colocar nuestro script (por ejemplo, Hello_World.ps1) debajo de este fragmento para este ejemplo.

Así es como funciona el fragmento.

  • La primera instrucción if comprueba si el script ejecutado ya se está ejecutando en Windows PowerShell con privilegios administrativos.
  • La segunda declaración if comprueba si el número de compilación del sistema operativo Windows es 6000 o superior. (Windows Vista o Windows Server 2008 o posterior)
  • La variable $Command recupera y guarda el comando utilizado para ejecutar el script, incluidos los argumentos.
  • El Start-Process inicia una nueva instancia de Windows PowerShell con privilegios elevados y vuelve a ejecutar el script como nuestro script anterior.

Ejecute PowerShell Script como administrador mientras conserva el directorio de trabajo

Es posible que necesitemos conservar el directorio de trabajo del script para situaciones específicas. Entonces, aquí hay un fragmento autoelevador que mantendrá el directorio de trabajo:

if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
        Exit;
    }
}
# Place your script here
Write-Output 'Hello World!'

En este fragmento, pasamos $PSCommandPath como uno de los argumentos dentro del cmdlet Start-Process para conservar el directorio de trabajo donde se ejecutó el script.

Preservar el directorio de trabajo es vital para realizar operaciones relativas a la ruta. Desafortunadamente, los dos fragmentos anteriores que mostramos anteriormente no mantendrán su ruta, lo que puede causar errores inesperados. Por lo tanto, puede utilizar la sintaxis revisada anterior.

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn