248 lines
9.9 KiB
PowerShell
248 lines
9.9 KiB
PowerShell
# =================================================================================
|
|
# 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)
|
|
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" |