Puntos clave
- PowerShell funciona como lenguaje de scripting y como shell interactivo para tareas como la creación de usuarios, las operaciones con archivos y la configuración de red.
- Usa scripts sencillos para automatizaciones complejas: encadena cmdlets para flujos de trabajo avanzados, como la monitorización continua de logs con alertas por correo ante eventos «ERROR», los informes automáticos de errores en CSV, las llamadas autenticadas a API REST y la combinación de varias fuentes de datos por ID.
- Ejemplos de casos de uso de PowerShell: un organismo público automatizó el ciclo de vida de su Active Directory, mientras que un proveedor sanitario automatizó la programación de parches y los informes de cumplimiento.
- Integra la seguridad en cada script: el acceso con mínimo privilegio y los scripts firmados reducen los riesgos de seguridad de la automatización y garantizan el cumplimiento de los marcos normativos.
La ciberseguridad avanza a gran velocidad y los profesionales de TI buscan constantemente formas de mejorar su productividad y eficiencia. Esta guía se centra en la automatización con PowerShell, uno de los lenguajes de scripting más potentes y populares de la actualidad. Te ayudará a entender los fundamentos, las capacidades de la herramienta y las mejores prácticas para automatizar tareas repetitivas con PowerShell.
¿Qué es PowerShell?
PowerShell es un framework de automatización de tareas y gestión de configuraciones creado por Microsoft. Funciona a la vez como lenguaje de scripting y como shell de línea de comandos interactivo para la administración de sistemas.
PowerShell se utiliza ampliamente en distintos ámbitos de TI, como la administración de sistemas, la configuración de redes y la ciberseguridad. Entre sus ventajas están la automatización, la simplificación del scripting y la posibilidad de gestionar sistemas Windows y no Windows.
Aunque se parece a lenguajes de scripting como Python o Bash, PowerShell está diseñado para Windows y se integra directamente con sus funciones y aplicaciones.
Fundamentos del uso de PowerShell
Para dominar PowerShell conviene asimilar conceptos básicos como los cmdlets (se pronuncian «command-lets»), que son comandos ligeros propios de PowerShell, y las pipelines, que permiten pasar datos de un cmdlet a otro.
Un script de PowerShell es una serie de comandos e instrucciones escritos en el lenguaje de scripting de PowerShell. Permite automatizar tareas complejas ejecutando varios comandos de forma secuencial.
Usar PowerShell con eficacia requiere familiarizarse con el PowerShell Integrated Scripting Environment (ISE) y conocer las estructuras básicas de scripting, como variables, bucles y sentencias condicionales. En los siguientes apartados verás ejemplos de estas estructuras.
Scripts sencillos de PowerShell para automatizar
Los scripts de PowerShell son una herramienta muy potente para la automatización. Permiten agilizar tareas repetitivas, reducir el error humano y ahorrar tiempo y recursos valiosos.
Tareas habituales en PowerShell y sus scripts
PowerShell sirve para automatizar una gran variedad de tareas. A continuación tienes algunos ejemplos de automatizaciones sencillas, con el código de PowerShell correspondiente y una explicación de las funciones que ejecuta cada uno.
Creación y gestión de usuarios
Código de ejemplo:
New-ADUser -Name "James Roberts" -SamAccountName "jamesroberts" -UserPrincipalName "jamesroberts@ at domain.com" -AccountPassword (ConvertTo-SecureString "ChangeMe123" -AsPlainText -Force) # Create a new user New-ADUser -Name "James Roberts" -SamAccountName "jamesroberts" -UserPrincipalName "jamesroberts @at domain.com" -AccountPassword (ConvertTo-SecureString "ChangeMe123" -AsPlainText -Force) # Create a new user New-ADUser -Name "James Roberts" -SamAccountName "jamesroberts" -UserPrincipalName "jamesroberts@ at domain.com" -AccountPassword (ConvertTo-SecureString "ChangeMe123" -AsPlainText -Force)
Explicación: este script crea un usuario nuevo en Active Directory con el nombre «James Roberts», le asigna un nombre de cuenta SAM (Security Account Manager), establece el nombre principal del usuario y especifica la contraseña de la cuenta.
Operaciones con archivos y carpetas
Código de ejemplo:
# Copy files from one folder to another $sourceFolder = "C:\source" $destinationFolder = "D:\destination" Copy-Item -Path "$sourceFolder\*" -Destination $destinationFolder -Recurse
Explicación: este script copia todos los archivos de la carpeta de origen a la de destino, incluidos los subdirectorios (de forma recursiva).
Monitorización e informes del uso de CPU
Código de ejemplo:
# Get CPU usage
$cpuUsage = Get-Counter -Counter "\Processor(_Total)% Processor Time"
$cpuUsage.CounterSamples | ForEach-Object {
Write-Host "Processor: $($_.InstanceName), Usage: $($_.CookedValue)%"
}Explicación: este script obtiene información sobre el uso de CPU de todos los procesadores y muestra el porcentaje de uso de cada uno.
También puede interesarte nuestro artículo sobre cómo reducir el uso de CPU.
Encuentra más scripts de PowerShell relacionados con la monitorización en el Script Hub de NinjaOne.
Tareas relacionadas con la seguridad
Código de ejemplo:
# Check open ports on a remote host
$hostname = "example.com"
$ports = 80, 443, 22
$ports | ForEach-Object {
$port = $_
$result = Test-NetConnection -ComputerName $hostname -Port $port
if ($result.TcpTestSucceeded) {
Write-Host "Port $port is open"
} else {
Write-Host "Port $port is closed"
}
}
Explicación: este script comprueba la disponibilidad de determinados puertos en un host remoto e indica si cada puerto está abierto o cerrado.
Encuentra más scripts relacionados con la seguridad en el Script Hub de NinjaOne.
Configuración de red
Código de ejemplo:
# Configure a network adapter with a static IP address $interfaceName = "Ethernet" $ipAddress = "192.168.1.100" $subnetMask = "255.255.255.0" $gateway = "192.168.1.1" $dnsServers = "8.8.8.8", "8.8.4.4" New-NetIPAddress -InterfaceAlias $interfaceName -IPAddress $ipAddress -PrefixLength 24 -DefaultGateway $gateway Set-DnsClientServerAddress -InterfaceAlias $interfaceName -ServerAddresses $dnsServers
Explicación: este script configura un adaptador de red con una dirección IP estática, una máscara de subred, una puerta de enlace predeterminada y las direcciones de los servidores DNS.
Automatización de tareas complejas con PowerShell
A medida que ganas soltura con PowerShell, puedes automatizar tareas y escenarios más complejos. Aquí tienes algunos ejemplos avanzados de PowerShell, con la explicación de las funciones que ejecutan:
Monitorización continua de logs y alertas
Código de ejemplo:
# Monitor a log file and send an email alert on a specific event $logFilePath = "C:\logs\app.log" $keywordToMonitor = "ERROR" $recipientEmail = "[email protected]" $smtpServer = "smtp.domain.com" $smtpPort = 587 Get-Content -Path $logFilePath -Wait | ForEach-Object { if ($_ -match $keywordToMonitor) { Send-MailMessage -From "[email protected]" -To $recipientEmail -Subject "Error Alert" -SmtpServer $smtpServer -Port $smtpPort } }
Explicación: este script monitoriza de forma continua un archivo de log en busca de una condición de error, concretamente de una palabra clave («ERROR»), y envía una alerta por correo electrónico cuando la detecta.
Análisis de logs e informes
Código de ejemplo:
$results | Export-Csv -Path "log_analysis.csv" -NoTypeInformation
# Analyze log files and generate a report $logFiles = Get-ChildItem -Path "C:\logs" -Filter "*.log" -File $results = @() foreach ($logFile in $logFiles) { $logContent = Get-Content -Path $logFile.FullName $errorCount = ($logContent | Select-String -Pattern "ERROR").Count $results += [PSCustomObject]@{ LogFileName = $logFile.Name ErrorCount = $errorCount } } $results | Export-Csv -Path "log_analysis.csv" -NoTypeInformation
# Analyze log files and generate a report
$logFiles = Get-ChildItem -Path "C:\logs" -Filter "*.log" -File
$results = @()
foreach ($logFile in $logFiles) {
$logContent = Get-Content -Path $logFile.FullName
$errorCount = ($logContent | Select-String -Pattern "ERROR").Count
$results += [PSCustomObject]@{
LogFileName = $logFile.Name
ErrorCount = $errorCount
}
}
$results | Export-Csv -Path "log_analysis.csv" -NoTypeInformation
Explicación: este script recorre un directorio en busca de archivos de log, analiza cada uno para contar las apariciones de la palabra clave «ERROR» y genera un informe CSV con los nombres de los archivos y el número de errores.
También puede interesarte nuestro artículo sobre gestión de logs en Linux: técnicas avanzadas y mejores prácticas.
Integración con API de terceros
Código de ejemplo:
# Interact with a REST API to retrieve data
$apiUrl = "https://api.example.com/data"
$headers = @{
"Authorization" = "Bearer YourAuthToken"
}
try {
$data = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get
Write-Host "Received data from the API:"
$data | Format-Table
}
catch {
Write-Host "Failed to retrieve data from the API: $($_.Exception.Message)"
}
Explicación: este script interactúa con una API REST enviando una petición GET autenticada, procesa la respuesta de la API y muestra los datos recibidos.
Manipulación compleja de datos
Código de ejemplo:
# Transform and aggregate data from multiple sources
$data1 = Import-Csv -Path "source1.csv"
$data2 = Import-Csv -Path "source2.csv"
# Merge data from different sources
$mergedData = $data1 | ForEach-Object {
$item1 = $_
$matchingItem = $data2 | Where-Object { $_.ID -eq $item1.ID }
if ($matchingItem) {
$_ | Select-Object *, @{Name="AdditionalProperty";Expression={$matchingItem.Property}}
} else {
$_
}
}
# Export the merged data
$mergedData | Export-Csv -Path "merged_data.csv" -NoTypeInformation
Explicación: este script importa datos de dos archivos CSV, los combina a partir de un ID común y exporta el resultado a un nuevo archivo CSV.
Casos reales de tareas automatizadas con PowerShell
Para que veas en la práctica todo lo que permite PowerShell, repasamos dos escenarios reales en los que la automatización con PowerShell ha resuelto tareas complejas.
Caso práctico n.º 1: gestión de cuentas de usuario en Active Directory
Problema: un gran organismo público con miles de empleados necesitaba una forma eficiente de gestionar las cuentas de usuario en Active Directory. Esa gestión incluía crear cuentas nuevas, desactivar o eliminar las de los empleados que ya no formaban parte de la organización y actualizar periódicamente los atributos de usuario.
Solución: se recurrió a PowerShell para automatizar estas tareas. Entre las tareas convertidas en scripts estaban:
- Creación de nuevas cuentas de usuario: se creó un script de PowerShell que lee la información de los usuarios desde un archivo CSV y crea automáticamente las cuentas en Active Directory con los atributos adecuados, como nombre de usuario, contraseña y pertenencia a grupos.
- Desactivación o eliminación de cuentas inactivas: se desarrolló otro script para identificar y desactivar o eliminar las cuentas de los empleados que ya no estaban en la empresa, según la fecha del último inicio de sesión. Este script revisa con regularidad la actividad de los usuarios y ejecuta las acciones necesarias.
- Actualización de atributos de usuario: se programaron scripts de PowerShell para ejecutarse en intervalos concretos y actualizar atributos como el puesto, el departamento y los datos de contacto a partir de la información del sistema de RR. HH.
Descubre cómo NinjaOne te ayuda a gestionar fácilmente los usuarios de Active Directory.
Caso práctico n.º 2: gestión de parches
Problema: un administrador de sistemas de un proveedor sanitario necesitaba asegurarse de que todos los servidores y estaciones de trabajo de la organización se actualizaran con regularidad con los últimos parches de seguridad para protegerse frente a las vulnerabilidades.
Solución: se implementó la automatización con PowerShell para agilizar la gestión de parches:
- Despliegue automatizado de parches: se desarrollaron scripts de PowerShell para conectarse en remoto a servidores y estaciones de trabajo e iniciar el proceso de Windows Update. Estos scripts programan las actualizaciones durante las ventanas de mantenimiento para minimizar las interrupciones.
- Informes del estado de los parches: PowerShell también sirvió para generar informes sobre el estado de los parches en cada equipo. Así se podía ver qué máquinas estaban al día y cuáles requerían atención.
- Cumplimiento de la seguridad: se utilizaron scripts de PowerShell para aplicar y verificar las actualizaciones y configuraciones de seguridad necesarias, de modo que los dispositivos cumplieran las políticas de seguridad definidas.»
Estos ejemplos muestran cómo PowerShell automatiza tareas rutinarias de TI y mejora la eficiencia, la precisión y la seguridad. Las implementaciones reales pueden requerir scripts más complejos y deben adaptarse a los requisitos de cada organización.
Descubre cómo NinjaOne puede automatizar la gestión de parches en cualquier endpoint.
Mejores prácticas de scripting con PowerShell
Quien domina la escritura de scripts en PowerShell mantiene una sintaxis coherente y consistente: usa nombres de variables con significado, añade comentarios que aporten claridad y organiza los scripts con lógica. Adopta estas mejores prácticas para automatizar tareas de forma segura con PowerShell:
Utiliza las políticas de ejecución de PowerShell
Configura las políticas de ejecución de PowerShell para controlar la ejecución de scripts. Por ejemplo, RemoteSigned exige que los scripts descargados de Internet estén firmados por un editor de confianza, mientras que AllSigned requiere que todos los scripts y archivos de configuración estén firmados por un editor de confianza. Las políticas de ejecución ayudan a reducir el riesgo de ejecutar scripts no confiables sin darte cuenta, pero no deben considerarse una barrera de seguridad.
Echale un vistazo a la videoguía sobre las políticas de ejecución de PowerShell.
Usa firmas digitales
Firmar digitalmente los scripts de PowerShell con un certificado de firma de código añade una capa extra de seguridad. Así se garantiza que el script no se ha manipulado desde que se firmó. Al ejecutar los scripts, PowerShell puede verificar la firma digital para confirmar su autenticidad.
Aplica el principio del mínimo privilegio
Cuando ejecutes scripts de PowerShell, sigue el principio del mínimo privilegio. Asegúrate de que el usuario o la cuenta de servicio que ejecuta el script tenga únicamente los permisos mínimos necesarios para completar la tarea. Evita usar cuentas con privilegios elevados siempre que sea posible.
Guarda las credenciales de forma segura
Cuando trabajes con credenciales en los scripts, utiliza métodos seguros para gestionarlas y recuperarlas. El cmdlet Get-Credential de PowerShell puede solicitar credenciales de forma segura y devolverlas como un objeto PSCredential. Evita escribir usuarios y contraseñas directamente en el código y recurre a un almacén de credenciales o secretos adecuado cuando necesites conservarlas.
Valida las entradas
Depura y valida los datos de entrada para prevenir ataques de inyección de código, como la inyección SQL o la inyección de scripts. Evita usar directamente datos introducidos por el usuario en la ejecución del script sin validarlos antes.
Implementa la gestión de errores
Una gestión de errores sólida permite que los scripts respondan con elegancia ante situaciones inesperadas. Evita mostrar información sensible en los mensajes de error que un atacante pudiera aprovechar.
Usa protocolos seguros
Cuando te conectes a sistemas remotos o servicios web, utiliza protocolos seguros como HTTPS o SSH. Evita enviar información sensible por conexiones sin cifrar.
Actualiza y parchea con regularidad
Mantén PowerShell y todos sus módulos y dependencias al día con los últimos parches y actualizaciones de seguridad. El software desactualizado puede ser vulnerable a exploits conocidos.
Registra y audita
Implementa mecanismos de registro y auditoría para seguir la ejecución de los scripts y detectar actividades sospechosas. El cmdlet Start-Transcript de PowerShell resulta útil para esto.
Revisa el código con regularidad
Realiza revisiones periódicas del código de tus scripts de PowerShell para detectar posibles vulnerabilidades de seguridad. Puedes utilizar herramientas de análisis de código para automatizar este proceso.
Sigue las recomendaciones del sector
Mantente al día de las recomendaciones de seguridad y los requisitos de cumplimiento propios de tu sector (por ejemplo, PCI DSS, HIPAA o GDPR) que afecten a tu organización. Asegúrate de que los scripts que desarrolles se ajusten a esos estándares.
Seguir estas prácticas de seguridad ayuda a reducir los riesgos asociados al scripting con PowerShell y contribuye a un entorno de TI más seguro y conforme a la normativa. La seguridad es un proceso continuo: revisar y actualizar los scripts con regularidad es imprescindible para mantenerte protegido frente a amenazas en constante evolución.
Una estrategia de automatización impulsa la eficiencia
Una estrategia bien planificada de automatización con PowerShell permite a los equipos de TI optimizar sus operaciones, escalar con eficiencia, reforzar la seguridad y mantener la flexibilidad. La versatilidad de PowerShell permite automatizar tareas simples y complejas, lo que lo convierte en una herramienta clave para el rendimiento y la eficiencia.
Los profesionales de TI pueden aplicar estas recomendaciones para empezar a construir su estrategia de automatización con confianza.
Para ampliar tus capacidades de automatización, la Automatización de TI de NinjaOne ofrece herramientas con las que los equipos de TI pueden automatizar tareas y flujos de trabajo a gran escala. Además, centraliza el parcheo, el despliegue de software y la remediación en un único panel. Las tareas pueden ejecutarse de forma programada, en respuesta a condiciones definidas o a demanda. También puedes integrar respuestas automatizadas en las políticas de dispositivos y de grupo, con la opción de anularlas o ajustarlas cuando sea necesario.
