hace 4 años
PowerShell es una herramienta poderosa y versátil para la automatización y gestión de sistemas Windows. Comprender sus eventos y cómo ejecutar comandos es fundamental para administradores de sistemas, profesionales de seguridad y cualquier persona que busque optimizar sus tareas en entornos Windows. En este artículo, exploraremos en detalle el evento 4104 de PowerShell, los eventos relacionados con sesiones remotas y las mejores prácticas para la ejecución de comandos y scripts, proporcionando una guía completa para dominar estos aspectos esenciales de PowerShell.

¿Qué es el Evento 4104 en PowerShell?
El evento 4104, conocido como PowerShell Script Block Logging, es una característica de seguridad crucial en PowerShell. Este evento se registra cada vez que se ejecuta un bloque de script de PowerShell. Es importante destacar que un solo script puede contener múltiples bloques de script, y el evento 4104 se registrará para cada uno de ellos individualmente. Esto proporciona una visibilidad profunda de la actividad de scripting dentro del sistema.
Imagina que tienes un script complejo que realiza varias tareas, cada una encapsulada en un bloque de código. Con el Script Block Logging habilitado, cada uno de estos bloques de código ejecutados generará un evento 4104. Esta granularidad es invaluable para la auditoría de seguridad y la detección de comportamientos anómalos o maliciosos.
La información registrada en el evento 4104 incluye el contenido exacto del bloque de script que se ejecutó. Esto significa que se puede rastrear con precisión qué comandos y lógicas se están ejecutando en el sistema. Para los equipos de seguridad, esto es una mina de oro, ya que permite reconstruir la secuencia de acciones realizadas por un script y, en caso de incidentes, facilita la investigación forense.

Beneficios del Evento 4104
- Auditoría de Seguridad Mejorada: El registro detallado de cada bloque de script permite una auditoría exhaustiva de la actividad de PowerShell, identificando posibles usos indebidos o no autorizados.
- Detección de Amenazas: Al monitorear los eventos 4104, se pueden detectar patrones de scripts maliciosos o sospechosos, como aquellos utilizados en ataques de tipo fileless malware o living-off-the-land.
- Investigación Forense Simplificada: En caso de un incidente de seguridad, los registros del evento 4104 proporcionan un rastro claro y detallado de las acciones realizadas, acelerando la investigación y la respuesta.
- Cumplimiento Normativo: Para muchas organizaciones, mantener registros detallados de la actividad del sistema es un requisito de cumplimiento normativo. El evento 4104 ayuda a cumplir con estas exigencias en el ámbito de PowerShell.
Eventos de PowerShell para Sesiones Remotas
Si bien el documento proporcionado no especifica un ID de evento para sesiones remotas de PowerShell, es importante abordar este tema ya que la ejecución remota es una funcionalidad clave. Aunque el evento 4104 está relacionado con el registro de bloques de script, existen otros eventos relevantes para el contexto de las sesiones remotas.
Un evento importante relacionado con las sesiones remotas es el evento 4103. Este evento se registra cuando se inicia una conexión remota a PowerShell. Si bien el evento 4104 rastrea el contenido de los scripts, el evento 4103 indica el establecimiento de una sesión remota, lo cual es crucial para monitorear el acceso remoto a sistemas a través de PowerShell.
La combinación de los eventos 4103 y 4104 ofrece una visión completa. El evento 4103 te alerta sobre el inicio de una sesión remota, y los eventos 4104 posteriores, dentro de esa sesión, registran las acciones realizadas a través de scripts. Esta combinación es poderosa para la seguridad y la auditoría en entornos donde PowerShell se utiliza para la administración remota.
Configurando la Ejecución Remota en PowerShell: Execution Policy
Para habilitar la ejecución remota de scripts en PowerShell, es fundamental comprender y configurar la Execution Policy (Política de Ejecución). La Execution Policy controla bajo qué condiciones PowerShell puede ejecutar scripts. Por defecto, la política suele ser restrictiva por razones de seguridad.

Existen diferentes niveles de Execution Policy, pero para muchos casos de uso, incluyendo la ejecución remota en ciertos agentes de administración, se recomienda la política RemoteSigned o una política más permisiva.
RemoteSigned permite la ejecución de scripts que han sido descargados de internet solo si están firmados digitalmente por un editor de confianza. Los scripts creados localmente no requieren firma. Esta política ofrece un equilibrio entre seguridad y funcionalidad, permitiendo ejecutar scripts legítimos mientras se mitiga el riesgo de ejecutar scripts maliciosos no firmados.
Pasos para Configurar la Execution Policy a RemoteSigned
- Abrir PowerShell como Administrador: Es esencial ejecutar PowerShell con privilegios de administrador para poder modificar la Execution Policy. Busca "PowerShell" en el menú de inicio, haz clic derecho y selecciona "Ejecutar como administrador".
- Ejecutar el Cmdlet Set-ExecutionPolicy: Una vez que tengas PowerShell abierto como administrador, utiliza el cmdlet
Set-ExecutionPolicycon el parámetroRemoteSigned:
Set-ExecutionPolicy RemoteSigned- Confirmar el Cambio: PowerShell te pedirá confirmación para cambiar la política de ejecución. Escribe "S" para "Sí" y presiona Enter para confirmar el cambio.
Verificando la Política de Ejecución Actual
Para verificar la Execution Policy actual en tu sistema, puedes utilizar el cmdlet Get-ExecutionPolicy:
Get-ExecutionPolicyEste comando mostrará la política de ejecución que está actualmente activa en tu sistema. Asegúrate de que refleje el cambio a RemoteSigned si has configurado esa política.
¿Cómo Ejecutar un Comando o Script en PowerShell?
Ejecutar comandos y scripts en PowerShell es una tarea fundamental. Existen diversas maneras de hacerlo, dependiendo del contexto y de dónde se encuentre el script.

