我正在写一个函数,它返回我们网络中的所有在线计算机,所以我可以做这样的事情:
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)
{
$_
}
}
}
这是我检查在线电脑的最佳方式吗?有没有人有更快更好的想法?
谢谢!
答案 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可以获得的最快的多线程,
有关详细信息,请参阅: