Modules/ADEHM.System.psm1

#requires -Version 5.1
<#
    ADEHM.System.psm1
    Collects system resources (CPU, RAM, disk, Windows version, uptime)
    through CIM/WinRM sessions. No legacy WMI/DCOM dependency.
#>


function New-ADEHMCimSession {
    <#
        .SYNOPSIS
        Opens a CIM session (WSMan protocol) to a domain controller.
 
        .DESCRIPTION
        A single session is created per server and must be closed with
        Remove-CimSession as soon as collection is complete.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [string]$ComputerName,
        [int]$TimeoutSeconds = 15,
        [System.Management.Automation.PSCredential]$Credential
    )

    # -OperationTimeoutSec belongs to New-CimSession, NOT New-CimSessionOption
    $sessionOption = New-CimSessionOption -Protocol Wsman

    $params = @{
        ComputerName        = $ComputerName
        SessionOption       = $sessionOption
        OperationTimeoutSec = $TimeoutSeconds
        ErrorAction         = 'Stop'
    }
    if ($Credential) { $params.Credential = $Credential }

    return New-CimSession @params
}

function Get-ADEHMSystemInfo {
    <#
        .SYNOPSIS
        Collects essential system information (CPU, RAM, OS, uptime).
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [Microsoft.Management.Infrastructure.CimSession]$CimSession
    )

    $os  = Get-CimInstance -CimSession $CimSession -ClassName Win32_OperatingSystem -ErrorAction Stop
    $cpu = Get-CimInstance -CimSession $CimSession -ClassName Win32_Processor -ErrorAction Stop
    $cs  = Get-CimInstance -CimSession $CimSession -ClassName Win32_ComputerSystem -ErrorAction Stop

    $cpuLoad = [math]::Round((($cpu | Measure-Object -Property LoadPercentage -Average).Average), 1)
    $ramUsedPct = [math]::Round((($os.TotalVisibleMemorySize - $os.FreePhysicalMemory) / $os.TotalVisibleMemorySize) * 100, 1)

    $lastBoot = $os.LastBootUpTime
    $uptime   = (Get-Date) - $lastBoot

    return [PSCustomObject]@{
        OSCaption      = $os.Caption
        OSVersion      = $os.Version
        BuildNumber    = $os.BuildNumber
        TotalRamGB     = [math]::Round($os.TotalVisibleMemorySize / 1MB, 2)
        FreeRamGB      = [math]::Round($os.FreePhysicalMemory / 1MB, 2)
        RamUsedPercent = $ramUsedPct
        CpuLoadPercent = $cpuLoad
        LastBootTime   = $lastBoot
        UptimeDays     = [math]::Round($uptime.TotalDays, 2)
        Domain         = $cs.Domain
    }
}

function Get-ADEHMDiskInfo {
    <#
        .SYNOPSIS
        Collects free space for all fixed volumes (C: and others).
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)] [Microsoft.Management.Infrastructure.CimSession]$CimSession
    )

    $disks = Get-CimInstance -CimSession $CimSession -ClassName Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction Stop

    foreach ($disk in $disks) {
        $freePct = if ($disk.Size -gt 0) { [math]::Round(($disk.FreeSpace / $disk.Size) * 100, 1) } else { 0 }
        [PSCustomObject]@{
            DeviceID    = $disk.DeviceID
            SizeGB      = [math]::Round($disk.Size / 1GB, 2)
            FreeGB      = [math]::Round($disk.FreeSpace / 1GB, 2)
            FreePercent = $freePct
        }
    }
}

Export-ModuleMember -Function New-ADEHMCimSession, Get-ADEHMSystemInfo, Get-ADEHMDiskInfo