WMI查询需要很长时间

时间:2016-08-18 14:04:50

标签: powershell wmi wql xenapp

我正在查询大约280台XenApp服务器。这是我的疑问。

$bootupMemory = gwmi -Query "SELECT * FROM Win32_OperatingSystem" -ComputerName $srv
#$cpuLoad      = gwmi -Query "SELECT * FROM Win32_Processor" -ComputerName $srv
#$tSessions    = gwmi -Query "SELECT * FROM Win32_TerminalService" -ComputerName $srv
$ima          = gwmi -Query "SELECT * FROM Win32_Service WHERE name='imaservice'" -ComputerName $srv 
$mfcom        = gwmi -Query "SELECT * FROM Win32_Service WHERE name='mfcom'" -ComputerName $srv
$ctxPrintMgr  = gwmi -Query "SELECT * FROM Win32_Service WHERE name='cpsvc'" -ComputerName $srv
$msmqstatus   = gwmi -Query "SELECT * FROM Win32_Service WHERE name='msmq'" -ComputerName $srv

$cDrive       = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='c:'" -ComputerName $srv
$dDrive       = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='d:'" -ComputerName $srv
$loginStatus  = gwmi -Query "SELECT loginsenabled, numberofsessions FROM Metaframe_Server" -Namespace root\citrix -ComputerName $srv
$load         = gwmi -Query "SELECT * FROM Metaframe_Server_loadlevel" -Namespace root\citrix -ComputerName $srv

您能否建议这是最佳还是我可以优化它。 另外,如何在每个查询中加入超时参数。这可能吗?

1 个答案:

答案 0 :(得分:5)

针对同一主机对同一个类运行多个查询肯定不是最佳选择。您可以通过合并同一类的查询的WHERE子句来在一定程度上优化代码:

SELECT * FROM Win32_Service WHERE name='imaservice' OR name='mfcom' OR name='cpsvc' OR name='msmq'

但是,由于您仍需要查询几个不同的类,我建议在远程主机上运行整个代码并将结果作为自定义对象返回:

$result = Invoke-Command -ComputerName $srv -ScriptBlock {
  New-Object -Type PSObject -Property @{
    computername = $env:COMPUTERNAME
    bootupMemory = gwmi -Query "SELECT * FROM Win32_OperatingSystem"
    #cpuLoad      = gwmi -Query "SELECT * FROM Win32_Processor"
    #tSessions    = gwmi -Query "SELECT * FROM Win32_TerminalService"
    ima          = gwmi -Query "SELECT * FROM Win32_Service WHERE name='imaservice'"
    mfcom        = gwmi -Query "SELECT * FROM Win32_Service WHERE name='mfcom'"
    ctxPrintMgr  = gwmi -Query "SELECT * FROM Win32_Service WHERE name='cpsvc'"
    msmqstatus   = gwmi -Query "SELECT * FROM Win32_Service WHERE name='msmq'"
    cDrive       = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='c:'"
    dDrive       = gwmi -Query "SELECT * FROM Win32_Logicaldisk WHERE deviceid='d:'"
    loginStatus  = gwmi -Query "SELECT loginsenabled, numberofsessions FROM Metaframe_Server" -Namespace root\citrix
    load         = gwmi -Query "SELECT * FROM Metaframe_Server_loadlevel" -Namespace root\citrix
  }
}

在单独的job中为每个服务器运行Invoke-Command以并行运行查询,从而缩短整体处理时间。

Start-Job -ScriptBlock {
  Invoke-Command -ComputerName $args[0] -ScriptBlock {
    New-Object ...
  }
} -ArgumentList $srv

Get-Job | Wait-Job | Receive-Job

或(正如Mathias在评论中所建议的那样)

Invoke-Command -ComputerName $srv -AsJob -ScriptBlock {
  New-Object ...
}

Get-Job | Wait-Job | Receive-Job
相关问题