Open
This commit is contained in:
@@ -14,6 +14,8 @@ echo ============================================================
|
|||||||
echo El instalador ha terminado.
|
echo El instalador ha terminado.
|
||||||
echo ============================================================
|
echo ============================================================
|
||||||
echo.
|
echo.
|
||||||
|
echo Codigo de salida: %errorlevel%
|
||||||
|
echo.
|
||||||
|
|
||||||
if errorlevel 1 (
|
if errorlevel 1 (
|
||||||
echo ERROR: el instalador ha terminado con errores.
|
echo ERROR: el instalador ha terminado con errores.
|
||||||
|
|||||||
257
setup.ps1
257
setup.ps1
@@ -19,6 +19,7 @@
|
|||||||
- Añade "tecnica" al grupo Usuarios de escritorio remoto.
|
- Añade "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.
|
||||||
- Devuelve 0 si todo está correcto.
|
- Devuelve 0 si todo está correcto.
|
||||||
- Devuelve 1 si hay algún error.
|
- Devuelve 1 si hay algún error.
|
||||||
|
|
||||||
@@ -32,6 +33,9 @@
|
|||||||
|
|
||||||
$Username = "tecnica"
|
$Username = "tecnica"
|
||||||
|
|
||||||
|
# Ruta del log de diagnóstico.
|
||||||
|
$LogPath = Join-Path $env:TEMP "crb-setup.log"
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# CONFIGURACIÓN DE ERRORES
|
# CONFIGURACIÓN DE ERRORES
|
||||||
# ============================================================
|
# ============================================================
|
||||||
@@ -51,6 +55,8 @@ function Write-Step {
|
|||||||
Write-Host "==================================================" -ForegroundColor DarkGray
|
Write-Host "==================================================" -ForegroundColor DarkGray
|
||||||
Write-Host $Message -ForegroundColor Cyan
|
Write-Host $Message -ForegroundColor Cyan
|
||||||
Write-Host "==================================================" -ForegroundColor DarkGray
|
Write-Host "==================================================" -ForegroundColor DarkGray
|
||||||
|
|
||||||
|
Write-Log "[PASO] $Message"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Write-Ok {
|
function Write-Ok {
|
||||||
@@ -59,6 +65,8 @@ function Write-Ok {
|
|||||||
)
|
)
|
||||||
|
|
||||||
Write-Host "[OK] $Message" -ForegroundColor Green
|
Write-Host "[OK] $Message" -ForegroundColor Green
|
||||||
|
|
||||||
|
Write-Log "[OK] $Message"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Write-WarningMessage {
|
function Write-WarningMessage {
|
||||||
@@ -67,6 +75,8 @@ function Write-WarningMessage {
|
|||||||
)
|
)
|
||||||
|
|
||||||
Write-Host "[AVISO] $Message" -ForegroundColor Yellow
|
Write-Host "[AVISO] $Message" -ForegroundColor Yellow
|
||||||
|
|
||||||
|
Write-Log "[AVISO] $Message"
|
||||||
}
|
}
|
||||||
|
|
||||||
function Write-ErrorMessage {
|
function Write-ErrorMessage {
|
||||||
@@ -75,6 +85,58 @@ function Write-ErrorMessage {
|
|||||||
)
|
)
|
||||||
|
|
||||||
Write-Host "[ERROR] $Message" -ForegroundColor Red
|
Write-Host "[ERROR] $Message" -ForegroundColor Red
|
||||||
|
|
||||||
|
Write-Log "[ERROR] $Message"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ESCRIBIR EN LOG
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
function Write-Log {
|
||||||
|
|
||||||
|
param (
|
||||||
|
[string]$Message
|
||||||
|
)
|
||||||
|
|
||||||
|
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
Add-Content `
|
||||||
|
-LiteralPath $LogPath `
|
||||||
|
-Value "$timestamp $Message" `
|
||||||
|
-Encoding UTF8 `
|
||||||
|
-ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
# El log nunca debe interrumpir la ejecución del script.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# OBTENER MENSAJE COMPLETO DE UNA EXCEPCIÓN
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
function Get-ExceptionMessage {
|
||||||
|
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[System.Exception]$Exception
|
||||||
|
)
|
||||||
|
|
||||||
|
$parts = New-Object System.Collections.Generic.List[string]
|
||||||
|
|
||||||
|
$current = $Exception
|
||||||
|
|
||||||
|
while ($null -ne $current) {
|
||||||
|
|
||||||
|
$parts.Add($current.Message)
|
||||||
|
|
||||||
|
$current = $current.InnerException
|
||||||
|
}
|
||||||
|
|
||||||
|
return ($parts -join " << ")
|
||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
@@ -112,9 +174,48 @@ function Ensure-Administrator {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# --------------------------------------------------------
|
||||||
|
# ELEVACIÓN DESDE RUTA DE RED (UNC)
|
||||||
|
# --------------------------------------------------------
|
||||||
|
# El proceso elevado puede perder el acceso a la carpeta de
|
||||||
|
# red (\\servidor\...). Para evitarlo, se copia el script
|
||||||
|
# a %TEMP% y se eleva ejecutando la copia local.
|
||||||
|
|
||||||
|
$scriptPath = $PSCommandPath
|
||||||
|
$tempCopy = $null
|
||||||
|
|
||||||
|
if ($scriptPath -like "\\*") {
|
||||||
|
|
||||||
|
Write-WarningMessage "El script está en una ruta de red (UNC)."
|
||||||
|
Write-Host "Copiando a la carpeta temporal para poder elevarse..." `
|
||||||
|
-ForegroundColor Yellow
|
||||||
|
|
||||||
|
$tempCopy = Join-Path $env:TEMP (
|
||||||
|
"crb-setup-" + [guid]::NewGuid().ToString("N") + ".ps1"
|
||||||
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$quotedScript = '"' + $PSCommandPath + '"'
|
Copy-Item `
|
||||||
|
-LiteralPath $PSCommandPath `
|
||||||
|
-Destination $tempCopy `
|
||||||
|
-Force `
|
||||||
|
-ErrorAction Stop
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
|
||||||
|
Write-ErrorMessage "No se pudo copiar el script a la carpeta temporal."
|
||||||
|
Write-ErrorMessage $_.Exception.Message
|
||||||
|
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$scriptPath = $tempCopy
|
||||||
|
}
|
||||||
|
|
||||||
|
$quotedScript = '"' + $scriptPath + '"'
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
$process = Start-Process `
|
$process = Start-Process `
|
||||||
-FilePath "powershell.exe" `
|
-FilePath "powershell.exe" `
|
||||||
@@ -129,16 +230,30 @@ function Ensure-Administrator {
|
|||||||
-Wait `
|
-Wait `
|
||||||
-PassThru `
|
-PassThru `
|
||||||
-ErrorAction Stop
|
-ErrorAction Stop
|
||||||
|
|
||||||
exit $process.ExitCode
|
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
||||||
|
if ($tempCopy) {
|
||||||
|
Remove-Item `
|
||||||
|
-LiteralPath $tempCopy `
|
||||||
|
-Force `
|
||||||
|
-ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
|
||||||
Write-ErrorMessage "No se pudo obtener permisos de Administrador."
|
Write-ErrorMessage "No se pudo obtener permisos de Administrador."
|
||||||
Write-ErrorMessage $_.Exception.Message
|
Write-ErrorMessage $_.Exception.Message
|
||||||
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($tempCopy) {
|
||||||
|
Remove-Item `
|
||||||
|
-LiteralPath $tempCopy `
|
||||||
|
-Force `
|
||||||
|
-ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
|
||||||
|
exit $process.ExitCode
|
||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
@@ -406,6 +521,25 @@ function Ensure-TechnicalUser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# OBTENER REGLAS DE FIREWALL DE ESCRITORIO REMOTO
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
function Get-RdpFirewallRules {
|
||||||
|
|
||||||
|
$rdpGroupNames = @("Remote Desktop", "Escritorio remoto")
|
||||||
|
|
||||||
|
$rules = @(
|
||||||
|
Get-NetFirewallRule `
|
||||||
|
-ErrorAction Stop |
|
||||||
|
Where-Object {
|
||||||
|
$rdpGroupNames -contains $_.DisplayGroup
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return $rules
|
||||||
|
}
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# ACTIVAR ESCRITORIO REMOTO
|
# ACTIVAR ESCRITORIO REMOTO
|
||||||
# ============================================================
|
# ============================================================
|
||||||
@@ -486,39 +620,80 @@ function Enable-RemoteDesktop {
|
|||||||
|
|
||||||
Write-Ok "Servicio TermService funcionando."
|
Write-Ok "Servicio TermService funcionando."
|
||||||
|
|
||||||
|
# --------------------------------------------------------
|
||||||
|
# SERVICIO DE FIREWALL
|
||||||
|
# --------------------------------------------------------
|
||||||
|
|
||||||
|
$firewallService = Get-Service `
|
||||||
|
-Name "mpssvc" `
|
||||||
|
-ErrorAction Stop
|
||||||
|
|
||||||
|
if ($firewallService.Status -ne "Running") {
|
||||||
|
|
||||||
|
Write-Host "El servicio de Firewall no está activo. Iniciándolo..." `
|
||||||
|
-ForegroundColor Yellow
|
||||||
|
|
||||||
|
if ($firewallService.StartType -eq "Disabled") {
|
||||||
|
|
||||||
|
Set-Service `
|
||||||
|
-Name "mpssvc" `
|
||||||
|
-StartupType Automatic `
|
||||||
|
-ErrorAction Stop
|
||||||
|
}
|
||||||
|
|
||||||
|
Start-Service `
|
||||||
|
-Name "mpssvc" `
|
||||||
|
-ErrorAction Stop
|
||||||
|
|
||||||
|
$firewallService = Get-Service `
|
||||||
|
-Name "mpssvc" `
|
||||||
|
-ErrorAction Stop
|
||||||
|
|
||||||
|
if ($firewallService.Status -ne "Running") {
|
||||||
|
|
||||||
|
throw "No se pudo iniciar el servicio de Firewall (mpssvc)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Ok "Servicio de Firewall de Windows activo."
|
||||||
|
|
||||||
# --------------------------------------------------------
|
# --------------------------------------------------------
|
||||||
# FIREWALL
|
# FIREWALL
|
||||||
# --------------------------------------------------------
|
# --------------------------------------------------------
|
||||||
|
|
||||||
$firewallRules = Get-NetFirewallRule `
|
$rules = Get-RdpFirewallRules
|
||||||
-ErrorAction Stop |
|
|
||||||
Where-Object {
|
if ($rules.Count -eq 0) {
|
||||||
$_.DisplayGroup -eq "Remote Desktop" -or
|
|
||||||
$_.DisplayGroup -eq "Escritorio remoto"
|
Write-Host "No se hallaron reglas RDP por grupo. Probando con netsh..." `
|
||||||
|
-ForegroundColor Yellow
|
||||||
|
|
||||||
|
& netsh.exe advfirewall firewall set rule group="Remote Desktop" new enable=yes | Out-Null
|
||||||
|
|
||||||
|
& netsh.exe advfirewall firewall set rule group="Escritorio remoto" new enable=yes | Out-Null
|
||||||
|
|
||||||
|
$rules = Get-RdpFirewallRules
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($null -eq $firewallRules) {
|
if ($rules.Count -eq 0) {
|
||||||
|
|
||||||
throw "No se encontraron las reglas de Firewall de Escritorio remoto."
|
throw "No se encontraron reglas de Firewall de Escritorio remoto (grupo 'Remote Desktop'/'Escritorio remoto')."
|
||||||
}
|
}
|
||||||
|
|
||||||
$firewallRules |
|
$rules |
|
||||||
Enable-NetFirewallRule `
|
Enable-NetFirewallRule `
|
||||||
-ErrorAction Stop
|
-ErrorAction Stop
|
||||||
|
|
||||||
# Verificación REAL de las reglas.
|
# Verificación REAL de las reglas.
|
||||||
|
|
||||||
$enabledRules = Get-NetFirewallRule `
|
$enabledRules = @(
|
||||||
-ErrorAction Stop |
|
Get-RdpFirewallRules |
|
||||||
Where-Object {
|
Where-Object {
|
||||||
(
|
|
||||||
$_.DisplayGroup -eq "Remote Desktop" -or
|
|
||||||
$_.DisplayGroup -eq "Escritorio remoto"
|
|
||||||
) -and
|
|
||||||
$_.Enabled -eq "True"
|
$_.Enabled -eq "True"
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
if ($null -eq $enabledRules) {
|
if ($enabledRules.Count -eq 0) {
|
||||||
|
|
||||||
throw "No hay ninguna regla de Firewall de RDP habilitada."
|
throw "No hay ninguna regla de Firewall de RDP habilitada."
|
||||||
}
|
}
|
||||||
@@ -707,30 +882,36 @@ function Test-FinalConfiguration {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$enabledRules = Get-NetFirewallRule `
|
$enabledRules = @(
|
||||||
-ErrorAction Stop |
|
Get-RdpFirewallRules |
|
||||||
Where-Object {
|
Where-Object {
|
||||||
(
|
|
||||||
$_.DisplayGroup -eq "Remote Desktop" -or
|
|
||||||
$_.DisplayGroup -eq "Escritorio remoto"
|
|
||||||
) -and
|
|
||||||
$_.Enabled -eq "True"
|
$_.Enabled -eq "True"
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
if ($null -ne $enabledRules) {
|
if ($enabledRules.Count -gt 0) {
|
||||||
|
|
||||||
Write-Ok "Firewall RDP: HABILITADO"
|
Write-Ok "Firewall RDP: HABILITADO"
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
Write-ErrorMessage "Firewall RDP: NO HABILITADO"
|
$allRdpRules = @(Get-RdpFirewallRules)
|
||||||
|
|
||||||
|
if ($allRdpRules.Count -eq 0) {
|
||||||
|
|
||||||
|
Write-ErrorMessage "Firewall RDP: NO HAY REGLAS RDP EN EL SISTEMA"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
|
||||||
|
Write-ErrorMessage "Firewall RDP: LAS REGLAS EXISTEN PERO ESTÁN DESHABILITADAS"
|
||||||
|
}
|
||||||
|
|
||||||
$allOk = $false
|
$allOk = $false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
||||||
Write-ErrorMessage "No se pudo comprobar el Firewall de RDP."
|
Write-ErrorMessage "No se pudo comprobar el Firewall de RDP: $($_.Exception.Message)"
|
||||||
|
|
||||||
$allOk = $false
|
$allOk = $false
|
||||||
}
|
}
|
||||||
@@ -830,6 +1011,11 @@ try {
|
|||||||
|
|
||||||
Clear-Host
|
Clear-Host
|
||||||
|
|
||||||
|
Write-Log "========== INICIO DE EJECUCIÓN =========="
|
||||||
|
Write-Log "Windows: $([Environment]::OSVersion.VersionString)"
|
||||||
|
Write-Log "Usuario: $([Environment]::UserDomainName)\$([Environment]::UserName)"
|
||||||
|
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 - CONFIGURACIÓN INICIAL" -ForegroundColor Cyan
|
||||||
@@ -977,13 +1163,24 @@ try {
|
|||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
||||||
|
$fullMessage = Get-ExceptionMessage -Exception $_.Exception
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "==================================================" -ForegroundColor Red
|
Write-Host "==================================================" -ForegroundColor Red
|
||||||
Write-Host " ERROR FATAL" -ForegroundColor Red
|
Write-Host " ERROR FATAL" -ForegroundColor Red
|
||||||
Write-Host "==================================================" -ForegroundColor Red
|
Write-Host "==================================================" -ForegroundColor Red
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
Write-ErrorMessage $_.Exception.Message
|
Write-ErrorMessage $fullMessage
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "Trace del script:" -ForegroundColor Yellow
|
||||||
|
Write-Host $_.ScriptStackTrace
|
||||||
|
|
||||||
|
Write-Log "=========================================================================="
|
||||||
|
Write-Log "ERROR FATAL: $fullMessage"
|
||||||
|
Write-Log ("TRACE: " + ($_.ScriptStackTrace -replace "(`r)?`n", " | "))
|
||||||
|
Write-Log "=========================================================================="
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
Write-Host "El script se ha detenido para evitar continuar" `
|
Write-Host "El script se ha detenido para evitar continuar" `
|
||||||
@@ -991,6 +1188,10 @@ catch {
|
|||||||
Write-Host "con una configuración incompleta." `
|
Write-Host "con una configuración incompleta." `
|
||||||
-ForegroundColor Yellow
|
-ForegroundColor Yellow
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "Detalles guardados en el log: $LogPath" `
|
||||||
|
-ForegroundColor Cyan
|
||||||
|
|
||||||
Write-Host ""
|
Write-Host ""
|
||||||
|
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
Reference in New Issue
Block a user