2025-10-08 13:51:27 -03:00
# =================================================================================
# 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
}
2025-10-08 13:51:27 -03:00
}
} 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 / 1 GB , 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 / 1 GB , 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 / 1 GB , 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 / 1 GB , 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"