Compartir a través de


Capítulo 1: Introducción a PowerShell

Este capítulo se centra en buscar e iniciar PowerShell y resolver los puntos débiles iniciales que experimentan los nuevos usuarios con PowerShell. Siga estos pasos y recorra los ejemplos de este capítulo en el equipo del entorno de laboratorio.

¿Qué es PowerShell?

Windows PowerShell es un entorno de scripting y shell de línea de comandos fácil de usar para automatizar tareas administrativas de sistemas basados en Windows. Windows PowerShell está preinstalado en todas las versiones modernas del sistema operativo Windows.

Dónde encontrar PowerShell

La manera más fácil de encontrar PowerShell en Windows 11 es escribir PowerShell en la barra de búsqueda, como se muestra en la figura 1-1. Observe que hay cuatro accesos directos diferentes para Windows PowerShell.

Figura 1-1: Búsqueda de PowerShell.

Accesos directos de Windows PowerShell en una versión de 64 bits de Windows:

  • Windows PowerShell
  • Windows PowerShell ISE
  • Windows PowerShell (x86)
  • Windows PowerShell ISE (x86)

En una versión de 64 bits de Windows, tiene una versión de 64 bits de la consola de Windows PowerShell y el entorno de scripting integrado de Windows PowerShell (ISE) y una versión de 32 bits de cada uno, como se indica en el sufijo (x86) en los accesos directos.

Nota:

Windows 11 solo se distribuye como un sistema operativo de 64 bits. No hay ninguna versión de 32 bits de Windows 11. Sin embargo, Windows 11 incluye versiones de 32 bits de Windows PowerShell y Windows PowerShell ISE.

Solo tiene dos accesos directos si ejecuta una versión anterior de 32 bits de Windows. Esos accesos directos no tienen el sufijo (x86), pero son versiones de 32 bits.

Recomiendo usar la versión de 64 bits de Windows PowerShell si ejecuta un sistema operativo de 64 bits a menos que tenga un motivo específico para usar la versión de 32 bits.

En función de la versión de Windows 11 que esté ejecutando, Windows PowerShell podría abrirse en Terminal Windows.

Microsoft ya no actualiza PowerShell ISE. El ISE solo funciona con Windows PowerShell 5.1. Visual Studio Code (VS Code) con la extensión de PowerShell funciona con ambas versiones de PowerShell. VS Code y la extensión de PowerShell no se incluyen en Windows. Instale VS Code y la extensión en el equipo donde cree scripts de PowerShell. No es necesario instalarlos en todos los equipos en los que ejecute PowerShell.

Inicio de PowerShell

Uso tres cuentas de usuario de Active Directory diferentes en los entornos de producción que admito. He reflejado esas cuentas en el entorno de laboratorio que se usan en este libro. Inicio de sesión en mi equipo con Windows 11 como usuario de dominio sin derechos de administrador local o de dominio.

Inicie la consola de PowerShell haciendo clic en el acceso directo de Windows PowerShell, como se muestra en la figura 1-1. Observe que la barra de título de la consola indica Windows PowerShell, como se muestra en la figura 1-2.

Figura 1-2: Barra de título de la ventana de PowerShell.

Algunos comandos se ejecutan correctamente cuando se ejecuta PowerShell como usuario normal. Sin embargo, PowerShell no participa en el Control de acceso de usuario (UAC). Esto significa que no puede solicitar la elevación para las tareas que requieren la aprobación de un administrador.

Nota:

UAC es una característica de seguridad de Windows que ayuda a evitar que el código malintencionado se ejecute con privilegios elevados.

Cuando ha iniciado sesión como usuario normal, PowerShell devuelve un error al ejecutar un comando que requiere elevación. Por ejemplo, detener un servicio de Windows:

Stop-Service -Name W32Time
Stop-Service : Service 'Windows Time (W32Time)' cannot be stopped due to
the following error: Cannot open W32Time service on computer '.'.
At line:1 char:1
+ Stop-Service -Name W32Time
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : CloseError: (System.ServiceProcess.ServiceCon
   troller:ServiceController) [Stop-Service], ServiceCommandException
    + FullyQualifiedErrorId : CouldNotStopService,Microsoft.PowerShell.Comm
   ands.StopServiceCommand

La solución consiste en ejecutar PowerShell con privilegios elevados como un usuario que sea administrador local. Así es como configuré mi segunda cuenta de usuario de dominio. Siguiendo el principio de privilegios mínimos, esta cuenta no debe ser un administrador de dominio ni tener privilegios elevados en el dominio.

Para iniciar PowerShell con derechos elevados, haga clic con el botón derecho en el acceso directo de Windows PowerShell y seleccione Ejecutar como administrador, como se muestra en la figura 1-3.

