2016-12-21 148 views
9

テスト接続が断続的リソース・エラーの不足で失敗します。その結果PowerShellはテスト・コネクションは、リソース不足のため失敗した

test-connection : Testing connection to computer 'SOMESERVER' failed: Error due to lack of resources 
At line:1 char:45 
+ ... ($server in $ServersNonProd.Name) { test-connection $server -Count 1} 
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ResourceUnavailable: (SOMESERVER:String) [Test-Connection], PingException 
    + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand 

リストをテストする必要があるとき、それは信頼性が高く、かなり役に立ちませんループ内のコンピュータの数。この機能を確実に使用するための修正プログラム、代替方法、または回避策はありますか?

これは私の現在の解決策ですが、依然として十分な信頼性がありません(時には5回連続して失敗することがあります)。すべての遅延と再試行のために永遠にかかることがあります。

$Servers = Import-CSV -Path C:\Temp\Servers.csv 

$result = foreach ($Name in $Servers.FQDN) { 
    $IP = $null 
    if (Resolve-DNSName $Name -ErrorAction SilentlyContinue) { 
     $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 100 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 200 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 300 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 400 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
    } 
    new-object psobject -Property @{FQDN = $Name; "IP Address" = $IP} 
} 

通常のping(PING.EXEは)毎回作品なので、PowerShellを使用しているを解析するための良い方法があるかどう(IPが応答しているものを、上下にホストまたは)、理想的なソリューションのように思えることが、私はちょうど働くものが必要なので、私はアイデアを公開しています。

+0

まあ、それはかなり奇妙に見えるので、do-whileループを実装することができますが、根本的な原因と戦うことをお勧めします。あなたはそれを修正しようとしましたか? '/ sfc scannow'は少なくとも?何か?PS5にアップグレードしますか? – 4c74356b41

+1

実際にこれを見たことがありますが、修正プログラムを見つけることができませんでしたが、再起動するとiircが一般的にそれを修正します(私は間違っている可能性があり、1年以上経過しています)。 PSv2に影響を与えるだけの問題を覚えているようだ(再び間違っているかもしれない) –

+1

'-Quiet'や' -ErrorAction SilentlyContinue'、あるいはその両方を使うのはいかがですか?これは、リモートホスト上の 'WMI'障害によって引き起こされる可能性があります。そして '-Count 1 'は必ずしも信頼できるとは限りません。私の通常の行: 'if(Test-Connection $ host -Quiet -Count 2 -EA 0){#...}'は、チャームのように動作します。 – sodawillow

答えて

6

新しいバージョンのPowerShellではTest-Connection-Quietパラメータは常にTrueまたはFalseのいずれかを返すようです。古いバージョンで一貫して動作していないようでしたが、私は今、異なった何かをやっているか、彼らはそれを改善してきた次のいずれか

$Ping = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet 

ネットワークは、単に利用できない場合、私は最近、それをテストしていませんが、しかし、 。


古い答え:DNSアドレス場合、またはネットワークが利用できないと応答しない場合

Test-Connectionがうまく反応しません。つまり、コマンドレットがpingをまったく送信できないと判断すると、トラップまたは無視するのが困難な不快な方法でエラーが発生します。 Test-Connectionは、DNSが名前をアドレスに解決し、ネットワークが常に存在することを保証できる場合にのみ有効です。

$Ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$ComputerName' AND Timeout=1000"; 

またはCIMピング:

私はWMI pingを使用する傾向がある

$Ping2 = Get-CimInstance -ClassName Win32_PingStatus -Filter "Address='$ComputerName' AND Timeout=1000"; 

そのどちらも基本的に同じであるが、物事のために、わずかに異なるフォーマットを返します。 @BenHを説明

$StatusCodes = @{ 
    [uint32]0  = 'Success'; 
    [uint32]11001 = 'Buffer Too Small'; 
    [uint32]11002 = 'Destination Net Unreachable'; 
    [uint32]11003 = 'Destination Host Unreachable'; 
    [uint32]11004 = 'Destination Protocol Unreachable'; 
    [uint32]11005 = 'Destination Port Unreachable'; 
    [uint32]11006 = 'No Resources'; 
    [uint32]11007 = 'Bad Option'; 
    [uint32]11008 = 'Hardware Error'; 
    [uint32]11009 = 'Packet Too Big'; 
    [uint32]11010 = 'Request Timed Out'; 
    [uint32]11011 = 'Bad Request'; 
    [uint32]11012 = 'Bad Route'; 
    [uint32]11013 = 'TimeToLive Expired Transit'; 
    [uint32]11014 = 'TimeToLive Expired Reassembly'; 
    [uint32]11015 = 'Parameter Problem'; 
    [uint32]11016 = 'Source Quench'; 
    [uint32]11017 = 'Option Too Big'; 
    [uint32]11018 = 'Bad Destination'; 
    [uint32]11032 = 'Negotiating IPSEC'; 
    [uint32]11050 = 'General Failure' 
    }; 
$StatusCodes[$Ping.StatusCode]; 
$StatusCodes[$Ping2.StatusCode]; 

代わりに、私が使用したネットピングのように、あまりにも、あなたのためにその多くの作業を行いいる:ここでの主な欠点は、ステータスコードを自分で解決しなければならないということです。私がWMIとCIMのためにそれらを使用するのを止めた理由がありましたが、私はもはやその理由が何であるか覚えていません。

+0

.NETのpingが冗長なエラーを返さないことが原因である可能性があります。これは主に成功またはTimedOutであるようですが、他のエラーコードが返されるかどうかを調べるためには、 – dragon788

+0

@ dragon788はい、それらのネットワーク状態のほとんどは簡単に再現するのが非常に難しいです。 –

8

私はあなたがTTL /フラグメンテーションを設定する必要がある場合Sendメソッドは、追加のパラメータを取ることができること.Net Ping classではなくTest-Connection

$Timeout = 100 
$Ping = New-Object System.Net.NetworkInformation.Ping 
$Response = $Ping.Send($Name,$Timeout) 
$Response.Status 

注意を使用する部分です。また、タイムアウトはミリ秒単位で、$ nameだけで5秒と思っています。これは通常は長すぎます。

関連する問題