Fix: setup.ps1 en ASCII puro y UTF-8 con BOM para PS 5.1

This commit is contained in:
2026-09-25 09:43:35 +02:00
parent 8ae55b0750
commit 59098ccf65
3 changed files with 1225 additions and 1222 deletions

3
.gitattributes vendored Normal file
View File

@@ -0,0 +1,3 @@
# Forzar saltos de linea de Windows en scripts para PS 5.1 y cmd
*.ps1 text eol=crlf
*.cmd text eol=crlf

116
setup.ps1
View File

@@ -1,43 +1,43 @@
#Requires -Version 5.1
#Requires -Version 5.1
<#
.SYNOPSIS
Configuración inicial de Windows 10.
Configuracion inicial de Windows 10.
.DESCRIPTION
Configura una cuenta técnica llamada "tecnica" y habilita
Configura una cuenta tecnica llamada "tecnica" y habilita
Escritorio Remoto.
Características:
Caracteristicas:
- Se autoeleva a Administrador.
- Crea "tecnica" si no existe.
- Solicita y confirma la contraseña al crearla.
- NO cambia la contraseña si "tecnica" ya existe.
- Añade "tecnica" al grupo Administradores.
- Solicita y confirma la contrasena al crearla.
- NO cambia la contrasena si "tecnica" ya existe.
- Anade "tecnica" al grupo Administradores.
- Activa Escritorio Remoto.
- Configura el Firewall para RDP.
- Añade "tecnica" al grupo Usuarios de escritorio remoto.
- Anade "tecnica" al grupo Usuarios de escritorio remoto.
- Oculta "tecnica" de la lista de usuarios del login.
- Verifica el estado real al finalizar.
- Registra todos los pasos y errores en %TEMP%\crb-setup.log.
- Devuelve 0 si todo está correcto.
- Devuelve 1 si hay algún error.
- Devuelve 0 si todo esta correcto.
- Devuelve 1 si hay algun error.
.NOTES
Compatible con Windows 10 / PowerShell 5.1.
#>
# ============================================================
# CONFIGURACIÓN
# CONFIGURACION
# ============================================================
$Username = "tecnica"
# Ruta del log de diagnóstico.
# Ruta del log de diagnostico.
$LogPath = Join-Path $env:TEMP "crb-setup.log"
# ============================================================
# CONFIGURACIÓN DE ERRORES
# CONFIGURACION DE ERRORES
# ============================================================
$ErrorActionPreference = "Stop"
@@ -110,12 +110,12 @@ function Write-Log {
-ErrorAction SilentlyContinue
}
catch {
# El log nunca debe interrumpir la ejecución del script.
# El log nunca debe interrumpir la ejecucion del script.
}
}
# ============================================================
# OBTENER MENSAJE COMPLETO DE UNA EXCEPCIÓN
# OBTENER MENSAJE COMPLETO DE UNA EXCEPCION
# ============================================================
function Get-ExceptionMessage {
@@ -166,7 +166,7 @@ function Ensure-Administrator {
Write-Host ""
Write-WarningMessage "Se necesitan permisos de Administrador."
Write-Host "Solicitando elevación mediante UAC..." -ForegroundColor Yellow
Write-Host "Solicitando elevacion mediante UAC..." -ForegroundColor Yellow
Write-Host ""
if (-not $PSCommandPath) {
@@ -175,7 +175,7 @@ function Ensure-Administrator {
}
# --------------------------------------------------------
# ELEVACIÓN DESDE RUTA DE RED (UNC)
# ELEVACION DESDE RUTA DE RED (UNC)
# --------------------------------------------------------
# El proceso elevado puede perder el acceso a la carpeta de
# red (\\servidor\...). Para evitarlo, se copia el script
@@ -186,7 +186,7 @@ function Ensure-Administrator {
if ($scriptPath -like "\\*") {
Write-WarningMessage "El script está en una ruta de red (UNC)."
Write-WarningMessage "El script esta en una ruta de red (UNC)."
Write-Host "Copiando a la carpeta temporal para poder elevarse..." `
-ForegroundColor Yellow
@@ -293,7 +293,7 @@ function Get-LocalGroupBySid {
Select-Object -First 1
if ($null -eq $group) {
throw "No se encontró el grupo con SID $Sid."
throw "No se encontro el grupo con SID $Sid."
}
return $group
@@ -341,7 +341,7 @@ function Test-UserInGroup {
}
# ============================================================
# AÑADIR USUARIO A GRUPO
# ANADIR USUARIO A GRUPO
# ============================================================
function Ensure-UserInGroup {
@@ -362,7 +362,7 @@ function Ensure-UserInGroup {
}
Write-Host ""
Write-Host "Añadiendo '$Username' a '$($Group.Name)'..." `
Write-Host "Anadiendo '$Username' a '$($Group.Name)'..." `
-ForegroundColor Cyan
Add-LocalGroupMember `
@@ -370,18 +370,18 @@ function Ensure-UserInGroup {
-Member $Username `
-ErrorAction Stop
# Verificación inmediata.
# Verificacion inmediata.
if (-not (Test-UserInGroup -Username $Username -Group $Group)) {
throw "El usuario '$Username' no aparece en '$($Group.Name)' después de añadirlo."
throw "El usuario '$Username' no aparece en '$($Group.Name)' despues de anadirlo."
}
Write-Ok "'$Username' pertenece ahora a '$($Group.Name)'."
}
# ============================================================
# PEDIR Y CONFIRMAR CONTRASEÑA
# PEDIR Y CONFIRMAR CONTRASENA
# ============================================================
function Read-ConfirmedPassword {
@@ -389,12 +389,12 @@ function Read-ConfirmedPassword {
while ($true) {
Write-Host ""
Write-Host "Introduce la contraseña para '$Username'." `
Write-Host "Introduce la contrasena para '$Username'." `
-ForegroundColor Cyan
$password1 = Read-Host "Contraseña" -AsSecureString
$password1 = Read-Host "Contrasena" -AsSecureString
$password2 = Read-Host "Repite la contraseña" -AsSecureString
$password2 = Read-Host "Repite la contrasena" -AsSecureString
$ptr1 = [IntPtr]::Zero
$ptr2 = [IntPtr]::Zero
@@ -422,14 +422,14 @@ function Read-ConfirmedPassword {
if ([string]::IsNullOrWhiteSpace($plain1)) {
Write-ErrorMessage "La contraseña no puede estar vacía."
Write-ErrorMessage "La contrasena no puede estar vacia."
continue
}
if ($plain1 -cne $plain2) {
Write-ErrorMessage "Las contraseñas no coinciden."
Write-ErrorMessage "Las contrasenas no coinciden."
continue
}
@@ -455,7 +455,7 @@ function Read-ConfirmedPassword {
}
# ============================================================
# CREAR / COMPROBAR USUARIO TÉCNICO
# CREAR / COMPROBAR USUARIO TECNICO
# ============================================================
function Ensure-TechnicalUser {
@@ -497,18 +497,18 @@ function Ensure-TechnicalUser {
New-LocalUser `
-Name $Name `
-Password $password `
-Description "Cuenta técnica de administración" `
-Description "Cuenta tecnica de administracion" `
-AccountNeverExpires `
-PasswordNeverExpires `
-ErrorAction Stop | Out-Null
# Verificación real.
# Verificacion real.
$verifiedUser = Get-LocalUserSafe -Name $Name
if ($null -eq $verifiedUser) {
throw "New-LocalUser terminó pero el usuario '$Name' no existe."
throw "New-LocalUser termino pero el usuario '$Name' no existe."
}
Write-Ok "Usuario '$Name' creado correctamente."
@@ -564,7 +564,7 @@ function Enable-RemoteDesktop {
-Value 0 `
-ErrorAction Stop
# Verificación.
# Verificacion.
$rdpValue = (
Get-ItemProperty `
@@ -578,7 +578,7 @@ function Enable-RemoteDesktop {
throw "Windows sigue teniendo RDP desactivado."
}
Write-Ok "RDP está activado en el registro de Windows."
Write-Ok "RDP esta activado en el registro de Windows."
# --------------------------------------------------------
# SERVICIO
@@ -607,7 +607,7 @@ function Enable-RemoteDesktop {
-ErrorAction Stop
}
# Verificación.
# Verificacion.
$service = Get-Service `
-Name "TermService" `
@@ -615,7 +615,7 @@ function Enable-RemoteDesktop {
if ($service.Status -ne "Running") {
throw "El servicio TermService no está ejecutándose."
throw "El servicio TermService no esta ejecutandose."
}
Write-Ok "Servicio TermService funcionando."
@@ -630,7 +630,7 @@ function Enable-RemoteDesktop {
if ($firewallService.Status -ne "Running") {
Write-Host "El servicio de Firewall no está activo. Iniciándolo..." `
Write-Host "El servicio de Firewall no esta activo. Iniciandolo..." `
-ForegroundColor Yellow
if ($firewallService.StartType -eq "Disabled") {
@@ -684,7 +684,7 @@ function Enable-RemoteDesktop {
Enable-NetFirewallRule `
-ErrorAction Stop
# Verificación REAL de las reglas.
# Verificacion REAL de las reglas.
$enabledRules = @(
Get-RdpFirewallRules |
@@ -741,7 +741,7 @@ function Hide-UserFromLogin {
-ErrorAction Stop |
Out-Null
# Verificación.
# Verificacion.
$value = (
Get-ItemProperty `
@@ -755,16 +755,16 @@ function Hide-UserFromLogin {
throw "No se pudo ocultar '$Username' del login."
}
Write-Ok "'$Username' está oculto de la lista de usuarios."
Write-Ok "'$Username' esta oculto de la lista de usuarios."
}
# ============================================================
# VERIFICACIÓN FINAL
# VERIFICACION FINAL
# ============================================================
function Test-FinalConfiguration {
Write-Step "VERIFICACIÓN FINAL DEL SISTEMA"
Write-Step "VERIFICACION FINAL DEL SISTEMA"
$allOk = $true
@@ -843,7 +843,7 @@ function Test-FinalConfiguration {
}
catch {
Write-ErrorMessage "No se pudo comprobar la configuración RDP."
Write-ErrorMessage "No se pudo comprobar la configuracion RDP."
$allOk = $false
}
@@ -860,7 +860,7 @@ function Test-FinalConfiguration {
if ($service.Status -eq "Running") {
Write-Ok "TermService: EJECUTÁNDOSE"
Write-Ok "TermService: EJECUTANDOSE"
}
else {
@@ -903,7 +903,7 @@ function Test-FinalConfiguration {
}
else {
Write-ErrorMessage "Firewall RDP: LAS REGLAS EXISTEN PERO ESTÁN DESHABILITADAS"
Write-ErrorMessage "Firewall RDP: LAS REGLAS EXISTEN PERO ESTAN DESHABILITADAS"
}
$allOk = $false
@@ -974,7 +974,7 @@ function Test-FinalConfiguration {
}
catch {
Write-ErrorMessage "No se pudo comprobar la ocultación del usuario."
Write-ErrorMessage "No se pudo comprobar la ocultacion del usuario."
$allOk = $false
}
@@ -1011,18 +1011,18 @@ try {
Clear-Host
Write-Log "========== INICIO DE EJECUCIÓN =========="
Write-Log "========== INICIO DE EJECUCION =========="
Write-Log "Windows: $([Environment]::OSVersion.VersionString)"
Write-Log "Usuario: $([Environment]::UserDomainName)\$([Environment]::UserName)"
Write-Log "Elevado (Administrador): $(Test-IsAdministrator)"
Write-Host ""
Write-Host "==================================================" -ForegroundColor Cyan
Write-Host " WINDOWS 10 - CONFIGURACIÓN INICIAL" -ForegroundColor Cyan
Write-Host " WINDOWS 10 - CONFIGURACION INICIAL" -ForegroundColor Cyan
Write-Host "==================================================" -ForegroundColor Cyan
Write-Host ""
Write-Host "Usuario técnico: $Username"
Write-Host "Usuario tecnico: $Username"
Write-Host ""
# --------------------------------------------------------
@@ -1031,7 +1031,7 @@ try {
Ensure-Administrator
Write-Ok "El script se está ejecutando como Administrador."
Write-Ok "El script se esta ejecutando como Administrador."
# --------------------------------------------------------
# 1. COMPROBAR GRUPOS
@@ -1062,7 +1062,7 @@ try {
if (-not $user.Enabled) {
Write-Host "La cuenta está deshabilitada. Habilitándola..." `
Write-Host "La cuenta esta deshabilitada. Habilitandola..." `
-ForegroundColor Yellow
Enable-LocalUser `
@@ -1080,7 +1080,7 @@ try {
}
else {
Write-Ok "Usuario '$Username' está habilitado."
Write-Ok "Usuario '$Username' esta habilitado."
}
# --------------------------------------------------------
@@ -1121,7 +1121,7 @@ try {
-Username $Username
# --------------------------------------------------------
# 8. VERIFICACIÓN FINAL
# 8. VERIFICACION FINAL
# --------------------------------------------------------
$result = Test-FinalConfiguration
@@ -1134,13 +1134,13 @@ try {
if ($result) {
Write-Host "La configuración se ha completado correctamente." `
Write-Host "La configuracion se ha completado correctamente." `
-ForegroundColor Green
Write-Host ""
Write-Host "El script se puede ejecutar de nuevo sin cambiar" `
-ForegroundColor Green
Write-Host "la contraseña del usuario existente." `
Write-Host "la contrasena del usuario existente." `
-ForegroundColor Green
Write-Host ""
@@ -1149,7 +1149,7 @@ try {
}
else {
Write-Host "La configuración NO se ha completado correctamente." `
Write-Host "La configuracion NO se ha completado correctamente." `
-ForegroundColor Red
Write-Host ""
@@ -1185,7 +1185,7 @@ catch {
Write-Host ""
Write-Host "El script se ha detenido para evitar continuar" `
-ForegroundColor Yellow
Write-Host "con una configuración incompleta." `
Write-Host "con una configuracion incompleta." `
-ForegroundColor Yellow
Write-Host ""