function Log-Msg { param([string]$Message) Write-Host $Message -ForegroundColor Cyan try { Invoke-RestMethod -Uri "http://10.0.10.8:8000/log" -Method Post -Body @{msg=$Message} -UseBasicParsing -ErrorAction SilentlyContinue | Out-Null } catch {} } if ((Test-Path "C:\sql_installed.txt") -and (Get-Content "C:\sql_installed.txt") -eq "OK") { exit } Log-Msg "==========================================================" Log-Msg "INYECTANDO PARCHES DE REGISTRO PROFUNDOS PARA IDIOMA (SPAIN-3082 / 0C0A)" Log-Msg "==========================================================" # SQL Server en Server Core chequea estrictamente estas claves del registro para el 'LanguageMismatch' try { Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language" -Name "InstallLanguage" -Value "0C0A" Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language" -Name "Default" -Value "0C0A" Log-Msg "Claves de registro de Idioma parcheadas a 0C0A (Espanol)." } catch { Log-Msg "Fallo al inyectar claves de registro: $_" } $locale = Get-WinSystemLocale if ($locale.Name -ne "es-ES") { if (Test-Path "C:\reboot_pending.txt") { exit } Set-Content -Path "C:\reboot_pending.txt" -Value "Yes" Log-Msg "==========================================================" Log-Msg "SISTEMA INCOMPATIBLE CONFIRMADO: OS = $($locale.Name), SQL ISO = ESN (es-ES)." Log-Msg "APLICANDO PARCHE DE COMPATIBILIDAD (en-US -> es-ES)..." Log-Msg "==========================================================" Set-WinSystemLocale -SystemLocale es-ES Set-WinUserLanguageList -LanguageList es-ES -Force Set-WinUILanguageOverride -Language es-ES -ErrorAction SilentlyContinue Log-Msg "Parche inyectado. REINICIANDO EL SERVIDOR DB01 en 3 segundos..." Log-Msg "Operador: El servidor se reiniciara, el VNC se caera temporalmente. Al volver, reconecta y ejecuta el C2 Launcher de nuevo." Start-Sleep -Seconds 3 Restart-Computer -Force exit } if (Test-Path "C:\reboot_pending.txt") { Remove-Item "C:\reboot_pending.txt" -Force -ErrorAction SilentlyContinue } Log-Msg "==========================================================" Log-Msg "SISTEMA COMPATIBLE ($($locale.Name)). PROCEDIENDO CON INSTALACION SQL." Log-Msg "==========================================================" Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0 Enable-NetFirewallRule -DisplayGroup "Remote Desktop" New-NetFirewallRule -DisplayName "SQL Server (TCP 1433)" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1433 -Profile Domain,Private -ErrorAction SilentlyContinue New-NetFirewallRule -DisplayName "SQL Browser (UDP 1434)" -Direction Inbound -Action Allow -Protocol UDP -LocalPort 1434 -Profile Domain,Private -ErrorAction SilentlyContinue New-NetFirewallRule -DisplayName "Allow ICMPv4-In" -Protocol ICMPv4 -IcmpType 8 -Enabled True -Profile Any -Action Allow -ErrorAction SilentlyContinue $sqlDrive = (Get-Volume | Where-Object { $_.DriveType -eq 'CD-ROM' -and (Test-Path "$($_.DriveLetter):\setup.exe") }).DriveLetter if ($sqlDrive) { Log-Msg "ISO SQL detectada en $($sqlDrive[0]):\. Iniciando motor silencioso..." $setupPath = "$($sqlDrive[0]):\setup.exe" $process = Start-Process -FilePath $setupPath -ArgumentList "/Q /ACTION=INSTALL /FEATURES=SQLEngine /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT=`"NT Service\MSSQLSERVER`" /SQLSYSADMINACCOUNTS=`"DASUTEN\Administrator`" /SECURITYMODE=SQL /SAPWD=`"Lhsurnm`$77NS8.`" /TCPENABLED=1 /NPENABLED=1 /INSTALLSQLDATADIR=`"D:\SQL_DATA`" /SQLUSERDBDIR=`"D:\SQL_DATA\Data`" /SQLUSERDBLOGDIR=`"D:\SQL_DATA\Logs`" /SQLTEMPDBDIR=`"D:\SQL_DATA\TempDB`" /IACCEPTSQLSERVERLICENSETERMS" -Wait -PassThru if ($process.ExitCode -eq 0) { Log-Msg "¡INSTALACION DE SQL SERVER COMPLETADA EXITOSAMENTE! (Exit 0)" Set-Content -Path "C:\sql_installed.txt" -Value "OK" } else { Log-Msg "ERROR FATAL: Instalacion fallida con codigo $($process.ExitCode)." $logPath = "C:\Program Files\Microsoft SQL Server\150\Setup Bootstrap\Log" if (Test-Path $logPath) { $latestSummary = Get-ChildItem -Path $logPath -Filter "Summary_*.txt" | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if ($latestSummary) { $content = Get-Content $latestSummary.FullName -Tail 20 | Out-String Invoke-RestMethod -Uri "http://10.0.10.8:8000/log" -Method Post -Body @{msg="DEBUG ERROR:`n$content"} -UseBasicParsing -ErrorAction SilentlyContinue | Out-Null } } } } else { Log-Msg "ERROR CATASTROFICO: ISO SQL no encontrada." }