Figura 1-3- Menú contextual: Ejecutar como administrador.

Windows le pide credenciales porque ha iniciado sesión en Windows como usuario normal. Escriba las credenciales del usuario de dominio que es administrador local, como se muestra en la figura 1-4.

Figura 1-4: Control de cuentas de usuario: escriba las credenciales.

Observe que la barra de título de las ventanas de consola con privilegios elevados indica Administrador: Windows PowerShell, como se muestra en la figura 1-5.

Figura 1-5: Barra de título de la ventana de PowerShell con privilegios elevados.

Ahora que está ejecutando PowerShell con privilegios elevados como administrador, UAC ya no es un problema al ejecutar un comando que requiera elevación.

Importante

Solo debe ejecutar PowerShell con privilegios elevados como administrador cuando sea absolutamente necesario.

Cuando se dirige a equipos remotos, no es necesario ejecutar PowerShell con privilegios elevados. La ejecución de PowerShell con privilegios elevados solo afecta a los comandos que se ejecutan en el equipo local.

Puede simplificar la búsqueda y el inicio de PowerShell. Ancle powerShell o Terminal Windows acceso directo a la barra de tareas. Vuelva a buscar PowerShell, excepto esta vez, haga clic con el botón derecho en él y seleccione Anclar a la barra de tareas, como se muestra en la figura 1-6.

Figura 1-6- Menú contextual: Anclar a la barra de tareas.

Importante

La versión original de este libro, publicada en 2017, recomienda anclar un acceso directo a la barra de tareas para iniciar automáticamente una instancia con privilegios elevados cada vez que inicie PowerShell. Sin embargo, debido a posibles problemas de seguridad, ya no lo recomiendo. Cualquier aplicación que inicie desde una instancia con privilegios elevados de PowerShell también omita UAC y ejecute con privilegios elevados. Por ejemplo, si inicia un explorador web desde una instancia con privilegios elevados de PowerShell, cualquier sitio web que visite que contenga código malintencionado también se ejecuta con privilegios elevados.

Cuando necesite ejecutar PowerShell con permisos elevados, haga clic con el botón derecho en el acceso directo de PowerShell anclado a la barra de tareas mientras presiona Mayús. Seleccione Ejecutar como administrador, como se muestra en la figura 1-7.

Figura 1-7- Menú contextual: Ejecutar como administrador.

Determinación de la versión de PowerShell

Hay variables automáticas en PowerShell que almacenan información de estado. Una de estas variables es $PSVersionTable, que contiene información de versión sobre la sesión de PowerShell.

$PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.22621.2428
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22621.2428
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Si ejecuta una versión de Windows PowerShell anterior a la 5.1, debe actualizar la versión de Windows. Windows PowerShell 5.1 está preinstalado en las versiones compatibles actualmente de Windows.

La versión 7 de PowerShell no es un reemplazo de Windows PowerShell 5.1; se instala en paralelo con Windows PowerShell. Windows PowerShell versión 5.1 y PowerShell versión 7 son dos productos diferentes. Para obtener más información sobre las diferencias entre Windows PowerShell versión 5.1 y PowerShell versión 7, consulte Migración de Windows PowerShell 5.1 a PowerShell 7.

Sugerencia

La versión 6 de PowerShell, anteriormente conocida como PowerShell Core, ya no se admite.

Directiva de ejecución

La directiva de ejecución de PowerShell controla las condiciones en las que puede ejecutar scripts de PowerShell. La directiva de ejecución en PowerShell es una característica de seguridad diseñada para ayudar a evitar la ejecución involuntaria de scripts malintencionados. Sin embargo, no es un límite de seguridad porque no puede impedir que los usuarios determinados ejecuten scripts deliberadamente. Un usuario determinado puede omitir la directiva de ejecución en PowerShell.

Puede establecer una directiva de ejecución para el equipo local, el usuario actual o una sesión de PowerShell. También puede establecer directivas de ejecución para usuarios y equipos con directiva de grupo.

En la tabla siguiente se muestra la directiva de ejecución predeterminada para los sistemas operativos Windows actuales.

Versión del sistema operativo Windows Directiva de ejecución predeterminada
Windows Server 2022 Remota firmada
Windows Server 2019 Remota firmada
Windows Server 2016 Remota firmada
Windows 11 Restringidos
Windows 10 Restringidos

Independientemente de la configuración de directiva de ejecución, puede ejecutar cualquier comando de PowerShell de forma interactiva. La directiva de ejecución solo afecta a los comandos que se ejecutan en un script. Use el Get-ExecutionPolicy cmdlet para determinar la configuración de directiva de ejecución actual.

