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