web-dev-qa-db-ja.com

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が応答するもの)でそれを解析する適切な方法があれば、それは理想的なソリューションのように思えますが、私はただ機能するものが必要です、だから私はアイデアを受け入れています。

16
cscracker

PowerShellの新しいバージョンでは、-QuietパラメータのTest-Connectionは常にTrueまたはFalseを返すようです。それは古いバージョンでは一貫して動作するようには見えませんでしたが、私は今何か違うことをしているか、改善されています:

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

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


古い回答:

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

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

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

またはCIM Ping:

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

どちらも基本的に同じですが、物事のためにわずかに異なるフォーマットを返します。ここでの主な欠点は、ステータスコードを自分で解決する必要があることです。

$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];

別の方法として、@ BenHのような.Net Pingも使用しました。これは多くの作業を行います。 WMIとCIMを優先して使用を停止した理由がありましたが、その理由が何であるかを思い出せなくなりました。

11
Bacon Bits

私はTest-Connectionではなく 。Net Pingクラス を使用することに部分的です

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

TTL /フラグメンテーションを設定する必要がある場合、Sendメソッドは追加のパラメーターを使用できることに注意してください。また、タイムアウトはミリ秒単位で、$ nameだけでタイムアウトは5秒であると思いますが、これは通常長すぎます。

12
BenH

Windows IPヘルパーは、IP_REQ_TIMED_OUTエラーを値11010に定義しますが、これはWindowsシステムエラーWSA_QOS_ADMISSION_FAILURE 11010「リソース不足によるエラー」と同じです。そのため、問題のケースで実際に受け取ったのはタイムアウトエラーであり、単に「リソースの不足」と誤解された可能性があります。

7
wtom