Compruebe la configuración de directiva de ejecución en el equipo.

Get-ExecutionPolicy
Restricted

Enumere la configuración de la directiva de ejecución para todos los ámbitos.

Get-ExecutionPolicy -List
        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined

Todos los sistemas operativos cliente de Windows tienen la configuración de directiva de ejecución predeterminada de Restricted. No se pueden ejecutar scripts de PowerShell mediante la configuración de directiva Restricted de ejecución. Para probar la directiva de ejecución, guarde el código siguiente como un .ps1 archivo denominado Get-TimeService.ps1.

Sugerencia

Un script de PowerShell es un archivo de texto no cifrado que contiene los comandos que desea ejecutar. Los archivos de script de PowerShell usan la extensión de .ps1 archivo. Para crear un script de PowerShell, use un editor de código como Visual Studio Code (VS Code) o cualquier editor de texto como el Bloc de notas.

Al ejecutar el siguiente comando de forma interactiva, se completa sin errores.

Get-Service -Name W32Time

Sin embargo, PowerShell devuelve un error al ejecutar el mismo comando desde un script.

.\Get-TimeService.ps1
.\Get-TimeService.ps1 : File C:\tmp\Get-TimeService.ps1 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.
At line:1 char:1
+ .\Get-TimeService.ps1
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Al ejecutar un comando en PowerShell que genera un error, lea el mensaje de error antes de reintentar el comando. Observe que el mensaje de error indica por qué se produjo un error en el comando:

... Los scripts en ejecución están deshabilitados en este sistema.

Para habilitar la ejecución de scripts, cambie la directiva de ejecución con el Set-ExecutionPolicy cmdlet . LocalMachine es el ámbito predeterminado cuando no se especifica el parámetro Scope . Debe ejecutar PowerShell con privilegios elevados como administrador para cambiar la directiva de ejecución de la máquina local. A menos que esté firmando los scripts, se recomienda usar la RemoteSigned directiva de ejecución. RemoteSigned impide ejecutar scripts descargados que no estén firmados por un publicador de confianza.

Antes de cambiar la directiva de ejecución, lea el artículo de ayuda about_Execution_Policies para comprender las implicaciones de seguridad.

Cambie la configuración de directiva de ejecución del equipo a RemoteSigned.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Si ha cambiado correctamente la directiva de ejecución, PowerShell muestra la siguiente advertencia:

Execution Policy Change
The execution policy helps protect you from scripts that you do not trust.
Changing the execution policy might expose you to the security risks
described in the about_Execution_Policies help topic at
https:/go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the
execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "N"):y

Si no ejecuta PowerShell con privilegios elevados como administrador, PowerShell devuelve el siguiente mensaje de error:

Set-ExecutionPolicy : Access to the registry key 'HKEY_LOCAL_MACHINE\SOFTWAR
E\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell' is denied. To
change the execution policy for the default (LocalMachine) scope, start
Windows PowerShell with the "Run as administrator" option. To change the
execution policy for the current user, run "Set-ExecutionPolicy -Scope
CurrentUser".
At line:1 char:1
+ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy],
   UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.
   PowerShell.Commands.SetExecutionPolicyCommand

También es posible cambiar la directiva de ejecución para el usuario actual sin necesidad de ejecutar PowerShell con privilegios elevados como administrador. Este paso no es necesario si establece correctamente la directiva de ejecución para la máquina RemoteSignedlocal en .

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Con la directiva de ejecución establecida en RemoteSigned, el Get-TimeService.ps1 script se ejecuta correctamente.

.\Get-TimeService.ps1
Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time

Resumen

En este capítulo, ha aprendido dónde encontrar y cómo iniciar PowerShell. También ha aprendido a determinar la versión de PowerShell y el propósito de las directivas de ejecución.

Revisar

  1. ¿Cómo puede determinar qué versión de PowerShell está ejecutando un equipo?
  2. ¿Cuándo debe iniciar PowerShell con privilegios elevados como administrador?
  3. ¿Cuál es la directiva de ejecución predeterminada en los equipos cliente de Windows y qué impide que haga?
  4. ¿Cómo se determina la configuración actual de la directiva de ejecución de PowerShell?
  5. ¿Cómo puede cambiar la directiva de ejecución de PowerShell?

Referencias

Para más información sobre los conceptos descritos en este capítulo, lea los siguientes artículos de ayuda de PowerShell.

Pasos siguientes

En el siguiente capítulo, obtendrá información sobre la detectabilidad de los comandos de PowerShell. También aprenderá a descargar los archivos de ayuda de PowerShell para que pueda ver la ayuda en la sesión de PowerShell.