2016-12-21 30 views
9

Test-kết nối liên tục không thành công với một thiếu lỗi nguồn:Powershell - Test-Kết nối thất bại do thiếu nguồn lực

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 

Kết quả là, nó không phải là đáng tin cậy và khá vô dụng khi bạn cần phải kiểm tra một danh sách của máy tính trong một vòng lặp. Có cách khắc phục, thay thế hoặc giải pháp để có được chức năng này đáng tin cậy không?

Đây là giải pháp hiện tại của tôi, nhưng nó vẫn không đủ tin cậy (đôi khi họ vẫn thất bại 5 lần liên tiếp) và phải mất mãi mãi vì tất cả sự chậm trễ và thử lại.

$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} 
} 

Một ping bình thường (ping.exe) hoạt động mọi thời gian, vì vậy nếu có một cách tốt để phân tích rằng với PowerShell (đăng cai lên hoặc xuống, những gì IP được đáp ứng), mà có vẻ như là giải pháp lý tưởng, nhưng Tôi chỉ cần một cái gì đó mà làm việc, vì vậy tôi mở cửa cho ý tưởng.

+0

tốt, có vẻ khá lạ, do đó, để làm việc xung quanh bạn có thể triển khai vòng lặp 'do-while', nhưng tôi khuyên bạn nên chống lại nguyên nhân gốc rễ. Giống như những gì bạn đã cố gắng sửa chữa nó? '/ sfc scannow' ít nhất? có gì không?Nâng cấp lên PS5? – 4c74356b41

+1

Đã thực sự thấy điều này trước đây nhưng không bao giờ có thể xác định vị trí sửa chữa, mặc dù iirc khởi động lại nói chung sẽ sửa nó (tôi có thể sai, đã hơn một năm) Ngoài ra bạn đang chạy phiên bản PS nào? dường như để nhớ vấn đề chỉ ảnh hưởng đến PSv2 (một lần nữa, có thể là sai lầm) –

+1

Làm thế nào về việc sử dụng '-Quiet' hoặc' -ErrorAction SilentlyContinue' hoặc cả hai? Điều này có thể do lỗi 'WMI' trên máy chủ từ xa gây ra. Và '-Count 1' không phải lúc nào cũng đáng tin cậy. Dòng thông thường của tôi: 'if (Test-Connection $ host -Quiet -Count 2 -EA 0) {# ...}', hoạt động như một nét duyên dáng. – sodawillow

Trả lời

6

Trong phiên bản PowerShell mới hơn, thông số -Quiet trên Test-Connection dường như luôn trả về True hoặc False. Dường như nó không hoạt động liên tục trên các phiên bản cũ hơn, nhưng tôi đang làm một cái gì đó khác biệt ngay bây giờ hoặc họ đã cải thiện nó:

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

Tôi chưa thử nghiệm nó gần đây khi mạng đơn giản là không có, tuy nhiên .


câu trả lời cũ hơn:

Test-Connection không đáp ứng tốt khi DNS không phản ứng với một địa chỉ hoặc khi không có mạng. Nghĩa là, nếu cmdlet quyết định nó không thể gửi ping chút nào, nó sẽ sai sót theo những cách khó chịu khó bẫy hoặc bỏ qua. Test-Connection chỉ hữu ích, khi đó, khi bạn có thể đảm bảo rằng DNS sẽ giải quyết tên cho một địa chỉ và mạng đó sẽ luôn có mặt.

tôi có xu hướng sử dụng ping WMI:

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

Hoặc CIM Ping:

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

Hoặc trong số đó là về cơ bản giống nhau, nhưng quay trở lại các định dạng hơi khác nhau cho mọi thứ. Những bất lợi chính ở đây là bạn phải giải quyết các mã trạng thái bản thân:

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

Cách khác, tôi đã sử dụng Net Ping như @BenH mô tả, quá, mà hiện rất nhiều mà làm việc cho bạn. Có một lý do khiến tôi ngừng sử dụng chúng để ủng hộ WMI và CIM, nhưng tôi không còn nhớ lý do đó là gì nữa.

+0

Có khả năng là do các ping .NET không trả lại các lỗi tiết, nó dường như chủ yếu là Success hoặc TimedOut, mặc dù tôi chưa thử nghiệm với một mạng flaky để xem nó có trả về một số mã lỗi khác hay không. – dragon788

+0

@ dragon788 Có, hầu hết các trạng thái mạng này rất khó tạo lại dễ dàng. –

8

Tôi là một phần để sử dụng chứ không phải là .Net Ping classTest-Connection

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

Lưu ý rằng Send phương pháp có thể lấy các thông số bổ sung nếu bạn cần phải thiết lập TTL/Phân mảnh. Ngoài ra thời gian chờ tính bằng mili giây, chỉ với $ name thời gian chờ mà tôi nghĩ là 5 giây, thường là quá dài.

Các vấn đề liên quan