2016-04-24 21 views
1

Schrieb ein kleines Skript, um die Nummer Multipaths von den Windows-Servern mit WMI-Abfrage zu finden. Es funktioniert gut für die Server, die direkt ohne irgendein Problem verbinden können. Aber wenn ein Server pingbar ist, aber nicht über das WMI-Skript erreichen kann, dauert es lange, bis der Fehler zurückgegeben wird (zB wenn ein Linux-Server-Hostname in der servers.txt-Liste vorhanden ist). Kann mir jemand helfen, das Gleiche zu tun auf eine schnellere Weise ..?Gibt es eine schnellere Methode, WMI-Abfrage von Powershell durchzuführen ..?

$Servers = Get-Content .\Servers.txt 

$ErrorActionPreference = ‘SilentlyContinue’ 

FOREACH ($Server in $Servers) { 

Write-Host $Server -nonewline 

if (test-connection -computername $Server -Count 1 -quiet) { 

$Name = $null 
$NoPath =$null 
$MPIODisks =$null 

$MPIODisks = Get-WmiObject -Namespace root\wmi -Class mpio_disk_info -ComputerName "$Server" |Select-Object "DriveInfo" 

    if ($MPIODisks -eq $Null) { 

    write-host "`t - Unable to connect" -fore "RED" 

    } else {  

     write-host "" 
     write-host "Drive Name `tNo.Path" -fore "yellow" 

      Foreach ($Disk in $MPIODisks) { 
       $mpiodrives = $disk.DriveInfo 

        foreach ($Drive in $mpiodrives) { 
       $Name = $Drive.Name 
       $NoPath = $Drive.Numberpaths 

        If ($NoPath -lt 4) { 
        Write-Host $Name `t -nonewline 
        write-host $NoPath -fore "Red" 
        } else { 
        Write-Host $Name `t -nonewline 
        write-host $NoPath -fore "Green" 
        } 
        } 
      } 

    } 

    write-host "" 

} else { 

write-host "`t- Unknown Host" -fore "Red" 
write-host "" 
} 

}

+0

Welche Version von Powershell verwenden, die auf dem Client und Server? –

+0

In neueren Versionen können Sie 'Get-CimInstance -OperationTimeoutSec' verwenden –

Antwort

3

Es gibt a connect item for Get-WmiObject to add a timeout parameter. Eine Problemumgehung in diesem Element besteht darin, den WMI-Befehl einfach an zu übergeben und eine Zeitüberschreitung in Sekunden anzugeben.

Solange Ihr auf PS-Version 3.0 oder höher, sollte dies für Sie arbeiten:

Get-WmiObject win32_computersystem -ComputerName <hostname> -AsJob | Wait-Job -Timeout 10 | Receive-Job 
2

Als Alternative können Sie auf einmal alle Server für das Ergebnis fragen könnte sie alle in die Abfrage, indem und Vermeiden Sie die langsame Schleife Abfrage von jeweils einem Server. Ich habe keine MPIO mit testen fährt, aber es könnte in etwa so aussehen (mit Get-Ciminstance, die ein Timeout-Parameter nehmen):

$servers = Get-Content .\Servers.txt 

# Get data from all servers with timeout 
$servers_ok = Get-CimInstance -computername $servers -Namespace root\wmi -Class mpio_disk_info -ErrorAction SilentlyContinue -OperationTimeoutSec 1 | group pscomputername 

# Output which servers gave no result back 
foreach($no_result in $($servers | where { $_ -NotIn $servers_ok.Name })) { 
    write-host "No result for $no_result" -ForegroundColor Red 
} 

# Loop over the results and output 
foreach($server in $servers_ok) { 

    Write-Host $server.Name 

    foreach($mpiodisk in $server.group)  { 

     $mpiodrives = $mpiodisk.DriveInfo 

     foreach ($mpiodrive in $mpiodrives) { 

      $name = $mpiodrive.Name 
      $noPath = $mpiodrive.NumberPaths 

      If ($NoPath -lt 4) { 
       write-host $name `t -nonewline 
       write-host $noPath -fore "Red" 
      } else { 
       write-host $name `t -nonewline 
       write-host $noPath -fore "Green" 
      } 
     } 
    } 
}