2016-12-05 71 views
0

我正在寫返回所有聯機計算機在我們的網絡功能以最快的方式,所以我可以做這樣的東西:什麼是上網電腦

Get-OnlineComputers | % { get-process -computername $_ } 

現在我基本上得到了我的功能準備好了,但它太長了。 我想只返回有WinRM活動的計算機,但我也想提供讓每臺計算機甚至沒有WinRM設置(切換參數)的選項。

這是我的功能。首先它爲域控制器創建一個pssession,讓我們的局域網中的所有計算機。然後在計算機上,它會測試他們是否有WinRM活動或者他們是否接受ping。如果是的話,它會被返回。

$session = New-PSSession Domaincontroller 
$computers = Invoke-Command -Session $session { Get-ADComputer -filter * } | select -ExpandProperty Name 

$computers | % { 
    if ($IncludeNoWinRM.IsPresent) 
    { 
     $ErrorActionPreference = "SilentlyContinue" 
     $ping = Test-NetConnection $_ 
     if ($ping.PingSucceeded -eq 'True') 
     { 
      $_ 
     }  
    } 
    else 
    { 
     $ErrorActionPreference = "SilentlyContinue" 
     $WinRM = Test-WSMan $_ 
     if ($WinRM) 
     { 
      $_ 
     } 
    } 
} 

這是我可以去檢查我的在線電腦的最佳方式嗎?有沒有人有更快更好的主意?

謝謝!

+1

我會先測試他們是否接受ping。那麼你知道他們是否在線,如果是,你可以檢查WinRM。我可能是錯的,但也許這會加快它 – XtremeBaumer

+0

oops - 爲什麼我得到一個downvote?我可以在我的問題中改進什麼? – SimonS

回答

3

非常快速的解決方案:

所以例如:

$ping = Test-Connection "Computer" -Quiet -Count 1 
if ($ping) 
{ 
"Online" 
} 
    else 
    { 
    "Offline" 
    } 

如果它不夠快,您可以使用的System.Net.NetworkInformation.Ping

這裏方法是一個示例函數:

Function Test-Ping 
{ 
Param($computer = "127.0.0.1") 
    $ping = new-object System.Net.NetworkInformation.Ping 
    Try 
    { 
    [void]$ping.send($computer,1) 
    $Online = $true 
    } 

    Catch 
    { 
    $Online = $False 
    } 

    Return $Online 
} 

關於執行它在多臺電腦,我建議使用的運行空間,因爲它是最快的多線程,你可以使用PowerShell得到,

更多詳情請參閱:

Runspaces vs Jobs

Basic Runspaces implemenation

+0

非常好。我會嘗試你的建議,並接受這個答案。如果我能告訴我關於RunSpaces的信息,我會再給你一個+1。很有意思! – SimonS

+0

@simons我寧願去與Posh-RSJob,因爲它處理所有的痛苦與運行空間,然後嘗試實現運行空間。 – 4c74356b41

0

開始使用Posh-RSJob來平行執行,這樣做可以大大提升性能。 所以您的代碼會是這個樣子:

$computers | % {Start-RSJob -Name {$using:_.Name} -ScriptBlock { 
    Yourcodehere 
    } 
} 

Get-RSjob | Receive-RSJob 

請注意,你將不得不使用-Quiet參數Test-Connection cmdlet的調用變量與$using:variablename

+1

使用PowerShell隨附的常規'* -Job' cmdlet基本上可以做到這一點。也許效率稍差,但不需要先安裝第三方模塊。 –

+0

從我的經驗來看,效率低得多,特別是當我們談論數百個調用時。 – 4c74356b41

+0

運行空間已經是原生的,但模塊只是圍繞它們包裝一些很好的語法。常規的開始工作將會加載另一個完整的powershell實例,runspaces會在同一個powershell進程中啓動另一個線程,並且對於原始海報提到的同時工作非常理想,因爲它對系統資源更爲友善,速度更快。 –

0

Boe Prox(運行空間的主人)已經撰寫了一個可從Powershell Gallery獲取的函數。我已經鏈接下面的腳本。

他使用了許多已經給出的答案來實現同時檢查100個計算機的名稱。如果測試連接成功,腳本將獲取WMI網絡信息。應該很容易適應獲得任何你想要的信息,或者只是返回測試連接的結果。

該腳本實際上使用運行空間池而不是直接運行空間來限制循環可以產生的併發線程數量。

Boe還寫了已經引用的PoSH-RSJob模塊。這個腳本將實現你想要的本地PoSH而不必安裝他的模塊。

https://gallery.technet.microsoft.com/scriptcenter/Speedy-Network-Information-5b1406fb

相關問題