From 06be3a10da5cfb4b585d770a93b552e14e3bc7b2 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Tue, 21 Oct 2025 13:53:03 -0300 Subject: [PATCH] Fix PS1 Credenciales de Acceso --- getDatosPost.ps1 | 101 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 23 deletions(-) diff --git a/getDatosPost.ps1 b/getDatosPost.ps1 index 0695258..3f94001 100644 --- a/getDatosPost.ps1 +++ b/getDatosPost.ps1 @@ -5,14 +5,19 @@ Este script utiliza la lógica de recopilación de discos original y probada, adaptada para funcionar con los nuevos endpoints y la estructura de datos de la API de Inventario IT. .NOTES - Versión: 2.4 - Fecha: 08/10/2025 + Versión: 2.5 + Fecha: 21/10/2025 + - Añadido flujo de autenticación JWT para obtener un token antes de realizar las llamadas a la API. + - Todas las peticiones a la API ahora incluyen la cabecera 'Authorization: Bearer '. - Revertida la lógica de detección de discos para W10+ a la versión original para máxima compatibilidad. #> # ================================================================================= # --- CONFIGURACIÓN --- $apiBaseUrl = "http://equipos.eldia.net/api" +# Añadir credenciales para la autenticación en la API. +$apiUser = "admin" +$apiPassword = "PTP847Equipos" # ================================================================================= # Verificar versión de Windows @@ -37,8 +42,27 @@ if ($isWindows7) { $jsonMemoriasRam = ConvertTo-BasicJson -InputObject $memoriasRam $memoriasRamMaestra = $memoriasRam | ForEach-Object { $obj = New-Object PSCustomObject; Add-Member -InputObject $obj -MemberType NoteProperty -Name "partNumber" -Value $_.partNumber; Add-Member -InputObject $obj -MemberType NoteProperty -Name "fabricante" -Value $_.fabricante; Add-Member -InputObject $obj -MemberType NoteProperty -Name "tamano" -Value $_.tamano; Add-Member -InputObject $obj -MemberType NoteProperty -Name "velocidad" -Value $_.velocidad; $obj } $jsonMemoriasRamMaestra = ConvertTo-BasicJson -InputObject $memoriasRamMaestra - # Función de envío WebClient - function Send-Data { param($Url, $Body, $Method = "POST"); try { $webClient = New-Object System.Net.WebClient; $webClient.Headers.Add("Content-Type", "application/json"); return $webClient.UploadString($Url, $Method, $Body) } catch { Write-Host "Error en el envío a $Url : $($_.Exception.Message)"; return $null } } + + #[MODIFICACIÓN] Actualizar la función Send-Data para aceptar cabeceras (headers) + function Send-Data { + param($Url, $Body, $Method = "POST", $Headers) + try { + $webClient = New-Object System.Net.WebClient + $webClient.Headers.Add("Content-Type", "application/json") + if ($Headers) { + foreach ($key in $Headers.Keys) { + $webClient.Headers.Add($key, $Headers[$key]) + } + } + return $webClient.UploadString($Url, $Method, $Body) + } catch { + Write-Host "Error en el envío a $Url : $($_.Exception.Message)" + if ($_.Exception.Response) { + try { $stream = $_.Exception.Response.GetResponseStream(); $reader = New-Object System.IO.StreamReader($stream); $responseBody = $reader.ReadToEnd(); Write-Host "Respuesta del servidor: $responseBody" } catch {} + } + return $null + } + } } else { Write-Host "Ejecutando versión estándar para Windows 8/10/11..." # Obtener información del sistema @@ -72,19 +96,53 @@ if ($null -eq $disks -or $disks.Count -eq 0) { Write-Host "[ADVERTENCIA] No se pudo obtener información de los discos. Se enviará una lista vacía." $jsonDiscos = "[]" } else { - # 1. Convertimos la colección a JSON. $tempJson = $disks | ConvertTo-Json -Depth 10 -Compress - - # 2. Verificamos si el texto resultante NO empieza con '[', lo que significa que es un objeto único. if (-not $tempJson.StartsWith("[")) { - # 3. Si es un objeto único, lo envolvemos en corchetes para convertirlo en un array de un solo elemento. $jsonDiscos = "[$tempJson]" } else { - # 4. Si ya es un array, lo usamos tal cual. $jsonDiscos = $tempJson } } +################################################################### +# PASO PREVIO: AUTENTICACIÓN PARA OBTENER TOKEN JWT +################################################################### +Write-Host "Autenticando contra la API para obtener el token..." +$token = $null +$loginUrl = "$apiBaseUrl/auth/login" +$loginBody = @{ username = $apiUser; password = $apiPassword } | ConvertTo-Json -Compress + +try { + # Usamos Invoke-RestMethod para el login en ambas versiones por simplicidad en el manejo de la respuesta + $loginResponse = Invoke-RestMethod -Uri $loginUrl -Method Post -ContentType "application/json" -Body $loginBody + $token = $loginResponse.token + if ($token) { + Write-Host "-> Autenticación exitosa. Token obtenido." -ForegroundColor Green + } else { + Write-Host "-> ERROR: No se recibió un token del servidor, aunque la petición fue exitosa." -ForegroundColor Red + } +} catch { + Write-Host "-> ERROR GRAVE al autenticar: $($_.Exception.Message)" -ForegroundColor Red + if ($_.Exception.Response) { + $errorResponse = $_.Exception.Response.GetResponseStream() + $reader = New-Object System.IO.StreamReader($errorResponse) + $reader.BaseStream.Position = 0 + $reader.DiscardBufferedData() + $responseBody = $reader.ReadToEnd(); + Write-Host "Respuesta del servidor: $responseBody" -ForegroundColor Yellow + } +} + +if (-not $token) { + Write-Host "No se pudo continuar sin un token de autenticación. Saliendo del script." -ForegroundColor Red + # Pausa para que el usuario pueda ver el error antes de que la ventana se cierre + Read-Host "Presiona Enter para salir" + exit 1 +} + +# Preparamos la cabecera de autenticación que usaremos en todas las peticiones +$authHeader = @{ "Authorization" = "Bearer $token" } + ################################################################### # CÓDIGO COMÚN PARA AMBAS VERSIONES (ENVÍO DE DATOS) ################################################################### @@ -93,27 +151,24 @@ $rutaDiscos = "$apiBaseUrl/discos"; $rutaDiscosAsocia = "$apiBaseUrl/equipos/$ho $rutaMemoriasRamAsocia = "$apiBaseUrl/equipos/$hostname/ram" try { - Write-Host "1. Enviando/Actualizando datos del equipo..."; if ($isWindows7) { Send-Data -Url $rutaEquipos -Body $jsonDataEquipo } else { Invoke-RestMethod -Uri $rutaEquipos -Method Post -ContentType "application/json" -Body $jsonDataEquipo }; Write-Host "-> OK." - Write-Host "2. Creando/Actualizando registro de usuario..."; if ($isWindows7) { Send-Data -Url $rutaUsuarios -Body $jsonDataUsuario } else { Invoke-RestMethod -Uri $rutaUsuarios -Method Post -ContentType "application/json" -Body $jsonDataUsuario }; Write-Host "-> OK." - Write-Host "3. Asociando usuario al equipo..."; if ($isWindows7) { Send-Data -Url $rutaUsuariosAsocia -Body $jsonDataUsuario } else { Invoke-RestMethod -Uri $rutaUsuariosAsocia -Method Post -ContentType "application/json" -Body $jsonDataUsuario }; Write-Host "-> OK." + Write-Host "1. Enviando/Actualizando datos del equipo..."; if ($isWindows7) { Send-Data -Url $rutaEquipos -Body $jsonDataEquipo -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaEquipos -Method Post -ContentType "application/json" -Body $jsonDataEquipo -Headers $authHeader }; Write-Host "-> OK." + Write-Host "2. Creando/Actualizando registro de usuario..."; if ($isWindows7) { Send-Data -Url $rutaUsuarios -Body $jsonDataUsuario -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaUsuarios -Method Post -ContentType "application/json" -Body $jsonDataUsuario -Headers $authHeader }; Write-Host "-> OK." + Write-Host "3. Asociando usuario al equipo..."; if ($isWindows7) { Send-Data -Url $rutaUsuariosAsocia -Body $jsonDataUsuario -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaUsuariosAsocia -Method Post -ContentType "application/json" -Body $jsonDataUsuario -Headers $authHeader }; Write-Host "-> OK." - # --- LLAMADAS A LA API DE DISCOS CON DEPURACIÓN --- Write-Host "4. Enviando lista maestra de discos..." - Write-Host "--> DEBUG: Payload para /api/discos: $jsonDiscos" -ForegroundColor Cyan - if ($isWindows7) { Send-Data -Url $rutaDiscos -Body $jsonDiscos } else { Invoke-RestMethod -Uri $rutaDiscos -Method Post -ContentType "application/json" -Body $jsonDiscos }; Write-Host "-> OK." + if ($isWindows7) { Send-Data -Url $rutaDiscos -Body $jsonDiscos -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaDiscos -Method Post -ContentType "application/json" -Body $jsonDiscos -Headers $authHeader }; Write-Host "-> OK." Write-Host "5. Sincronizando discos con el equipo..." - Write-Host "--> DEBUG: Payload para /api/equipos/.../asociardiscos: $jsonDiscos" -ForegroundColor Cyan - if ($isWindows7) { Send-Data -Url $rutaDiscosAsocia -Body $jsonDiscos } else { Invoke-RestMethod -Uri $rutaDiscosAsocia -Method Post -ContentType "application/json" -Body $jsonDiscos }; Write-Host "-> OK." + if ($isWindows7) { Send-Data -Url $rutaDiscosAsocia -Body $jsonDiscos -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaDiscosAsocia -Method Post -ContentType "application/json" -Body $jsonDiscos -Headers $authHeader }; Write-Host "-> OK." - Write-Host "6. Enviando lista maestra de Memorias RAM..."; if ($isWindows7) { Send-Data -Url $rutaMemoriasRam -Body $jsonMemoriasRamMaestra } else { Invoke-RestMethod -Uri $rutaMemoriasRam -Method Post -ContentType "application/json" -Body $jsonMemoriasRamMaestra }; Write-Host "-> OK." - Write-Host "7. Sincronizando Memorias RAM con el equipo..."; if ($isWindows7) { Send-Data -Url $rutaMemoriasRamAsocia -Body $jsonMemoriasRam } else { Invoke-RestMethod -Uri $rutaMemoriasRamAsocia -Method Post -ContentType "application/json" -Body $jsonMemoriasRam }; Write-Host "-> OK." + Write-Host "6. Enviando lista maestra de Memorias RAM..."; if ($isWindows7) { Send-Data -Url $rutaMemoriasRam -Body $jsonMemoriasRamMaestra -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaMemoriasRam -Method Post -ContentType "application/json" -Body $jsonMemoriasRamMaestra -Headers $authHeader }; Write-Host "-> OK." + Write-Host "7. Sincronizando Memorias RAM con el equipo..."; if ($isWindows7) { Send-Data -Url $rutaMemoriasRamAsocia -Body $jsonMemoriasRam -Headers $authHeader } else { Invoke-RestMethod -Uri $rutaMemoriasRamAsocia -Method Post -ContentType "application/json" -Body $jsonMemoriasRam -Headers $authHeader }; Write-Host "-> OK." - Write-Host ""; Write-Host "========================================"; Write-Host " PROCESO FINALIZADO CORRECTAMENTE "; Write-Host "========================================" + Write-Host ""; Write-Host "========================================" -ForegroundColor Green; Write-Host " PROCESO FINALIZADO CORRECTAMENTE " -ForegroundColor Green; Write-Host "========================================" -ForegroundColor Green } catch { - Write-Host ""; Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"; Write-Host " ERROR DURANTE EL ENVÍO DE DATOS "; Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - Write-Host "Detalle del error: $($_.Exception.Message)" + Write-Host ""; Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" -ForegroundColor Red; Write-Host " ERROR DURANTE EL ENVÍO DE DATOS " -ForegroundColor Red; Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" -ForegroundColor Red + Write-Host "Detalle del error: $($_.Exception.Message)" -ForegroundColor Yellow if ($_.Exception.Response) { - try { $stream = $_.Exception.Response.GetResponseStream(); $reader = New-Object System.IO.StreamReader($stream); $responseBody = $reader.ReadToEnd(); $reader.Close(); $stream.Close(); Write-Host "Respuesta del servidor: $responseBody" } catch {} + try { $stream = $_.Exception.Response.GetResponseStream(); $reader = New-Object System.IO.StreamReader($stream); $responseBody = $reader.ReadToEnd(); $reader.Close(); $stream.Close(); Write-Host "Respuesta del servidor: $responseBody" -ForegroundColor Yellow } catch {} } } \ No newline at end of file