Capítulo 1: Introducción a PowerShell

A menudo, veo que los presentadores de conferencias y reuniones de grupos de usuarios ya tienen PowerShell en ejecución cuando empiezan sus presentaciones de nivel básico. Este libro empieza por responder a las preguntas que los asistentes que no han usado PowerShell anteriormente preguntan en ese tipo de sesiones.

En concreto, este capítulo se centra en la búsqueda y el inicio de PowerShell, así como en resolver algunos de los problemas iniciales que experimentan los nuevos usuarios de PowerShell. No olvide seguir los ejemplos que se muestran en este capítulo en el equipo del entorno de laboratorio de Windows 10.

¿Qué es necesario para comenzar a usar PowerShell?

Todas las versiones modernas de los sistemas operativos Windows se incluyen con PowerShell instalado. Si está ejecutando una versión anterior a la 5.1, debe instalar la versión más reciente.

¿Dónde puedo encontrar PowerShell?

La forma más fácil de encontrar PowerShell en Windows 10 es escribir PowerShell en la barra de búsqueda, tal como se muestra en la ilustración 1-1.

Ilustración 1-1: Búsqueda de PowerShell en el menú Inicio

Observe que en la ilustración 1-1 se muestran cuatro accesos directos diferentes para PowerShell. El equipo que se usa con fines de demostración en este libro ejecuta la versión de 64 bits de Windows 10, por lo que hay una versión de 64 bits de la consola de PowerShell y PowerShell ISE (entorno de scripting integrado) y una versión de 32 bits de cada una, tal y como se indica mediante el sufijo (x86) en los accesos directos. Si está ejecutando una versión de 32 bits de Windows 10, solo tendrá dos accesos directos. Esos elementos no tienen el sufijo (x86), pero son versiones de 32 bits. Si tiene un sistema operativo de 64 bits, mi recomendación es ejecutar la versión de 64 bits de PowerShell a menos que tenga un motivo concreto para ejecutar la versión de 32 bits.

Para obtener información sobre cómo iniciar PowerShell en otras versiones de Windows, consulte Iniciar Windows PowerShell.

¿Cómo puedo iniciar PowerShell?

En los entornos empresariales de producción a los que doy soporte, utilizo tres cuentas de usuario de Active Directory diferentes. He reflejado esas cuentas en el entorno de laboratorio que se usa en este libro. Inicio sesión en el equipo con Windows 10 como un usuario de dominio que no es un administrador local o de dominio.

Para iniciar la consola de PowerShell, he hecho clic en el acceso directo "Windows PowerShell", tal como se muestra en la ilustración 1-1.

Ilustración 1-4: Barra de título de la ventana de PowerShell

Observe que la barra de título de la consola de PowerShell indica "Windows PowerShell", tal como se muestra en la ilustración 1-4. Algunos comandos se ejecutan correctamente, pero PowerShell no puede participar en el Control de cuentas de usuario (UAC). Esto significa que no puede solicitar la elevación para las tareas que requieren la aprobación de un administrador. Se genera un mensaje de error que indica lo siguiente:

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

La solución a este problema es ejecutar PowerShell como un usuario de dominio que sea un administrador local. De esta forma se configura mi segunda cuenta de usuario de dominio. Con el principio de privilegios mínimos, esta cuenta NO debe ser administrador de dominio ni tener privilegios elevados en el dominio.

Cierre PowerShell. Vuelva a iniciar la consola de PowerShell, pero esta vez haga clic con el botón derecho en el acceso directo Windows PowerShell y seleccione Ejecutar como administrador, tal como se muestra en la ilustración 1-5.

Ilustración 1-5: Menú contextual Ejecutar como administrador

Si ha iniciado sesión en Windows como un usuario normal, se le pedirán las credenciales. Escribiré las credenciales de la cuenta de usuario que es un usuario de dominio y un administrador local, tal como se muestra en la ilustración 1-6.

Ilustración 1-6

Una vez que PowerShell se reinicia como administrador, la barra de título debe decir "Administración istrator: Windows PowerShell", como se muestra en la figura 1-7.

Ilustración 1-7

Ahora que PowerShell se está ejecutando con privilegios elevados como administrador local, UAC dejará de ser un problema cuando se ejecute un comando en el equipo local que normalmente requeriría una solicitud de elevación de privilegios. Tenga en cuenta que cualquier comando que se ejecute desde esta instancia con privilegios elevados de la consola de PowerShell también se ejecutará con privilegios elevados.

Para simplificar la búsqueda de PowerShell y su inicio como administrador, recomiendo anclarlo a la barra de tareas y configurarlo para que se inicie automáticamente como administrador cada vez que se ejecute.

Vuelva a buscar PowerShell, pero esta vez haga clic con el botón derecho en él y seleccione "Anclar a la barra de tareas", tal como se muestra en la ilustración 1-8.

Ilustración 1-8

Haga clic con el botón derecho en el acceso directo de PowerShell que ahora está anclado a la barra de tareas y seleccione las propiedades como se muestra en la ilustración 1-9.

Ilustración 1-9: Control de cuentas de usuario, escritura de credenciales

Haga clic en "Avanzado", tal como se indica en el n.º 1 de la ilustración 1-10, marque la casilla "Ejecutar como administrador" como se indica el n.º 2 de la ilustración 1-10 y, finalmente, haga clic en Aceptar dos veces para aceptar los cambios y salir de ambos cuadros de diálogo.

