テスト接続はリソース不足エラーで断続的に失敗します:
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が応答するもの)でそれを解析する適切な方法があれば、それは理想的なソリューションのように思えますが、私はただ機能するものが必要です、だから私はアイデアを受け入れています。
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を優先して使用を停止した理由がありましたが、その理由が何であるかを思い出せなくなりました。
私はTest-Connection
ではなく 。Net Pingクラス を使用することに部分的です
$Timeout = 100
$Ping = New-Object System.Net.NetworkInformation.Ping
$Response = $Ping.Send($Name,$Timeout)
$Response.Status
TTL /フラグメンテーションを設定する必要がある場合、Sendメソッドは追加のパラメーターを使用できることに注意してください。また、タイムアウトはミリ秒単位で、$ nameだけでタイムアウトは5秒であると思いますが、これは通常長すぎます。
Windows IPヘルパーは、IP_REQ_TIMED_OUTエラーを値11010に定義しますが、これはWindowsシステムエラーWSA_QOS_ADMISSION_FAILURE 11010「リソース不足によるエラー」と同じです。そのため、問題のケースで実際に受け取ったのはタイムアウトエラーであり、単に「リソースの不足」と誤解された可能性があります。