functions/Get-TopProcessMemory.ps1
Function Get-TopProcessMemory { [CmdletBinding(DefaultParameterSetName = "Computername")] [alias("gtop")] [OutputType("topProcessMemoryUnit")] Param( [Parameter( Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'Computername' )] [ValidateNotNullOrEmpty()] [Alias("cn")] [string[]]$Computername = $env:Computername, [Parameter( ParameterSetName = 'Cim', Mandatory, ValueFromPipeline )] [ValidateNotNullOrEmpty()] [Microsoft.Management.Infrastructure.CimSession[]]$CimSession, [validateRange(1, 25)] [Int]$Top = 5 ) Begin { Write-Verbose "[BEGIN ] Starting: $($MyInvocation.MyCommand)" #a private function to get process owner function _getProcessOwner { [CmdletBinding()] Param([object]$CimProcess) $own = $cimProcess | Invoke-CimMethod -MethodName GetOwner "$($own.domain)\$($own.user)" } } #Begin Process { Write-Verbose "[PROCESS] PSBoundParameters" Write-Verbose ($PSBoundParameters | Out-String) Write-Verbose "[PROCESS] Using parameter set $($PSCmdlet.ParameterSetName)" if ($PSCmdlet.ParameterSetName -eq 'Computername') { #create a temporary cimsession if using a computername $myCIMSession = foreach ($item in $Computername) { Try { Write-Verbose "[PROCESS] Creating temporary CIM Session to $item" New-CimSession -ComputerName $item -ErrorAction Stop -OutVariable +TmpSess Write-Verbose "[PROCESS] Added session" } Catch { Write-Error "[$($item.toUpper())] Failed to create temporary CIM Session. $($_.exception.message)" } } #foreach item in computername } #if computername parameter set else { Write-Verbose "[PROCESS] Re-using CimSessions" $MyCimSession = $CimSession } foreach ($session in $MyCIMSession) { Write-Verbose "[PROCESS] SessionID = $($session.ID)" Try { Write-Verbose "[PROCESS] Querying $($session.computername.ToUpper())" $data = Get-CimInstance -ClassName win32_process -CimSession $session -ErrorAction Stop | Sort-Object WorkingSetSize -Descending | Select-Object -First $Top } #Try Catch { Write-Error "[$($Session.Computername.toUpper())] $($_.exception.message)" } #Catch if ($data) { #get overall memory usage $mu = Get-MemoryUsage -CimSession $session [int64]$used = ($mu.totalGB - $mu.FreeGB) * 1gb Foreach ($item in $data) { [PSCustomObject]@{ PSTypename = "topProcessMemoryUnit" Computername = $item.PSComputername.ToUpper() ProcessID = $item.ProcessID Name = $item.Name WS = $item.WorkingSetSize PctUsed = [math]::Round(($item.WorkingSetSize /$used) * 100, 4) CreationDate = $item.CreationDate Runtime = (Get-Date) - $item.CreationDate Owner = $(_getProcessOwner $item) Commandline = $item.Commandline } } } } #foreach #clean up if ($TmpSess.count -gt 0) { Write-Verbose "[PROCESS] Removing temporary sessions" $TmpSess | Out-String | Write-Verbose $TmpSess | Remove-CimSession Remove-Variable -name TmpSess -Force } } #process End { Write-Verbose "[END ] Ending: $($MyInvocation.MyCommand)" } #end } |