| name | windows-admin |
| description | Administra un sistema Windows remoto vía PowerShell (SSH o WSL2). Gestión de usuarios, archivos, red, discos, procesos, servicios, tareas programadas y eventos. |
| version | 1.1.0 |
| author | gentleman-programming |
| license | MIT |
| metadata | {"hermes":{"tags":["windows","powershell","sysadmin","users","network","disk","services","files","filesystem"],"related_skills":[],"config":[{"key":"windows_admin.host","description":"Hostname o IP del equipo Windows a administrar (solo para modo SSH)","default":"","prompt":"Hostname o IP del equipo Windows (dejar vacío si usas WSL2)"},{"key":"windows_admin.user","description":"Usuario SSH para conectar al equipo Windows","default":"Administrator","prompt":"Usuario SSH del equipo Windows"},{"key":"windows_admin.mode","description":"Modo de acceso: 'wsl2' o 'ssh'","default":"ssh","prompt":"Modo de acceso al host Windows (wsl2 o ssh)"}]}} |
Overview
Esta skill te permite administrar un sistema Windows completo vía PowerShell desde Hermes. El agente genera y ejecuta comandos PowerShell de forma remota usando uno de dos modos de acceso:
- WSL2: Hermes corre en el mismo equipo Windows. Usa
powershell.exe directamente.
- SSH: Hermes corre en Linux/Mac remoto. Se conecta vía
ssh usuario@host.
SIEMPRE determina el modo de acceso antes de ejecutar cualquier comando. Las operaciones destructivas (eliminar usuarios, archivos sensibles, detener procesos) requieren doble confirmación explícita del usuario.
When to Use
- Crear, modificar o eliminar usuarios y grupos locales de Windows
- Configurar adaptadores de red (IP estática, DHCP, DNS)
- Gestionar discos virtuales (VHD), particiones y volúmenes
- Administrar procesos, servicios, tareas programadas
- Revisar logs de eventos del sistema (Event Viewer)
- Diagnóstico general del sistema (CPU, RAM, disco, red)
- Hacer ping o test de conectividad a una lista de servidores
- Cualquier operación de administración remota sobre un host Windows
Prerequisites
Antes de operar, verifica el modo de acceso configurado en skills.config.windows_admin.mode:
Modo WSL2
powershell.exe -ExecutionPolicy Bypass -Command "Get-Host"
Si falla, agrega Windows PowerShell al PATH de WSL2:
export PATH="$PATH:/mnt/c/Windows/System32/WindowsPowerShell/v1.0"
Modo SSH
ssh $WIN_USER@$WIN_HOST "powershell -Command Get-Host"
Si SSH no está instalado en Windows:
# Ejecutar una vez en el host Windows como admin
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
New-NetFirewallRule -Name "OpenSSH" -DisplayName "OpenSSH" -Protocol TCP -LocalPort 22 -Action Allow
When to Use
- Crear, editar, renombrar, mover, copiar o eliminar archivos y carpetas en Windows
- Listar contenido de directorios, buscar archivos por nombre o contenido
- Gestionar permisos y ACLs de archivos y carpetas
- Crear, modificar o eliminar usuarios y grupos locales de Windows
- Configurar adaptadores de red (IP estática, DHCP, DNS)
- Gestionar discos virtuales (VHD), particiones y volúmenes
- Administrar procesos, servicios, tareas programadas
- Revisar logs de eventos del sistema (Event Viewer)
- Diagnóstico general del sistema (CPU, RAM, disco, red)
- Hacer ping o test de conectividad a una lista de servidores
- Cualquier operación de administración remota sobre un host Windows
Workflow
Paso 0: Determinar modo de acceso
Lee skills.config.windows_admin.mode. Define el wrapper de ejecución:
EXEC='powershell.exe -ExecutionPolicy Bypass -Command'
EXEC="ssh $WIN_USER@$WIN_HOST powershell -ExecutionPolicy Bypass -Command"
Todas las operaciones siguientes usan $EXEC "{ ... }".
Paso 1: Diagnóstico del sistema
Para diagnóstico rápido, carga y ejecuta el template:
Ver: assets/system-diagnostics.ps1
powershell.exe -ExecutionPolicy Bypass -File "/mnt/c/Temp/system-diagnostics.ps1"
scp assets/system-diagnostics.ps1 $WIN_USER@$WIN_HOST:C:/Temp/
ssh $WIN_USER@$WIN_HOST "powershell -ExecutionPolicy Bypass -File C:/Temp/system-diagnostics.ps1"
Paso 2: Gestión de archivos y carpetas
Control total del sistema de archivos: listar, crear, leer, editar, renombrar, mover, copiar, eliminar y buscar.
Listar contenido:
# Listar directorio
Get-ChildItem -Path "C:\ruta"
# Listar recursivo con filtro
Get-ChildItem -Path "C:\ruta" -Recurse -Filter "*.log"
# Mostrar archivos ocultos y del sistema
Get-ChildItem -Path "C:\ruta" -Force
# Listar con tamaño, fecha, atributos
Get-ChildItem -Path "C:\ruta" | Select Name, Length, LastWriteTime, Attributes | Format-Table -AutoSize
Crear archivos y carpetas:
# Crear archivo vacío
New-Item -Path "C:\ruta\archivo.txt" -ItemType File
# Crear archivo con contenido
New-Item -Path "C:\ruta\archivo.txt" -ItemType File -Value "contenido inicial"
# Crear carpeta
New-Item -Path "C:\ruta\NuevaCarpeta" -ItemType Directory
# Crear estructura de carpetas anidadas
New-Item -Path "C:\ruta\A\B\C" -ItemType Directory -Force
Leer y editar contenido:
# Leer archivo completo
Get-Content -Path "C:\ruta\archivo.txt"
# Leer con números de línea
Get-Content -Path "C:\ruta\archivo.txt" | Select-String "." | ForEach-Object { "$($_.LineNumber): $($_.Line)" }
# Leer solo las primeras / últimas N líneas
Get-Content -Path "C:\ruta\archivo.txt" -TotalCount 20
Get-Content -Path "C:\ruta\archivo.txt" -Tail 20
# Sobrescribir contenido completo
Set-Content -Path "C:\ruta\archivo.txt" -Value "nuevo contenido"
# Agregar línea al final
Add-Content -Path "C:\ruta\archivo.txt" -Value "línea nueva"
# Reemplazar texto dentro de un archivo
(Get-Content "C:\ruta\archivo.txt") -replace "texto_viejo", "texto_nuevo" | Set-Content "C:\ruta\archivo.txt"
# Editar múltiples archivos con regex
Get-ChildItem "C:\ruta\*.conf" | ForEach-Object {
(Get-Content $_.FullName) -replace "localhost", "192.168.1.100" | Set-Content $_.FullName
}
Renombrar:
# Renombrar archivo o carpeta
Rename-Item -Path "C:\ruta\viejo.txt" -NewName "nuevo.txt"
# Renombrar en masa (ej: quitar prefijo)
Get-ChildItem "C:\ruta\*.bak" | ForEach-Object {
Rename-Item $_.FullName -NewName ($_.Name -replace "\.bak$", ".txt")
}
Copiar y mover:
# Copiar archivo
Copy-Item -Path "C:\origen\archivo.txt" -Destination "C:\destino\"
# Copiar carpeta completa (recursivo)
Copy-Item -Path "C:\origen" -Destination "C:\destino" -Recurse
# Mover archivo o carpeta
Move-Item -Path "C:\origen\archivo.txt" -Destination "C:\destino\"
# Mover con sobreescritura
Move-Item -Path "C:\origen\archivo.txt" -Destination "C:\destino\archivo.txt" -Force
Buscar archivos:
# Buscar por nombre (wildcard)
Get-ChildItem -Path "C:\" -Recurse -Filter "*config*" -ErrorAction SilentlyContinue
# Buscar por extensión
Get-ChildItem -Path "C:\Users" -Recurse -Include "*.ps1","*.bat" -ErrorAction SilentlyContinue
# Buscar por contenido (texto dentro del archivo)
Select-String -Path "C:\ruta\*.txt" -Pattern "error" -CaseSensitive:$false
# Buscar recursivo por contenido
Get-ChildItem "C:\ruta" -Recurse -Include "*.log" |
Select-String -Pattern "ERROR|CRITICAL" | Select Path, LineNumber, Line
# Archivos modificados en las últimas 24h
Get-ChildItem "C:\ruta" -Recurse |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-24) }
# Archivos mayores a 100MB
Get-ChildItem "C:\ruta" -Recurse |
Where-Object { $_.Length -gt 100MB } |
Select Name, @{n="MB";e={[math]::Round($_.Length/1MB,1)}} | Sort MB -Descending
Permisos y ACL:
# Ver permisos
Get-Acl -Path "C:\ruta" | Format-List
# Copiar permisos de un path a otro
$acl = Get-Acl "C:\origen"
Set-Acl -Path "C:\destino" -AclObject $acl
# Dar control total a un usuario
$acl = Get-Acl "C:\ruta"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("jdoe","FullControl","Allow")
$acl.SetAccessRule($rule)
Set-Acl "C:\ruta" $acl
# Tomar posesión de un archivo (requiere admin)
takeown.exe /F "C:\ruta\archivo" /R /D Y
icacls.exe "C:\ruta\archivo" /grant Administrators:F /T
[DESTRUCTIVO] Eliminar — REQUIERE DOBLE CONFIRMACIÓN si el archivo es sensible:
# Eliminar archivo
Remove-Item -Path "C:\ruta\archivo.txt" -ErrorAction Stop
# Eliminar carpeta y todo su contenido
Remove-Item -Path "C:\ruta\carpeta" -Recurse -Force -ErrorAction Stop
# Vaciar papelera de reciclaje
Clear-RecycleBin -Force -ErrorAction SilentlyContinue
Para archivos sensibles (.key .pem .pfx .log .bak .sql .csv .json con credenciales):
Ver: assets/delete-sensitive-file-confirmed.ps1
Paso 4: Gestión de usuarios
Listar usuarios:
Get-LocalUser | Select Name, Enabled, LastLogon | Format-Table -AutoSize
Crear usuario:
$pass = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
New-LocalUser -Name "jdoe" -Password $pass -FullName "John Doe" -PasswordNeverExpires
Add-LocalGroupMember -Group "Usuarios" -Member "jdoe"
Creación masiva desde CSV (nombre,contra):
Ver: assets/create-users-csv.ps1
[DESTRUCTIVO] Eliminar usuario — REQUIERE DOBLE CONFIRMACIÓN:
Ver: assets/delete-user-confirmed.ps1
NUNCA ejecutes Remove-LocalUser directamente. Carga el script assets/delete-user-confirmed.ps1 y ejecútalo en el host. El script maneja la doble confirmación interactiva.
Paso 5: Configuración de red
Ver: assets/network-config.ps1
# Ver adaptadores disponibles
Get-NetAdapter | Select Name, Status, LinkSpeed
# IP estática
New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress "192.168.1.100" `
-PrefixLength 24 -DefaultGateway "192.168.1.1"
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses "8.8.8.8","8.8.4.4"
# DHCP
Set-NetIPInterface -InterfaceAlias "Ethernet" -Dhcp Enabled
# Test de conectividad desde CSV (ip,nombre,localizacion)
Import-Csv servidores.csv | ForEach-Object {
$ok = Test-Connection -ComputerName $_.ip -Count 2 -Quiet
[PSCustomObject]@{ Nombre=$_.nombre; IP=$_.ip; Online=$ok }
} | Format-Table -AutoSize
Paso 6: Discos y VHD
# Ver discos
Get-Disk | Select Number, FriendlyName, Size, PartitionStyle
# Crear VHD
$path = "C:\VMs\disco.vhdx"
New-VHD -Path $path -SizeBytes (50GB) -Dynamic
Mount-VHD -Path $path
$disk = Get-Disk | Where PartitionStyle -eq "RAW" | Select -Last 1
Initialize-Disk -Number $disk.Number -PartitionStyle MBR
$part = New-Partition -DiskNumber $disk.Number -UseMaximumSize -AssignDriveLetter
Format-Volume -DriveLetter $part.DriveLetter -FileSystem NTFS -NewFileSystemLabel "VHD" -Confirm:$false
Paso 7: Procesos y servicios
# Top 10 procesos por CPU
Get-Process | Sort CPU -Descending | Select -First 10 Name, CPU, WorkingSet
# Servicios automáticos detenidos
Get-Service | Where { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" }
# Iniciar / detener servicio
Start-Service -Name "wuauserv"
Stop-Service -Name "wuauserv" -Force
[DESTRUCTIVO] Detener proceso: pide confirmación explícita al usuario antes de Stop-Process -Force.
Paso 8: Tareas programadas
# Listar
Get-ScheduledTask | Select TaskName, State | Format-Table
# Crear
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\scripts\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
Register-ScheduledTask -TaskName "BackupDiario" -Action $action -Trigger $trigger -RunLevel Highest
[DESTRUCTIVO] Eliminar tarea: pide confirmación explícita antes de Unregister-ScheduledTask.
Paso 9: Eventos del sistema
# Últimos 5 errores del sistema
Get-WinEvent -LogName "System" -MaxEvents 100 |
Where LevelDisplayName -eq "Error" | Select -First 5 TimeCreated, ProviderName, Message |
Format-List
# WMI — info hardware
Get-CimInstance Win32_OperatingSystem | Select Caption, Version, FreePhysicalMemory
Get-CimInstance Win32_LogicalDisk | Select DeviceID, Size, FreeSpace
Double-Confirmation Protocol
Aplica OBLIGATORIAMENTE a cualquier operación irreversible: eliminar usuarios, archivos sensibles, detener procesos críticos, borrar tareas.
Archivos sensibles — extensiones que siempre requieren doble confirmación:
.key .pem .pfx .p12 .crt .cer .log .bak .backup .sql
.csv o .json si contienen password|token|secret|credential|apikey
Flujo obligatorio:
PASO 1 — Mostrar metadata del objeto antes de actuar:
Get-Item "ruta" | Select Name, Length, LastWriteTime, Attributes
PASO 2 — Primera confirmación (texto exacto):
"¿Confirmar [operación] de '[nombre]'? Escribe CONFIRMAR para continuar"
→ Si no escribe CONFIRMAR exacto: CANCELAR y notificar
PASO 3 — Segunda confirmación (nombre exacto del objeto):
"Segunda confirmación: escribe el nombre exacto de [usuario/archivo]"
→ Si no coincide exactamente: CANCELAR y notificar
PASO 4 — Ejecutar solo si ambas confirmaciones son correctas:
Registrar: "OPERACIÓN EJECUTADA: [detalle] — [timestamp]"
Para usuarios: carga assets/delete-user-confirmed.ps1
Para archivos: carga assets/delete-sensitive-file-confirmed.ps1
Quick Reference
| Operación | Comando base | ¿Doble confirmación? |
|---|
| ARCHIVOS | | |
| Listar directorio | Get-ChildItem | No |
| Crear archivo / carpeta | New-Item | No |
| Leer archivo | Get-Content | No |
| Editar / reemplazar texto | Set-Content / -replace | No |
| Renombrar | Rename-Item | No |
| Copiar | Copy-Item -Recurse | No |
| Mover | Move-Item | No |
| Buscar por nombre | Get-ChildItem -Recurse -Filter | No |
| Buscar por contenido | Select-String | No |
| Ver / cambiar permisos ACL | Get-Acl / Set-Acl | No |
| Eliminar archivo sensible | assets/delete-sensitive-file-confirmed.ps1 | SÍ |
| Eliminar carpeta | Remove-Item -Recurse -Force | SÍ si contiene archivos sensibles |
| USUARIOS | | |
| Listar usuarios | Get-LocalUser | No |
| Crear usuario | New-LocalUser | No |
| Eliminar usuario | assets/delete-user-confirmed.ps1 | SÍ |
| SISTEMA | | |
| Configurar IP | assets/network-config.ps1 | No |
| Test conectividad | Test-Connection | No |
| Crear VHD | New-VHD + Format-Volume | No |
| Listar servicios | Get-Service | No |
| Detener proceso | Stop-Process -Force | SÍ |
| Diagnóstico sistema | assets/system-diagnostics.ps1 | No |
Pitfalls
| Problema | Causa | Fix |
|---|
| "No se puede ejecutar scripts" | ExecutionPolicy restringida | Siempre usar -ExecutionPolicy Bypass en el proceso |
powershell.exe no encontrado en WSL2 | PATH incompleto | export PATH="$PATH:/mnt/c/Windows/System32/WindowsPowerShell/v1.0" |
| SSH host key changed | IP reutilizada | ssh-keygen -R <host> |
| Contraseñas en logs | Sin ConvertTo-SecureString | Nunca loggear passwords; usar siempre SecureString |
Remove-LocalUser sin confirmación | Ejecución directa | Usar assets/delete-user-confirmed.ps1 siempre |
Resources
- Diagnóstico:
assets/system-diagnostics.ps1 — snapshot completo (CPU, RAM, disco, red, procesos, eventos)
- Usuarios CSV:
assets/create-users-csv.ps1 — creación masiva desde nombre,contra
- Eliminar usuario:
assets/delete-user-confirmed.ps1 — flujo de doble confirmación
- Eliminar archivo sensible:
assets/delete-sensitive-file-confirmed.ps1 — detección automática + doble confirmación
- Red:
assets/network-config.ps1 — IP estática o DHCP parametrizado
- Convenciones:
references/conventions.md — acceso, CSVs, seguridad