Last time we looked at using CIM sessions to make a set of WMI calls run quicker. This time we’ll reduce the number of calls. I’m deliberately just reducing the number of calls to the Win32_Service class. We’ll look at the disks another time
Our code becomes
Measure-Command -Expression {
$srvs = ‘W16TP5TGT01’, ‘W16TP5TGT02′
for ($i=1; $i -le 150; $i++){
foreach ($srv in $srvs) {
$cs = New-CimSession -ComputerName $srv
$bootupMemory = Get-CimInstance -Query “SELECT * FROM Win32_OperatingSystem” -CimSession $cs
$cpuLoad = Get-CimInstance -Query “SELECT * FROM Win32_Processor” -CimSession $cs
$tSessions = Get-CimInstance -Query “SELECT * FROM Win32_TerminalService” -CimSession $cs
$sfilt = “Name=’imaservice’ OR Name=’mfcom’ OR Name=’cpsvc’ OR Name=’msmq'”
$reqserv = Get-CimInstance -ClassName Win32_Service -Filter $sfilt -CimSession $cs
$ima = $reqserv | where Name -eq ‘imaservice’
$mfcom = $reqserv | where Name -eq ‘mfcom’
$ctxPrintMgr = $reqserv | where Name -eq ‘cpsvc’
$msmqstatus = $reqserv | where Name -eq ‘msmq’
$cDrive = Get-CimInstance -Query “SELECT * FROM Win32_Logicaldisk WHERE deviceid=’c:'” -CimSession $cs
$dDrive = Get-CimInstance -Query “SELECT * FROM Win32_Logicaldisk WHERE deviceid=’d:'” -CimSession $cs
Remove-CimSession -CimSession $cs
}
}
}
The change is to create a filter that pulls back JUST the services we want. Use that to create a collection of Win32_Service objects and then populate the variables with the required service data
Time drops dramatically
Days : 0
Hours : 0
Minutes : 6
Seconds : 50
Milliseconds : 133
Ticks : 4101339515
TotalDays : 0.0047469207349537
TotalHours : 0.113926097638889
TotalMinutes : 6.83556585833333
TotalSeconds : 410.1339515
TotalMilliseconds : 410133.9515
Total time goes from 539.42 seconds to 410.13 seconds. That’s reduced the time by 23.96%
These are just simple coding changes remember- we’re not performing any clever parallel processing here
The post Optimising WMI calls–part 2 appeared first on PowerShell for Windows Admins.