Mis mälu mul masinas/serveris on

Aeg-ajalt tekib küsimus, et masinas on Windowsi (ja minu) teada miski hulk mälu, aga kui suured ja kui palju mooduleid masinas on ja kas midagi annab veel juurde panna, pole teada.  Või äkki tuleb hoopis olemasolevad moodulid välja vahetada?

Siin aitab vana hea WMI.  Nimelt annab selle käest küsida, et palju mälu kontroller üldse toetab ning palju emaplaadil pesasid on:

Get-WmiObject Win32_PhysicalMemoryArray

Siin tuleb muidugi teada, et atribuut MaxCapacity on kilobaitides. Seega võiks tulemust loetavuse huvides natuke parandada.

$MaxCapacity = @{name="Max memory (MB)"; expression={$_.MaxCapacity/1KB}}

Get-WmiObject Win32_PhysicalMemoryArray |
  Format-Table $MaxCapacity, MemoryDevices –AutoSize

Siit saime kätte maksimaalse mälu hulga ja pesade arvu, aga mis ühikutes mälu praegu masinas on?

Get-WmiObject Win32_PhysicalMemory

Jällegi oleks hea tulemus natuke loetavamaks teha:

$capacity = @{name="Capacity (MB)"; expression={$_.Capacity/1MB}}

Get-WmiObject Win32_PhysicalMemory |
  Format-Table DeviceLocator, $capacity, speed –AutoSize

Kõik ülaltoodu töötab lokaalses masinas, aga kui oleks vaja sama info saada kätte eemalt?  WMI liides on ka eemalt kättesaadav, vaja vaid läheneda kasutajana, kellel on lubatud WMI-liidese poole pöörduda:

$me = Get-Credential domain\kasutaja

Get-WmiObject Win32_PhysicalMemoryArray –ComputerName masin –Credential $me |
  Format-Table $MaxCapacity, MemoryDevices –AutoSize

Get-WmiObject Win32_PhysicalMemory –ComputerName masin –Credential $me |
  Format-Table DeviceLocator, $capacity, speed –AutoSize

Ainult et nüüd on meil probleem.  Iga Get-WmiObject käsk loob eemal olevasse masinasse ühenduse, saab info ja paneb ühenduse uuesti kinni.  Lisaks tuleb eraldi oodata iga masina taga, millega soovitakse ühendust saada.  Ja kui minu ning eemalasuva masina vahel on tulemüür, siis võib seal WMI jaoks vajalikud pordid kinni olla.  Ning nende lahtitegemine on natuke problemaatiline (WMI kasutab DCOM-liidest ehk dünaamilisi porte).

Antud situatsioonile on kaks võimalikku lahendust.  Esimeseks oleks kasutada Powershelli kaugühendusi.  Võrgutulemüürides on vaja avada vaid üks port (tcp/5985) ja sihtmasinas saaks ligipääsu lubada ka mitte-adminkontole:

#Requires -Version 2
$session = New-PSSession –Computername masin1, masin2 –Credential $me

Invoke-Command –Session $session { Get-WmiObject Win32_PhysicalMemoryArray} |
  Format-Table PSComputername, $MaxCapacity, MemoryDevices –AutoSize

Invoke-Command –Session $session { Get-WmiObject Win32_PhysicalMemory} |
  Format-Table PSComputername, DeviceLocator, $capacity, speed –AutoSize

Remove-PSSession $session

Windows 8/Server 2012 (ja värskemad) võimadavad aga veelgi lihtsamat lähenemist.  Nimelt on seal Powershelli sisse tehtud WMI alternatiivliides, mis samuti kasutab sessioone: CIM.  Sessioonid muide on samad, mis Powershelli kaugühenduse puhulgi.

#Requires -Version 3
#Requires -Modules CimCmdlets
$session = New-CimSession -ComputerName masin1, masin2 -Credential $me

Get-CimInstance Win32_PhysicalMemoryArray -CimSession $session |
  Select-Object  PsComputerName, $MaxCapacity, MemoryDevices |
  Format-Table –AutoSize

Get-CimInstance Win32_PhysicalMemory -CimSession $session |
  Sort-Object PsComputerName |
  Select-Object PsComputerName, DeviceLocator, $capacity, speed |
  Format-Table –AutoSize

Remove-CimSession $session

Üllatuste vältimiseks tasub veel ära mainida, et ülaltoodud tehnika abil saab kätte mitte ainult süsteemimälu, vaid võib leida ka muud, nagu näiteks videomälu jms.

Advertisements