powershell - 在线获取计算机的最快方法是什么

标签 powershell

我正在编写一个函数,该函数返回我们网络中的所有在线计算机,因此我可以执行以下操作:

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"
     }

如果不够快,可以使用SendSystem.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/

相关文章:

powershell - 如何获得 PowerShell 附加类型以使用附加类型

powershell - 在 powershell 中使用 Azure CLI 创建 CosmosDB

powershell - Azure管道:基于OS的条件环境变量

powershell - 计算包含所有匹配字符串的文件,即 AND 运算符?

windows - 计划任务 : setting a working directory?

powershell - $_ 和 [parameter(ValueFromPipeline=$true)] 之间的奇怪区别

arrays - Powershell 比较 2 个具有不同属性的数组

powershell - 在 Powershell 中设置 PSDrive 的名称

powershell - 安全使用 Update-FormatData?

c# - 在 C# cmdlet 中创建 PowerShell PSObject