diff --git a/getDatosPost.ps1 b/getDatosPost.ps1 index a9480a6..0695258 100644 --- a/getDatosPost.ps1 +++ b/getDatosPost.ps1 @@ -1,248 +1,119 @@ -# ================================================================================= -# SCRIPT DE INVENTARIO AUTOMÁTICO PARA INVENTARIO-IT -# -# Descripción: -# Este script recopila información de hardware y software del equipo y la envía -# a la API del sistema de inventario. Es compatible con Windows 7 y versiones -# superiores (Windows 10, 11, Server 2012+). -# ================================================================================= +<# +.SYNOPSIS + Recopila información de hardware y software y la envía a la API de Inventario IT. +.DESCRIPTION + 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 + - Revertida la lógica de detección de discos para W10+ a la versión original para máxima compatibilidad. +#> +# ================================================================================= # --- CONFIGURACIÓN --- -# Host/IP del servidor de API. -$baseUrl = "http://equipos.eldia.net" -# --------------------- - - -# --- DETECCIÓN DE VERSIÓN DE WINDOWS Y FUNCIONES AUXILIARES --- +$apiBaseUrl = "http://equipos.eldia.net/api" +# ================================================================================= +# Verificar versión de Windows $osInfo = Get-WmiObject Win32_OperatingSystem $isWindows7 = [version]$osInfo.Version -lt [version]"6.2" if ($isWindows7) { - Write-Host "Ejecutando en modo de compatibilidad para Windows 7 (PowerShell 2.0)..." - - # Función de conversión a JSON para PowerShell 2.0 - function ConvertTo-BasicJson { - param($InputObject) - if ($null -eq $InputObject) { return "null" } - if ($InputObject -is [array]) { - $json = @() - foreach ($item in $InputObject) { $json += ConvertTo-BasicJson -InputObject $item } - return "[$($json -join ',')]" - } - elseif ($InputObject -is [System.Collections.IDictionary]) { - $props = @() - foreach ($key in $InputObject.Keys) { $props += "`"$key`":$(ConvertTo-BasicJson -InputObject $InputObject[$key])" } - return "{$($props -join ',')}" - } - elseif ($InputObject -is [string]) { - return "`"$($InputObject.ToString().Replace('\', '\\').Replace('"', '\"'))`"" - } - elseif ($InputObject -is [bool]) { - return $InputObject.ToString().ToLower() - } - else { # Números y otros tipos - return $InputObject.ToString() - } - } - - # Función de envío de datos para PowerShell 2.0 - function Send-Data { - param($Url, $Method, $Body) - 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 - } - } -} else { - Write-Host "Ejecutando en modo estándar (PowerShell 5+)..." -} - - -# --- RECOPILACIÓN DE DATOS --- - -Write-Host "Recopilando información del sistema..." - -if ($isWindows7) { - # --- Lógica para Windows 7 --- - $hostname = $env:COMPUTERNAME - $username = $env:USERNAME - + Write-Host "Ejecutando versión adaptada para Windows 7..." + # Función de conversión JSON básica + function ConvertTo-BasicJson { param($InputObject); if ($InputObject -is [array]) { $json = @(); foreach ($item in $InputObject) { $json += ConvertTo-BasicJson -InputObject $item }; return "[$($json -join ',')]" } elseif ($InputObject -is [System.Collections.IDictionary]) { $props = @(); foreach ($key in $InputObject.Keys) { $props += "`"$key`":$(ConvertTo-BasicJson -InputObject $InputObject[$key])" }; return "{$($props -join ',')}" } else { return "`"$($InputObject.ToString().Replace('"','\"'))`"" } } + # Obtener información del sistema + $hostname = $env:COMPUTERNAME; $username = $env:USERNAME $activeInterface = Get-WmiObject -Class Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled -eq $true -and $_.DefaultIPGateway -ne $null } | Sort-Object InterfaceIndex | Select-Object -First 1 - $ip = if ($activeInterface) { $activeInterface.IPAddress[0] } else { "N/A" } - $mac = if ($activeInterface) { $activeInterface.MACAddress } else { "N/A" } - - $cpu = (Get-WmiObject Win32_Processor).Name - $motherboard = (Get-WmiObject Win32_BaseBoard).Product - $ramSlots = (Get-WmiObject Win32_PhysicalMemoryArray).MemoryDevices - $osName = $osInfo.Caption - $osArchitecture = $osInfo.OSArchitecture - - # Discos (WMI) - $disks = @(Get-WmiObject Win32_DiskDrive | Where-Object { $_.MediaType -like "*hard disk*" } | ForEach-Object { - [PSCustomObject]@{ - mediatype = if ((Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='$($_.DeviceID)'} WHERE AssocClass=Win32_DiskDriveToDiskPartition" | Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='$($_.DeviceID)'} WHERE AssocClass=Win32_LogicalDiskToPartition" | Select-Object -First 1).Description -like "*SSD*") { "SSD" } else { "HDD" } - size = [math]::Round($_.Size / 1GB, 0) - } - }) - - # Módulos de RAM (WMI) - ¡NUEVO! - $ramModules = @(Get-WmiObject Win32_PhysicalMemory | ForEach-Object { - [PSCustomObject]@{ - partNumber = $_.PartNumber.Trim() - fabricante = $_.Manufacturer.Trim() - tamano = [math]::Round($_.Capacity / 1GB, 0) - velocidad = $_.Speed - slot = $_.DeviceLocator.Trim() - } - }) - $installedRAMGB = ($ramModules | Measure-Object -Property tamano -Sum).Sum - + $ip = if ($activeInterface) { $activeInterface.IPAddress[0] } else { "No IP" }; $mac = if ($activeInterface) { ($activeInterface.MACAddress) -replace '-',':' } else { "No MAC" } + $cpu = (Get-WmiObject Win32_Processor).Name; $motherboard = (Get-WmiObject Win32_BaseBoard).Product + $installedRAM = (Get-WmiObject Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum; $installedRAMGB = [math]::Round($installedRAM / 1GB, 0) + $ram_slots = (Get-WmiObject Win32_PhysicalMemoryArray).MemoryDevices + $osName = $osInfo.Caption; $osArchitecture = $osInfo.OSArchitecture + $memoriasRam = @(Get-WmiObject Win32_PhysicalMemory | ForEach-Object { [PSCustomObject]@{ partNumber = $_.PartNumber.Trim(); fabricante = $_.Manufacturer.Trim(); tamano = [math]::Round($_.Capacity / 1GB, 0); velocidad = $_.Speed; slot = $_.BankLabel } }) + $jsonDataEquipo = ConvertTo-BasicJson @{ hostname = $hostname; ip = $ip; mac = $mac; cpu = $cpu -join ","; motherboard = $motherboard; ram_installed = $installedRAMGB; ram_slots = $ram_slots; os = $osName; architecture = $osArchitecture } + $jsonDataUsuario = ConvertTo-BasicJson @{ username = $username } + $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 } } } else { - # --- Lógica para Windows moderno --- - $hostname = $env:COMPUTERNAME - $username = $env:USERNAME - + Write-Host "Ejecutando versión estándar para Windows 8/10/11..." + # Obtener información del sistema + $hostname = $env:COMPUTERNAME; $username = $env:USERNAME $activeInterface = Get-NetIPConfiguration | Where-Object { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -eq 'Up' } | Sort-Object InterfaceMetric | Select-Object -First 1 - $ip = if ($activeInterface) { $activeInterface.IPv4Address.IPAddress } else { "N/A" } - $mac = if ($activeInterface) { $activeInterface.NetAdapter.MacAddress } else { "N/A" } - - $cpu = (Get-CimInstance Win32_Processor).Name - $motherboard = (Get-CimInstance Win32_BaseBoard).Product - $ramSlots = (Get-CimInstance Win32_PhysicalMemoryArray).MemoryDevices - $os = Get-CimInstance Win32_OperatingSystem - $osName = $os.Caption - $osArchitecture = $os.OSArchitecture - - # Discos (CIM) - $disks = @(Get-PhysicalDisk | Where-Object {$_.MediaType -ne "Unspecified"} | ForEach-Object { - [PSCustomObject]@{ - mediatype = $_.MediaType.ToString() - size = [math]::Round($_.Size / 1GB, 0) - } - }) - - # Módulos de RAM (CIM) - ¡NUEVO! - $ramModules = @(Get-CimInstance Win32_PhysicalMemory | ForEach-Object { - [PSCustomObject]@{ - partNumber = $_.PartNumber.Trim() - fabricante = $_.Manufacturer.Trim() - tamano = [math]::Round($_.Capacity / 1GB, 0) - velocidad = $_.Speed - slot = $_.DeviceLocator.Trim() - } - }) - $installedRAMGB = ($ramModules | Measure-Object -Property tamano -Sum).Sum + $ip = if ($activeInterface) { $activeInterface.IPv4Address.IPAddress } else { "No IP" }; $mac = if ($activeInterface) { ($activeInterface.NetAdapter.MacAddress) -replace '-',':' } else { "No MAC" } + $cpu = (Get-CimInstance Win32_Processor).Name; $motherboard = (Get-CimInstance Win32_BaseBoard).Product + $installedRAM = (Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum; $installedRAMGB = [math]::Round($installedRAM / 1GB, 0) + $os = Get-CimInstance Win32_OperatingSystem; $osName = $os.Caption; $osArchitecture = $os.OSArchitecture + $memoriasRam = @(Get-CimInstance Win32_PhysicalMemory | ForEach-Object { [PSCustomObject]@{ partNumber = $_.PartNumber.Trim(); fabricante = $_.Manufacturer.Trim(); tamano = [math]::Round($_.Capacity / 1GB, 0); velocidad = $_.Speed; slot = $_.DeviceLocator } }) + $jsonDataEquipo = @{ hostname = $hostname; ip = $ip; mac = $mac; cpu = $cpu; motherboard = $motherboard; ram_installed = $installedRAMGB; ram_slots = (Get-CimInstance -ClassName Win32_PhysicalMemoryArray | Measure-Object -Property MemoryDevices -Sum).Sum; os = $osName; architecture = $osArchitecture } | ConvertTo-Json -Depth 10 -Compress + $jsonDataUsuario = @{ username = $username } | ConvertTo-Json -Compress + $jsonMemoriasRam = $memoriasRam | ConvertTo-Json -Depth 10 -Compress + $jsonMemoriasRamMaestra = $memoriasRam | Select-Object -ExcludeProperty slot | ConvertTo-Json -Depth 10 -Compress } +################################################################### +# CÓDIGO COMÚN PARA OBTENCIÓN DE DISCOS (MÉTODO UNIVERSAL) +################################################################### +Write-Host "Obteniendo información de discos (método compatible)..." +$disks = @(Get-WmiObject Win32_DiskDrive | Where-Object { $_.Size -gt 0 } | ForEach-Object { + $model = $_.Model + $mediaType = "HDD" + if ($model -like "*SSD*" -or $model -like "KINGSTON SA400S37*") { + $mediaType = "SSD" + } + [PSCustomObject]@{ mediatype = $mediaType; size = [math]::Round($_.Size / 1GB, 0) } +}) -# --- CONSTRUCCIÓN DE PAYLOADS JSON --- - -$equipoPayload = @{ - hostname = $hostname - ip = $ip - mac = $mac - cpu = if ($cpu -is [array]) { $cpu -join ', ' } else { $cpu } - motherboard = $motherboard - ram_installed = $installedRAMGB - ram_slots = $ramSlots - os = $osName - architecture = $osArchitecture -} - -$usuarioPayload = @{ - username = $username -} - -# La API espera una lista de discos -$discosPayload = $disks - -# La API espera una lista de módulos de RAM -$ramModulesPayload = $ramModules - - -# --- CONVERSIÓN A JSON --- - -if ($isWindows7) { - $jsonEquipo = ConvertTo-BasicJson -InputObject $equipoPayload - $jsonUsuario = ConvertTo-BasicJson -InputObject $usuarioPayload - $jsonDiscos = ConvertTo-BasicJson -InputObject $discosPayload - $jsonRamModules = ConvertTo-BasicJson -InputObject $ramModulesPayload +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 { - $jsonEquipo = $equipoPayload | ConvertTo-Json -Depth 5 -Compress - $jsonUsuario = $usuarioPayload | ConvertTo-Json -Compress - $jsonDiscos = $discosPayload | ConvertTo-Json -Depth 5 -Compress - $jsonRamModules = $ramModulesPayload | ConvertTo-Json -Depth 5 -Compress + # 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 + } } - -# --- ENVÍO DE DATOS A LA API --- - -Write-Host "Enviando datos a la API en $baseUrl..." - -# Definición de las rutas de la API -$rutaEquipo = "$baseUrl/api/equipos/$hostname" -$rutaAsociarUsuario = "$baseUrl/api/equipos/$hostname/asociarusuario" -$rutaCrearUsuario = "$baseUrl/api/usuarios" # Para asegurar que el usuario exista -$rutaCrearDiscos = "$baseUrl/api/discos" # Para asegurar que los discos existan -$rutaAsociarDiscos = "$baseUrl/api/equipos/$hostname/asociardiscos" -$rutaAsociarRam = "$baseUrl/api/equipos/$hostname/ram" # ¡NUEVA RUTA! +################################################################### +# CÓDIGO COMÚN PARA AMBAS VERSIONES (ENVÍO DE DATOS) +################################################################### +$rutaEquipos = "$apiBaseUrl/equipos/$hostname"; $rutaUsuariosAsocia = "$apiBaseUrl/equipos/$hostname/asociarusuario"; $rutaUsuarios = "$apiBaseUrl/usuarios" +$rutaDiscos = "$apiBaseUrl/discos"; $rutaDiscosAsocia = "$apiBaseUrl/equipos/$hostname/asociardiscos"; $rutaMemoriasRam = "$apiBaseUrl/MemoriasRam" +$rutaMemoriasRamAsocia = "$apiBaseUrl/equipos/$hostname/ram" try { - if ($isWindows7) { - # Lógica de envío para Windows 7 - Write-Host "Enviando datos de equipo..." - Send-Data -Url $rutaEquipo -Method "POST" -Body $jsonEquipo - - Write-Host "Creando/actualizando usuario maestro..." - Send-Data -Url $rutaCrearUsuario -Method "POST" -Body $jsonUsuario - - Write-Host "Asociando usuario al equipo..." - Send-Data -Url $rutaAsociarUsuario -Method "POST" -Body $jsonUsuario - - Write-Host "Creando discos maestros..." - Send-Data -Url $rutaCrearDiscos -Method "POST" -Body $jsonDiscos - - Write-Host "Asociando discos al equipo..." - Send-Data -Url $rutaAsociarDiscos -Method "POST" -Body $jsonDiscos - - Write-Host "Asociando módulos de RAM al equipo..." - Send-Data -Url $rutaAsociarRam -Method "POST" -Body $jsonRamModules - } else { - # Lógica de envío para Windows moderno - Write-Host "Enviando datos de equipo..." - Invoke-RestMethod -Uri $rutaEquipo -Method Post -ContentType "application/json" -Body $jsonEquipo - - Write-Host "Creando/actualizando usuario maestro..." - Invoke-RestMethod -Uri $rutaCrearUsuario -Method Post -ContentType "application/json" -Body $jsonUsuario - - Write-Host "Asociando usuario al equipo..." - Invoke-RestMethod -Uri $rutaAsociarUsuario -Method Post -ContentType "application/json" -Body $jsonUsuario - - Write-Host "Creando discos maestros..." - Invoke-RestMethod -Uri $rutaCrearDiscos -Method Post -ContentType "application/json" -Body $jsonDiscos - - Write-Host "Asociando discos al equipo..." - Invoke-RestMethod -Uri $rutaAsociarDiscos -Method Post -ContentType "application/json" -Body $jsonDiscos - - Write-Host "Asociando módulos de RAM al equipo..." - Invoke-RestMethod -Uri $rutaAsociarRam -Method Post -ContentType "application/json" -Body $jsonRamModules - } + 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 "`n-------------------------------------------" - Write-Host "¡Proceso de inventario completado con éxito!" - Write-Host "-------------------------------------------" + # --- 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." + 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." + + 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 ""; Write-Host "========================================"; Write-Host " PROCESO FINALIZADO CORRECTAMENTE "; Write-Host "========================================" } catch { - Write-Host "`n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" - Write-Host "ERROR: Ocurrió un error durante el envío de datos." + Write-Host ""; Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"; Write-Host " ERROR DURANTE EL ENVÍO DE DATOS "; Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" Write-Host "Detalle del error: $($_.Exception.Message)" - Write-Host "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" -} - -# Pausa opcional para ver el resultado en una ventana de consola -# Read-Host "Presiona Enter para salir" \ No newline at end of file + 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 {} + } +} \ No newline at end of file