我正在编写一个函数,该函数返回我们网络中的所有在线计算机,因此我可以执行以下操作:
Get-OnlineComputers | % { get-process -computername $_ }
现在,我基本上已经准备好了函数,但是花费的时间太长了。
我只想返回激活了WinRM的计算机,但是我还想提供一个选项,使每台计算机都没有安装WinRM(开关参数)。
这是我的职责首先,它会向domaincontroller创建pssession,以使所有计算机都进入我们的LAN。然后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)
{
$_
}
}
}
这是检查在线计算机的最佳方法吗?有谁有更快更好的主意吗?
谢谢!
最佳答案
非常快速的解决方案是使用-Quiet
cmdlet的Test-Connection
参数:
因此,例如:
$ping = Test-Connection "Computer" -Quiet -Count 1
if ($ping)
{
"Online"
}
else
{
"Offline"
}
如果不够快,可以使用
Send
的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
}
关于在多台计算机上执行它,我建议使用RunSpaces,因为它是使用PowerShell可以获得的最快的多线程处理,
有关更多信息,请参见:
Runspaces vs Jobs
Basic Runspaces implemenation
关于powershell - 在线获取计算机的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40972814/