我正在编写一个返回网络中所有在线计算机的函数,因此我可以执行以下操作:
Get-OnlineComputers | % { get-process -computername $_ }
Run Code Online (Sandbox Code Playgroud)
现在我基本上已经准备好了我的功能,但是花费的时间太长了。我只想返回启用 WinRM 的计算机,但我还想提供选项来获取每台计算机,甚至是那些尚未设置 WinRM 的计算机(切换参数)。
这是我的职责。首先,它创建一个到域控制器的会话,以获取 LAN 中的所有计算机。然后对于每台计算机,它将测试它们是否激活了 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)
{
$_
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我检查在线计算机的最佳方式吗?有人有更快更好的想法吗?
谢谢!
非常快速的解决方案是使用cmdlet-Quiet的参数Test-Connection:
例如:
$ping = Test-Connection "Computer" -Quiet -Count 1
if ($ping)
{
"Online"
}
else
{
"Offline"
}
Run Code Online (Sandbox Code Playgroud)
如果对你来说还不够快,你可以使用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
}
Run Code Online (Sandbox Code Playgroud)
关于在多台计算机上执行它,我建议使用 RunSpaces,因为它是使用 PowerShell 可以获得的最快的多线程,
欲了解更多信息,请参阅:
| 归档时间: |
|
| 查看次数: |
5293 次 |
| 最近记录: |