From 1d7f6274c13beb6862c8ec0c6d7bc4e555a630a7 Mon Sep 17 00:00:00 2001 From: Tu Nombre Date: Thu, 24 Sep 2026 15:53:31 +0200 Subject: [PATCH] Quitando elementos no validos --- setup.ps1 | 612 ++++++++++++++++++++++-------------------------------- 1 file changed, 247 insertions(+), 365 deletions(-) diff --git a/setup.ps1 b/setup.ps1 index 6dfd075..6caf3a1 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -1,4 +1,3 @@ -```powershell #Requires -Version 5.1 <# @@ -6,33 +5,25 @@ Configuración inicial de Windows 10. .DESCRIPTION - Este script configura una cuenta técnica llamada "tecnica" y - habilita Escritorio Remoto. + Configura una cuenta técnica llamada "tecnica" y habilita + Escritorio Remoto. Características: - - Se autoeleva a Administrador. - - Crea el usuario "tecnica" si no existe. - - Solicita la contraseña dos veces al crear el usuario. - - NO cambia la contraseña si el usuario ya existe. - - Añade el usuario al grupo Administradores. + - 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. - Activa Escritorio Remoto. - Configura el Firewall para RDP. - - Añade el usuario al grupo Usuarios de escritorio remoto. - - Oculta el usuario de la pantalla de inicio de sesión. - - Verifica al final que cada configuración está realmente aplicada. - - Devuelve código de salida 0 si todo está correcto. - - Devuelve código de salida 1 si hay algún error. + - Añade "tecnica" al grupo Usuarios de escritorio remoto. + - Oculta "tecnica" de la lista de usuarios del login. + - Verifica el estado real al finalizar. + - Devuelve 0 si todo está correcto. + - Devuelve 1 si hay algún error. .NOTES - Diseñado para Windows 10 / PowerShell 5.1. - - IMPORTANTE: - Ocultar una cuenta de la pantalla de login NO es una medida - de seguridad. La cuenta sigue existiendo. - - Este script NO cambia la configuración de Network Level - Authentication ni abre RDP fuera del Firewall de Windows. + Compatible con Windows 10 / PowerShell 5.1. #> # ============================================================ @@ -48,7 +39,7 @@ $Username = "tecnica" $ErrorActionPreference = "Stop" # ============================================================ -# FUNCIONES AUXILIARES +# FUNCIONES DE SALIDA # ============================================================ function Write-Step { @@ -57,14 +48,9 @@ function Write-Step { ) Write-Host "" - Write-Host "--------------------------------------------------" ` - -ForegroundColor DarkGray - - Write-Host $Message ` - -ForegroundColor Cyan - - Write-Host "--------------------------------------------------" ` - -ForegroundColor DarkGray + Write-Host "==================================================" -ForegroundColor DarkGray + Write-Host $Message -ForegroundColor Cyan + Write-Host "==================================================" -ForegroundColor DarkGray } function Write-Ok { @@ -72,8 +58,7 @@ function Write-Ok { [string]$Message ) - Write-Host "[OK] $Message" ` - -ForegroundColor Green + Write-Host "[OK] $Message" -ForegroundColor Green } function Write-WarningMessage { @@ -81,8 +66,7 @@ function Write-WarningMessage { [string]$Message ) - Write-Host "[AVISO] $Message" ` - -ForegroundColor Yellow + Write-Host "[AVISO] $Message" -ForegroundColor Yellow } function Write-ErrorMessage { @@ -90,8 +74,7 @@ function Write-ErrorMessage { [string]$Message ) - Write-Host "[ERROR] $Message" ` - -ForegroundColor Red + Write-Host "[ERROR] $Message" -ForegroundColor Red } # ============================================================ @@ -120,45 +103,38 @@ function Ensure-Administrator { } Write-Host "" - Write-WarningMessage "Este script necesita permisos de Administrador." - Write-Host "Solicitando elevación..." -ForegroundColor Yellow + Write-WarningMessage "Se necesitan permisos de Administrador." + Write-Host "Solicitando elevación mediante UAC..." -ForegroundColor Yellow Write-Host "" - # Si el script está siendo ejecutado desde un archivo .ps1, - # volvemos a abrir el mismo archivo como Administrador. if (-not $PSCommandPath) { - - Write-ErrorMessage ` - "No se puede determinar la ruta del script." - + Write-ErrorMessage "No se puede determinar la ruta del script." exit 1 } - $arguments = @( - "-NoProfile" - "-ExecutionPolicy" - "Bypass" - "-File" - "`"$PSCommandPath`"" - ) - try { + $quotedScript = '"' + $PSCommandPath + '"' + $process = Start-Process ` -FilePath "powershell.exe" ` - -ArgumentList $arguments ` + -ArgumentList @( + "-NoProfile" + "-ExecutionPolicy" + "Bypass" + "-File" + $quotedScript + ) ` -Verb RunAs ` -Wait ` - -PassThru + -PassThru ` + -ErrorAction Stop - # Propagamos el código de salida de la instancia elevada. exit $process.ExitCode } catch { - Write-ErrorMessage ` - "No se pudo obtener permisos de Administrador." - + Write-ErrorMessage "No se pudo obtener permisos de Administrador." Write-ErrorMessage $_.Exception.Message exit 1 @@ -166,7 +142,7 @@ function Ensure-Administrator { } # ============================================================ -# COMPROBAR EXISTENCIA DEL USUARIO +# OBTENER USUARIO LOCAL # ============================================================ function Get-LocalUserSafe { @@ -177,45 +153,15 @@ function Get-LocalUserSafe { ) try { - - return Get-LocalUser ` - -Name $Name ` - -ErrorAction Stop + return Get-LocalUser -Name $Name -ErrorAction Stop } catch { - return $null } } -# ============================================================ -# COMPROBAR SI UN USUARIO EXISTE -# ============================================================ - -function Test-LocalUserExists { - - param ( - [Parameter(Mandatory)] - [string]$Name - ) - - $user = Get-LocalUserSafe -Name $Name - - return ($null -ne $user) -} - # ============================================================ # OBTENER GRUPO LOCAL MEDIANTE SID -# -# Los grupos integrados de Windows tienen SIDs conocidos: -# -# Administradores: -# S-1-5-32-544 -# -# Usuarios de escritorio remoto: -# S-1-5-32-555 -# -# De esta forma no dependemos del idioma de Windows. # ============================================================ function Get-LocalGroupBySid { @@ -225,29 +171,21 @@ function Get-LocalGroupBySid { [string]$Sid ) - try { + $group = Get-LocalGroup -ErrorAction Stop | + Where-Object { + $_.SID.Value -eq $Sid + } | + Select-Object -First 1 - $group = Get-LocalGroup | - Where-Object { - $_.SID.Value -eq $Sid - } | - Select-Object -First 1 - - if ($null -eq $group) { - - throw "No se encontró el grupo con SID $Sid." - } - - return $group + if ($null -eq $group) { + throw "No se encontró el grupo con SID $Sid." } - catch { - throw $_ - } + return $group } # ============================================================ -# COMPROBAR SI UN USUARIO ESTÁ EN UN GRUPO +# COMPROBAR USUARIO EN GRUPO # ============================================================ function Test-UserInGroup { @@ -257,7 +195,7 @@ function Test-UserInGroup { [string]$Username, [Parameter(Mandatory)] - [Microsoft.PowerShell.Commands.LocalGroup]$Group + $Group ) try { @@ -268,16 +206,13 @@ function Test-UserInGroup { foreach ($member in $members) { - # El miembro normalmente aparece como: - # - # EQUIPO\tecnica - # - # Comparamos la parte final. + $memberName = $member.Name - $memberName = $member.Name.Split("\")[-1] + if ($memberName -match "\\") { + $memberName = $memberName.Split("\")[-1] + } if ($memberName -ieq $Username) { - return $true } } @@ -291,7 +226,7 @@ function Test-UserInGroup { } # ============================================================ -# AÑADIR USUARIO A GRUPO DE FORMA IDEMPOTENTE +# AÑADIR USUARIO A GRUPO # ============================================================ function Ensure-UserInGroup { @@ -301,21 +236,18 @@ function Ensure-UserInGroup { [string]$Username, [Parameter(Mandatory)] - [Microsoft.PowerShell.Commands.LocalGroup]$Group + $Group ) - if (Test-UserInGroup ` - -Username $Username ` - -Group $Group) { + if (Test-UserInGroup -Username $Username -Group $Group) { - Write-Ok ` - "'$Username' ya pertenece a '$($Group.Name)'." + Write-Ok "'$Username' ya pertenece a '$($Group.Name)'." return } - Write-Host ` - "Añadiendo '$Username' a '$($Group.Name)'..." ` + Write-Host "" + Write-Host "Añadiendo '$Username' a '$($Group.Name)'..." ` -ForegroundColor Cyan Add-LocalGroupMember ` @@ -323,24 +255,18 @@ function Ensure-UserInGroup { -Member $Username ` -ErrorAction Stop - # VERIFICACIÓN INMEDIATA + # Verificación inmediata. - if (-not ( - Test-UserInGroup ` - -Username $Username ` - -Group $Group - )) { + if (-not (Test-UserInGroup -Username $Username -Group $Group)) { - throw ` - "El usuario no aparece en el grupo después de añadirlo." + throw "El usuario '$Username' no aparece en '$($Group.Name)' después de añadirlo." } - Write-Ok ` - "'$Username' pertenece ahora a '$($Group.Name)'." + Write-Ok "'$Username' pertenece ahora a '$($Group.Name)'." } # ============================================================ -# PEDIR CONTRASEÑA Y CONFIRMARLA +# PEDIR Y CONFIRMAR CONTRASEÑA # ============================================================ function Read-ConfirmedPassword { @@ -348,55 +274,47 @@ function Read-ConfirmedPassword { while ($true) { Write-Host "" - Write-Host ` - "Introduce la contraseña para '$Username'." ` + Write-Host "Introduce la contraseña para '$Username'." ` -ForegroundColor Cyan - $password1 = Read-Host ` - "Contraseña" ` - -AsSecureString + $password1 = Read-Host "Contraseña" -AsSecureString - $password2 = Read-Host ` - "Repite la contraseña" ` - -AsSecureString + $password2 = Read-Host "Repite la contraseña" -AsSecureString $ptr1 = [IntPtr]::Zero $ptr2 = [IntPtr]::Zero + $plain1 = $null + $plain2 = $null + try { - $ptr1 = - [Runtime.InteropServices.Marshal]::SecureStringToBSTR( - $password1 - ) + $ptr1 = [Runtime.InteropServices.Marshal]::SecureStringToBSTR( + $password1 + ) - $ptr2 = - [Runtime.InteropServices.Marshal]::SecureStringToBSTR( - $password2 - ) + $ptr2 = [Runtime.InteropServices.Marshal]::SecureStringToBSTR( + $password2 + ) - $plain1 = - [Runtime.InteropServices.Marshal]::PtrToStringBSTR( - $ptr1 - ) + $plain1 = [Runtime.InteropServices.Marshal]::PtrToStringBSTR( + $ptr1 + ) - $plain2 = - [Runtime.InteropServices.Marshal]::PtrToStringBSTR( - $ptr2 - ) + $plain2 = [Runtime.InteropServices.Marshal]::PtrToStringBSTR( + $ptr2 + ) if ([string]::IsNullOrWhiteSpace($plain1)) { - Write-ErrorMessage ` - "La contraseña no puede estar vacía." + Write-ErrorMessage "La contraseña no puede estar vacía." continue } if ($plain1 -cne $plain2) { - Write-ErrorMessage ` - "Las contraseñas no coinciden." + Write-ErrorMessage "Las contraseñas no coinciden." continue } @@ -407,16 +325,12 @@ function Read-ConfirmedPassword { if ($ptr1 -ne [IntPtr]::Zero) { - [Runtime.InteropServices.Marshal]::ZeroFreeBSTR( - $ptr1 - ) + [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr1) } if ($ptr2 -ne [IntPtr]::Zero) { - [Runtime.InteropServices.Marshal]::ZeroFreeBSTR( - $ptr2 - ) + [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ptr2) } $plain1 = $null @@ -426,7 +340,7 @@ function Read-ConfirmedPassword { } # ============================================================ -# CREAR USUARIO +# CREAR / COMPROBAR USUARIO TÉCNICO # ============================================================ function Ensure-TechnicalUser { @@ -444,8 +358,7 @@ function Ensure-TechnicalUser { if ($null -ne $existingUser) { - Write-Ok ` - "El usuario '$Name' ya existe." + Write-Ok "El usuario '$Name' ya existe." return $existingUser } @@ -455,46 +368,41 @@ function Ensure-TechnicalUser { # -------------------------------------------------------- Write-Host "" - Write-Host ` - "El usuario '$Name' no existe." ` + Write-Host "El usuario '$Name' no existe." ` -ForegroundColor Yellow $password = Read-ConfirmedPassword Write-Host "" - Write-Host ` - "Creando usuario '$Name'..." ` + Write-Host "Creando usuario '$Name'..." ` -ForegroundColor Cyan try { - $newUser = New-LocalUser ` + New-LocalUser ` -Name $Name ` -Password $password ` -Description "Cuenta técnica de administración" ` -AccountNeverExpires ` - -PasswordNeverExpires:$true ` - -ErrorAction Stop + -PasswordNeverExpires ` + -ErrorAction Stop | Out-Null - # VERIFICACIÓN INMEDIATA + # Verificación real. $verifiedUser = Get-LocalUserSafe -Name $Name if ($null -eq $verifiedUser) { - throw ` - "New-LocalUser terminó correctamente pero el usuario no aparece." + throw "New-LocalUser terminó pero el usuario '$Name' no existe." } - Write-Ok ` - "Usuario '$Name' creado correctamente." + Write-Ok "Usuario '$Name' creado correctamente." return $verifiedUser } catch { - throw ` - "No se pudo crear el usuario '$Name': $($_.Exception.Message)" + throw "No se pudo crear el usuario '$Name': $($_.Exception.Message)" } } @@ -505,17 +413,11 @@ function Ensure-TechnicalUser { function Enable-RemoteDesktop { Write-Host "" - Write-Host ` - "Activando Escritorio remoto..." ` + Write-Host "Activando Escritorio remoto..." ` -ForegroundColor Cyan # -------------------------------------------------------- - # REGISTRO DE WINDOWS - # - # fDenyTSConnections: - # - # 1 = RDP desactivado - # 0 = RDP activado + # REGISTRO # -------------------------------------------------------- $rdpRegistryPath = @@ -539,30 +441,26 @@ function Enable-RemoteDesktop { if ($rdpValue -ne 0) { - throw ` - "No se pudo activar RDP en el registro." + throw "Windows sigue teniendo RDP desactivado." } - Write-Ok ` - "Windows tiene Escritorio remoto activado." + Write-Ok "RDP está activado en el registro de Windows." # -------------------------------------------------------- - # SERVICIO TermService + # SERVICIO # -------------------------------------------------------- $service = Get-Service ` -Name "TermService" ` -ErrorAction Stop - # No necesitamos forzar "Automático". - # Manual es suficiente y Windows lo inicia cuando corresponde. + if ($service.StartType -ne "Manual") { - Set-Service ` - -Name "TermService" ` - -StartupType Manual ` - -ErrorAction Stop - - # Arrancamos el servicio si está parado. + Set-Service ` + -Name "TermService" ` + -StartupType Manual ` + -ErrorAction Stop + } $service = Get-Service ` -Name "TermService" ` @@ -583,12 +481,10 @@ function Enable-RemoteDesktop { if ($service.Status -ne "Running") { - throw ` - "El servicio TermService no está ejecutándose." + throw "El servicio TermService no está ejecutándose." } - Write-Ok ` - "Servicio de Escritorio remoto funcionando." + Write-Ok "Servicio TermService funcionando." # -------------------------------------------------------- # FIREWALL @@ -597,40 +493,41 @@ function Enable-RemoteDesktop { $firewallRules = Get-NetFirewallRule ` -ErrorAction Stop | Where-Object { - $_.DisplayGroup -eq "Remote Desktop" -or $_.DisplayGroup -eq "Escritorio remoto" } if ($null -eq $firewallRules) { - throw ` - "No se encontraron las reglas de Firewall de Escritorio remoto." + throw "No se encontraron las reglas de Firewall de Escritorio remoto." } $firewallRules | Enable-NetFirewallRule ` -ErrorAction Stop - # Verificar que al menos una regla está habilitada. + # Verificación REAL de las reglas. - $enabledRules = $firewallRules | + $enabledRules = Get-NetFirewallRule ` + -ErrorAction Stop | Where-Object { + ( + $_.DisplayGroup -eq "Remote Desktop" -or + $_.DisplayGroup -eq "Escritorio remoto" + ) -and $_.Enabled -eq "True" } if ($null -eq $enabledRules) { - throw ` - "No se pudo habilitar ninguna regla de Firewall de RDP." + throw "No hay ninguna regla de Firewall de RDP habilitada." } - Write-Ok ` - "Firewall de Escritorio remoto configurado." + Write-Ok "Firewall de Escritorio remoto habilitado." } # ============================================================ -# OCULTAR USUARIO DEL LOGIN +# OCULTAR USUARIO DE LA PANTALLA DE LOGIN # ============================================================ function Hide-UserFromLogin { @@ -641,8 +538,7 @@ function Hide-UserFromLogin { ) Write-Host "" - Write-Host ` - "Ocultando '$Username' de la pantalla de login..." ` + Write-Host "Ocultando '$Username' de la pantalla de login..." ` -ForegroundColor Cyan $registryPath = @@ -659,7 +555,7 @@ function Hide-UserFromLogin { Out-Null } - # 0 = no mostrar el usuario en la lista. + # 0 = ocultar usuario. New-ItemProperty ` -Path $registryPath ` @@ -670,7 +566,7 @@ function Hide-UserFromLogin { -ErrorAction Stop | Out-Null - # VERIFICACIÓN + # Verificación. $value = ( Get-ItemProperty ` @@ -681,22 +577,19 @@ function Hide-UserFromLogin { if ($value -ne 0) { - throw ` - "No se pudo ocultar '$Username' de la pantalla de login." + throw "No se pudo ocultar '$Username' del login." } - Write-Ok ` - "'$Username' está oculto de la lista de usuarios del login." + Write-Ok "'$Username' está oculto de la lista de usuarios." } # ============================================================ -# VERIFICACIÓN FINAL COMPLETA +# VERIFICACIÓN FINAL # ============================================================ function Test-FinalConfiguration { - Write-Step ` - "VERIFICACIÓN FINAL DEL SISTEMA" + Write-Step "VERIFICACIÓN FINAL DEL SISTEMA" $allOk = $true @@ -713,11 +606,12 @@ function Test-FinalConfiguration { else { Write-ErrorMessage "Usuario '$Username': NO EXISTE" + $allOk = $false } # -------------------------------------------------------- - # GRUPO ADMINISTRADORES + # ADMINISTRADORES # -------------------------------------------------------- try { @@ -729,27 +623,24 @@ function Test-FinalConfiguration { -Username $Username ` -Group $administratorsGroup) { - Write-Ok ` - "Administrador: SI" + Write-Ok "Administrador: SI" } else { - Write-ErrorMessage ` - "Administrador: NO" + Write-ErrorMessage "Administrador: NO" $allOk = $false } } catch { - Write-ErrorMessage ` - "No se pudo comprobar el grupo Administradores." + Write-ErrorMessage "No se pudo comprobar el grupo Administradores." $allOk = $false } # -------------------------------------------------------- - # RDP + # RDP REGISTRO # -------------------------------------------------------- try { @@ -766,27 +657,24 @@ function Test-FinalConfiguration { if ($rdpValue -eq 0) { - Write-Ok ` - "Escritorio remoto de Windows: ACTIVADO" + Write-Ok "Escritorio remoto de Windows: ACTIVADO" } else { - Write-ErrorMessage ` - "Escritorio remoto de Windows: DESACTIVADO" + Write-ErrorMessage "Escritorio remoto de Windows: DESACTIVADO" $allOk = $false } } catch { - Write-ErrorMessage ` - "No se pudo comprobar la configuración RDP." + Write-ErrorMessage "No se pudo comprobar la configuración RDP." $allOk = $false } # -------------------------------------------------------- - # SERVICIO RDP + # SERVICIO # -------------------------------------------------------- try { @@ -797,27 +685,58 @@ function Test-FinalConfiguration { if ($service.Status -eq "Running") { - Write-Ok ` - "Servicio TermService: EJECUTÁNDOSE" + Write-Ok "TermService: EJECUTÁNDOSE" } else { - Write-ErrorMessage ` - "Servicio TermService: $($service.Status)" + Write-ErrorMessage "TermService: $($service.Status)" $allOk = $false } } catch { - Write-ErrorMessage ` - "No se pudo comprobar TermService." + Write-ErrorMessage "No se pudo comprobar TermService." $allOk = $false } # -------------------------------------------------------- - # USUARIO EN GRUPO RDP + # FIREWALL + # -------------------------------------------------------- + + try { + + $enabledRules = Get-NetFirewallRule ` + -ErrorAction Stop | + Where-Object { + ( + $_.DisplayGroup -eq "Remote Desktop" -or + $_.DisplayGroup -eq "Escritorio remoto" + ) -and + $_.Enabled -eq "True" + } + + if ($null -ne $enabledRules) { + + Write-Ok "Firewall RDP: HABILITADO" + } + else { + + Write-ErrorMessage "Firewall RDP: NO HABILITADO" + + $allOk = $false + } + } + catch { + + Write-ErrorMessage "No se pudo comprobar el Firewall de RDP." + + $allOk = $false + } + + # -------------------------------------------------------- + # GRUPO RDP # -------------------------------------------------------- try { @@ -829,21 +748,18 @@ function Test-FinalConfiguration { -Username $Username ` -Group $rdpGroup) { - Write-Ok ` - "Usuario autorizado para RDP: SI" + Write-Ok "Usuario autorizado para RDP: SI" } else { - Write-ErrorMessage ` - "Usuario autorizado para RDP: NO" + Write-ErrorMessage "Usuario autorizado para RDP: NO" $allOk = $false } } catch { - Write-ErrorMessage ` - "No se pudo comprobar el grupo de usuarios RDP." + Write-ErrorMessage "No se pudo comprobar el grupo RDP." $allOk = $false } @@ -866,21 +782,18 @@ function Test-FinalConfiguration { if ($hiddenValue -eq 0) { - Write-Ok ` - "Usuario oculto del login: SI" + Write-Ok "Usuario oculto del login: SI" } else { - Write-ErrorMessage ` - "Usuario oculto del login: NO" + Write-ErrorMessage "Usuario oculto del login: NO" $allOk = $false } } catch { - Write-ErrorMessage ` - "No se pudo comprobar la ocultación del usuario." + Write-ErrorMessage "No se pudo comprobar la ocultación del usuario." $allOk = $false } @@ -893,33 +806,17 @@ function Test-FinalConfiguration { if ($allOk) { - Write-Host ` - "==================================================" ` - -ForegroundColor Green - - Write-Host ` - " TODO CORRECTO" ` - -ForegroundColor Green - - Write-Host ` - "==================================================" ` - -ForegroundColor Green + Write-Host "==================================================" -ForegroundColor Green + Write-Host " TODO CORRECTO" -ForegroundColor Green + Write-Host "==================================================" -ForegroundColor Green return $true } else { - Write-Host ` - "==================================================" ` - -ForegroundColor Red - - Write-Host ` - " HAY ERRORES" ` - -ForegroundColor Red - - Write-Host ` - "==================================================" ` - -ForegroundColor Red + Write-Host "==================================================" -ForegroundColor Red + Write-Host " HAY ERRORES" -ForegroundColor Red + Write-Host "==================================================" -ForegroundColor Red return $false } @@ -934,19 +831,11 @@ try { Clear-Host Write-Host "" - Write-Host ` - "==================================================" ` - -ForegroundColor Cyan - - Write-Host ` - " WINDOWS 10 - CONFIGURACIÓN INICIAL" ` - -ForegroundColor Cyan - - Write-Host ` - "==================================================" ` - -ForegroundColor Cyan - + Write-Host "==================================================" -ForegroundColor Cyan + Write-Host " WINDOWS 10 - CONFIGURACIÓN INICIAL" -ForegroundColor Cyan + Write-Host "==================================================" -ForegroundColor Cyan Write-Host "" + Write-Host "Usuario técnico: $Username" Write-Host "" @@ -956,15 +845,13 @@ try { Ensure-Administrator - Write-Ok ` - "El script se está ejecutando como Administrador." + Write-Ok "El script se está ejecutando como Administrador." # -------------------------------------------------------- - # 1. OBTENER GRUPOS + # 1. COMPROBAR GRUPOS # -------------------------------------------------------- - Write-Step ` - "COMPROBANDO GRUPOS LOCALES" + Write-Step "COMPROBANDO GRUPOS LOCALES" $administratorsGroup = Get-LocalGroupBySid "S-1-5-32-544" @@ -972,85 +859,102 @@ try { $rdpGroup = Get-LocalGroupBySid "S-1-5-32-555" - Write-Ok ` - "Grupo Administradores: $($administratorsGroup.Name)" - - Write-Ok ` - "Grupo Escritorio remoto: $($rdpGroup.Name)" + Write-Ok "Grupo Administradores: $($administratorsGroup.Name)" + Write-Ok "Grupo Escritorio remoto: $($rdpGroup.Name)" # -------------------------------------------------------- - # 2. CREAR USUARIO + # 2. CREAR / COMPROBAR USUARIO # -------------------------------------------------------- - Write-Step ` - "CREANDO / COMPROBANDO USUARIO" + Write-Step "CREANDO / COMPROBANDO USUARIO" - Ensure-TechnicalUser ` - -Name $Username | - Out-Null + $user = Ensure-TechnicalUser -Name $Username # -------------------------------------------------------- - # 3. ADMINISTRADORES + # 3. ASEGURAR USUARIO HABILITADO # -------------------------------------------------------- - Write-Step ` - "CONFIGURANDO PRIVILEGIOS DE ADMINISTRADOR" + if (-not $user.Enabled) { + + Write-Host "La cuenta está deshabilitada. Habilitándola..." ` + -ForegroundColor Yellow + + Enable-LocalUser ` + -Name $Username ` + -ErrorAction Stop + + $user = Get-LocalUserSafe -Name $Username + + if ($null -eq $user -or -not $user.Enabled) { + + throw "No se pudo habilitar el usuario '$Username'." + } + + Write-Ok "Usuario '$Username' habilitado." + } + else { + + Write-Ok "Usuario '$Username' está habilitado." + } + + # -------------------------------------------------------- + # 4. ADMINISTRADORES + # -------------------------------------------------------- + + Write-Step "CONFIGURANDO PRIVILEGIOS DE ADMINISTRADOR" Ensure-UserInGroup ` -Username $Username ` -Group $administratorsGroup # -------------------------------------------------------- - # 4. ESCRITORIO REMOTO + # 5. ESCRITORIO REMOTO # -------------------------------------------------------- - Write-Step ` - "ACTIVANDO ESCRITORIO REMOTO" + Write-Step "ACTIVANDO ESCRITORIO REMOTO" Enable-RemoteDesktop # -------------------------------------------------------- - # 5. AUTORIZAR USUARIO PARA RDP + # 6. USUARIO AUTORIZADO PARA RDP # -------------------------------------------------------- - Write-Step ` - "AUTORIZANDO USUARIO PARA ESCRITORIO REMOTO" + Write-Step "AUTORIZANDO USUARIO PARA ESCRITORIO REMOTO" Ensure-UserInGroup ` -Username $Username ` -Group $rdpGroup # -------------------------------------------------------- - # 6. OCULTAR USUARIO + # 7. OCULTAR USUARIO # -------------------------------------------------------- - Write-Step ` - "OCULTANDO USUARIO DE LA PANTALLA DE LOGIN" + Write-Step "OCULTANDO USUARIO DE LA PANTALLA DE LOGIN" Hide-UserFromLogin ` -Username $Username # -------------------------------------------------------- - # 7. VERIFICACIÓN FINAL + # 8. VERIFICACIÓN FINAL # -------------------------------------------------------- $result = Test-FinalConfiguration # -------------------------------------------------------- - # SALIDA + # RESULTADO # -------------------------------------------------------- Write-Host "" if ($result) { - Write-Host ` - "La configuración se ha completado correctamente." ` + Write-Host "La configuración se ha completado correctamente." ` -ForegroundColor Green Write-Host "" - Write-Host ` - "Puedes volver a ejecutar este script sin problema." ` + Write-Host "El script se puede ejecutar de nuevo sin cambiar" ` + -ForegroundColor Green + Write-Host "la contraseña del usuario existente." ` -ForegroundColor Green Write-Host "" @@ -1059,14 +963,11 @@ try { } else { - Write-Host "" - Write-Host ` - "La configuración NO se ha completado correctamente." ` + Write-Host "La configuración NO se ha completado correctamente." ` -ForegroundColor Red Write-Host "" - Write-Host ` - "Revisa los errores mostrados arriba." ` + Write-Host "Revisa los errores mostrados anteriormente." ` -ForegroundColor Yellow Write-Host "" @@ -1076,40 +977,21 @@ try { } catch { - # ======================================================== - # ERROR NO CONTROLADO - # ======================================================== - Write-Host "" - Write-Host ` - "==================================================" ` - -ForegroundColor Red - - Write-Host ` - " ERROR FATAL" ` - -ForegroundColor Red - - Write-Host ` - "==================================================" ` - -ForegroundColor Red - + Write-Host "==================================================" -ForegroundColor Red + Write-Host " ERROR FATAL" -ForegroundColor Red + Write-Host "==================================================" -ForegroundColor Red Write-Host "" - Write-ErrorMessage ` - $_.Exception.Message + Write-ErrorMessage $_.Exception.Message Write-Host "" - - Write-Host ` - "El script se ha detenido para evitar continuar" ` + Write-Host "El script se ha detenido para evitar continuar" ` -ForegroundColor Yellow - - Write-Host ` - "con una configuración incompleta." ` + Write-Host "con una configuración incompleta." ` -ForegroundColor Yellow Write-Host "" exit 1 -} -``` +} \ No newline at end of file