Ejecutando un Script de PowerShell
Supongamos que tienes un script llamado MiScript.ps1. Aquí te mostramos diferentes métodos para ejecutarlo:
- Desde la Ubicación del Script (Directorio Actual):
- Abre Windows PowerShell como Administrador.
- Navega al directorio que contiene el script utilizando el comando
cd(change directory). Por ejemplo:cd "C:\Mis Scripts" - Ejecuta el script utilizando la sintaxis
.\seguida del nombre del script:.\MiScript.ps1La sintaxis
.\indica a PowerShell que busque el script en el directorio actual.
- Ejecutando un Script desde Cualquier Ubicación (Ruta Completa):
Puedes ejecutar un script desde cualquier ubicación en el sistema especificando la ruta completa al script. Utiliza el operador de llamada
¶ invocar el script:& "C:\Mis Scripts\MiScript.ps1"Si la ruta contiene espacios, asegúrate de encerrarla entre comillas dobles.
- Ejecutando un Script desde CMD o el Diálogo Ejecutar de Windows:
También puedes ejecutar scripts de PowerShell directamente desde la línea de comandos de Windows (CMD) o desde el diálogo Ejecutar (Win + R). Utiliza el comando
powershellseguido de los parámetros necesarios:powershell -noexit "& \"C:\\Mis Scripts\\MiScript.ps1\""En este caso:
powershellinvoca el intérprete de PowerShell.-noexitmantiene la ventana de PowerShell abierta después de la ejecución del script (útil para ver la salida o errores)."& \"C:\\Mis Scripts\\MiScript.ps1\""es el comando que se ejecuta en PowerShell. El operador&llama al script, y la ruta se encierra entre comillas dobles y escapadas para que CMD las interprete correctamente.
Consideraciones Importantes al Ejecutar Scripts
- Permisos: Asegúrate de tener los permisos necesarios para ejecutar el script y para realizar las acciones que el script intenta ejecutar. En muchos casos, se requieren privilegios de administrador.
- Execution Policy: Verifica que la Execution Policy esté configurada de manera que permita la ejecución de scripts (por ejemplo, RemoteSigned). Si la política es demasiado restrictiva, podrías recibir errores al intentar ejecutar scripts.
- Rutas con Espacios: Si las rutas a tus scripts o archivos contienen espacios, siempre enciérralas entre comillas dobles para que PowerShell las interprete correctamente.
Preguntas Frecuentes (FAQ)
- ¿Qué diferencia hay entre el evento 4103 y 4104 de PowerShell?
- El evento 4103 registra el inicio de una sesión remota de PowerShell, mientras que el evento 4104 registra la ejecución de cada bloque de script dentro de PowerShell, tanto en sesiones locales como remotas. El 4103 indica el acceso remoto, y el 4104 detalla las acciones realizadas.
- ¿Es necesario ser administrador para cambiar la Execution Policy?
- Sí, se requieren privilegios de administrador para modificar la Execution Policy del sistema. Esto es una medida de seguridad para evitar cambios no autorizados.
- ¿Qué Execution Policy debo usar para la ejecución remota?
- RemoteSigned es una política recomendada para la ejecución remota, ya que permite ejecutar scripts firmados digitalmente y scripts locales, ofreciendo un buen balance entre seguridad y funcionalidad.
- ¿Por qué recibo un error al ejecutar un script y me dice que la ejecución de scripts está deshabilitada?
- Este error generalmente indica que la Execution Policy está configurada de forma muy restrictiva (por ejemplo, Restricted). Debes cambiar la Execution Policy a RemoteSigned o una política más permisiva para poder ejecutar scripts.
- ¿Cómo puedo asegurar mis scripts de PowerShell?
- Firma digitalmente tus scripts utilizando un certificado de firma de código. Esto asegura la integridad del script y permite a los sistemas con Execution Policy RemoteSigned verificar la autenticidad del editor.
Conclusión
Comprender los eventos de PowerShell, como el evento 4104 de Script Block Logging y los eventos relacionados con sesiones remotas (como el 4103), es esencial para la seguridad y la auditoría en entornos Windows. Configurar adecuadamente la Execution Policy, como RemoteSigned, permite la ejecución segura de scripts, y conocer las diferentes formas de ejecutar comandos y scripts en PowerShell te brinda la flexibilidad necesaria para automatizar tareas y gestionar sistemas de manera eficiente. Al dominar estos conceptos, podrás aprovechar al máximo el poder de PowerShell, manteniendo al mismo tiempo un entorno seguro y controlado.