Ilustración 1-10: Barra de título que muestra

Nunca más tendrá que volver a preocuparse de buscar PowerShell o de si se está ejecutando como administrador.

Ejecutar PowerShell con privilegios elevados como administrador para evitar problemas con UAC solo afecta a los comandos que se ejecutan en el equipo local. No tiene ningún efecto en los comandos que tienen como destino equipos remotos.

¿Qué versión de PowerShell estoy usando?

Hay varias variables automáticas en PowerShell que almacenan información de estado. Una de estas variables es $PSVersionTable, que contiene una tabla hash que se puede usar para mostrar la información de versión de PowerShell pertinente:

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

Las versiones más recientes de Windows PowerShell se distribuyen como parte de Windows Management Framework (WMF). Se requiere una versión concreta de .NET Framework en función de la versión de WMF. Para actualizar a Windows PowerShell 5.1, consulte Actualización de Windows PowerShell existente.

Directiva de ejecución

Contrariamente a lo que la mayoría de usuarios cree, la directiva de ejecución en PowerShell no es un límite de seguridad. Se ha diseñado para evitar que un usuario ejecute un script sin saberlo. Un usuario resuelto puede omitir fácilmente la directiva de ejecución en PowerShell. En la tabla 1-2 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
Server 2019 Remota firmada
Server 2016 Remota firmada
Windows 10 Restringidos

Independientemente de la configuración de la directiva de ejecución, cualquier comando de PowerShell puede ejecutarse de forma interactiva. La directiva de ejecución solo afecta a los comandos que se ejecutan en un script. El cmdlet Get-ExecutionPolicy se usa para determinar cuál es la configuración de la directiva de ejecución actual y el cmdlet Set-ExecutionPolicy se usa para cambiar la directiva de ejecución. Mi recomendación es usar la directiva RemoteSigned, que requiere que los scripts descargados estén firmados por un editor de confianza para poder ejecutarse.

Consulte la directiva de ejecución actual:

Get-ExecutionPolicy
Restricted

Los scripts de PowerShell no se pueden ejecutar en absoluto cuando la directiva de ejecución está establecida en Restricted. Esta es la configuración predeterminada en todos los sistemas operativos de cliente de Windows. Para mostrar el problema, guarde el código siguiente como un .ps1archivo con nombreStop-TimeService.ps1.

Sugerencia

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

Get-Service -Name W32Time | Stop-Service -PassThru

Ese comando se ejecuta de forma interactiva sin errores, siempre que PowerShell se ejecute con privilegios elevados como administrador. Pero en cuanto se guarda como un archivo de script e intenta ejecutar el script, se genera un error:

.\Stop-TimeService.ps1
.\Stop-TimeService.ps1 : File C:\demo\Stop-TimeService.ps1 cannot be loaded because
running scripts is disabled on this system. For more information, see
about_Execution_Policies at http://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ .\Stop-TimeService.ps1
+
    + CategoryInfo          : SecurityError: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

Observe que el error que se muestra en el conjunto de resultados anterior indica exactamente cuál es el problema (la ejecución de scripts está deshabilitada en este sistema). Al ejecutar un comando en PowerShell que genera un mensaje de error, asegúrese de leer el mensaje de error en lugar de simplemente volver a ejecutar el comando y esperar que se ejecute correctamente.

Cambie la directiva de ejecución de PowerShell a remota firmada.

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
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 http://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

Asegúrese de leer la advertencia que se muestra al cambiar la directiva de ejecución. También recomiendo echar un vistazo al tema de ayuda about_Execution_Policies para asegurarse de que comprende las implicaciones de seguridad de cambiar la directiva de ejecución.

Ahora que la directiva de ejecución se ha establecido en RemoteSigned, el script Stop-TimeService.ps1 se ejecuta sin errores.

.\Stop-TimeService.ps1
Status   Name               DisplayName
------   ----               -----------
Stopped  W32Time            Windows Time

Asegúrese de iniciar el servicio Hora de Windows antes de continuar; de lo contrario, puede que se produzcan problemas imprevistos.

Start-Service -Name w32time

Resumen

En este capítulo, ha aprendido a buscar e iniciar PowerShell, así como a crear un acceso directo que inicia PowerShell como administrador. También ha obtenido información acerca de la directiva de ejecución predeterminada y cómo cambiarla.

Revisar

  1. ¿Cómo puede determinar qué versión de PowerShell está ejecutando un equipo?
  2. ¿Por qué es importante iniciar PowerShell con privilegios elevados como administrador?
  3. ¿Cómo puede determinar la directiva de ejecución actual de PowerShell?
  4. ¿Qué impide que ocurra la directiva de ejecución predeterminada de PowerShell en los equipos cliente de Windows?
  5. ¿Cómo puede cambiar la directiva de ejecución de PowerShell?

Para aquellos que deseen obtener más información acerca de los temas que se abordan en este capítulo, recomiendo leer los siguientes temas de ayuda de PowerShell.

En el siguiente capítulo, obtendrá información sobre la detectabilidad de los comandos de PowerShell. Uno de los aspectos que se abordarán es cómo actualizar PowerShell para que los temas de ayuda se puedan ver directamente desde PowerShell en lugar de tener que verlos en Internet.