什么是获取在线计算机的最快方式

时间:2016-12-05 11:06:34

标签: powershell

我正在写一个函数,它返回我们网络中的所有在线计算机,所以我可以做这样的事情:

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

现在我基本上已经准备好了我的功能,但它已经花了太长时间。 我想只返回WinRM处于活动状态的计算机,但我也希望提供让每台计算机都能安装WinRM(切换参数)的选项。

这是我的功能。首先,它为域控制器创建一个pssession,以获取局域网中的所有计算机。然后foreach计算机,它将测试他们是否有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 个答案:

答案 0 :(得分:3)

非常快速的解决方案正在使用-Quiet cmdlet的Test-Connection参数:

所以例如:

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

如果它不够快,您可以使用Send的{​​{1}}方法

这是一个示例函数:

System.Net.NetworkInformation.Ping

关于在多台计算机上执行它,我建议使用RunSpaces,因为它是PowerShell可以获得的最快的多线程,

有关详细信息,请参阅:

Runspaces vs Jobs

Basic Runspaces implemenation