Files
Inventario-IT/getDatosPost.ps1

248 lines
9.9 KiB
PowerShell
Raw Normal View History

# =================================================================================
# 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+).
# =================================================================================
# --- CONFIGURACIÓN ---
# Host/IP del servidor de API.
$baseUrl = "http://equipos.eldia.net"
# ---------------------
# --- DETECCIÓN DE VERSIÓN DE WINDOWS Y FUNCIONES AUXILIARES ---
$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)
2025-10-08 14:03:40 -03:00
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
$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
} else {
# --- Lógica para Windows moderno ---
$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
}
# --- 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
} 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
}
# --- 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!
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 "`n-------------------------------------------"
Write-Host "¡Proceso de inventario completado con éxito!"
Write-Host "-------------------------------------------"
} catch {
Write-Host "`n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
Write-Host "ERROR: Ocurrió un error durante el envío de datos."
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"