如何在 Powershell 中自动执行 Telnet 端口检查?

Posted

技术标签:

【中文标题】如何在 Powershell 中自动执行 Telnet 端口检查?【英文标题】:How can I automate Telnet port checking in Powershell?` 【发布时间】:2014-12-03 08:55:31 【问题描述】:

我目前正在尝试编写一个脚本,用于查询 AD 以获取计算机列表,ping 计算机以确定哪些计算机仍处于活动状态,然后远程登录到所有可 ping 计算机上的特定端口。我正在寻找的输出是 AD 中可 ping 的计算机的完整列表,我无法通过 telnet 连接到所述端口。

我读过thesefewquestions,但他们并没有完全理解我想要做什么。我只是想看看telnet连接是否成功,无需进入telnet(或自动退出telnet),然后继续下一台机器测试。我脚本的 AD 和 ping 部分已设置,我只是被困在这里。我尝试过的事情并没有按计划进行。

如果需要,这里是脚本第一部分的代码:

Get-ADComputer -Filter * -SearchBase 'DC=hahaha,DC=hehehe' | ForEach 

$computerName = $_.Name

$props = @
    ComputerName = $computerName
    Alive = $false
    PortOpen = $false


If (Test-Connection -ComputerName $computerName -Count 1 -Quiet) 

    $props.Alive = $true

【问题讨论】:

here 的简单代码示例怎么样。你必须尝试一些连接来测试端口是否打开。 感谢您的建议,马特!我添加了该代码(经过调整以适合我所拥有的),但它返回每台计算机都关闭了端口,我知道这不是真的。我是 telnet 和 powershell 的相对新手,但我在这里确信我需要使用 telnet 才能真正做出我需要的决定。 telnet 命令的作用与@Matt 建议的代码完全相同。 要验证端口是否真的在目标机器上打开,在其上运行netstat -an | findstr LISTENING | findstr ":80"。这里 80 是您要查找的端口,因此请将其更改为所需的端口。如果该命令列出了您的端口,那么问题将出在防火墙上,很可能是目标框上的 Windows 防火墙。 Good ol' 用户错误。在我弄清楚我做错了什么(变量定义)后,我得到了@Matt 建议工作的代码。谢谢你们的帮助,伙计们! 【参考方案1】:

将此代码改编为您自己的代码是最简单的方法。此代码示例来自 PowerShellAdmin wiki。收集您要检查的计算机和端口。然后尝试使用Net.Sockets.TcpClient 在每个端口上连接到该计算机。

foreach ($Computer in $ComputerName) 

    foreach ($Port in $Ports) 

        # Create a Net.Sockets.TcpClient object to use for
        # checking for open TCP ports.
        $Socket = New-Object Net.Sockets.TcpClient

        # Suppress error messages
        $ErrorActionPreference = 'SilentlyContinue'

        # Try to connect
        $Socket.Connect($Computer, $Port)

        # Make error messages visible again
        $ErrorActionPreference = 'Continue'

        # Determine if we are connected.
        if ($Socket.Connected) 
            "$Computer: Port $Port is open"
            $Socket.Close()
        
        else 
            "$Computer: Port $Port is closed or filtered"  
        
        # Apparently resetting the variable between iterations is necessary.
        $Socket = $null
    

【讨论】:

【参考方案2】:

这是一个完整的 powershell 脚本,它将:

1. read the host and port details from CSV file
2. perform telnet test
3. write the output with the test status to another CSV file

清单.csv

remoteHost,port
localhost,80
asdfadsf,83
localhost,135

telnet_test.ps1

$checklist = import-csv checklist.csv
$OutArray = @()
Import-Csv checklist.csv |`
ForEach-Object  
    try 
        $rh = $_.remoteHost
        $p = $_.port
        $socket = new-object System.Net.Sockets.TcpClient($rh, $p)
     catch [Exception] 
        $myobj = "" | Select "remoteHost", "port", "status"
        $myobj.remoteHost = $rh
        $myobj.port = $p
        $myobj.status = "failed"
        Write-Host $myobj
        $outarray += $myobj
        $myobj = $null
        return
    
    $myobj = "" | Select "remoteHost", "port", "status"
    $myobj.remoteHost = $rh
    $myobj.port = $p
    $myobj.status = "success"
    Write-Host $myobj
    $outarray += $myobj
    $myobj = $null
    return

$outarray | export-csv -path "result.csv" -NoTypeInformation

结果.csv

"remoteHost","port","status"
"localhost","80","failed"
"asdfadsf","83","failed"
"localhost","135","success"

【讨论】:

以上是关于如何在 Powershell 中自动执行 Telnet 端口检查?的主要内容,如果未能解决你的问题,请参考以下文章

如何在powershell中执行击键?

powershell自动提示、快速跳转、代理设置

如何在 PowerShell 中输出内容

为自动执行设置 PowerShell 脚本

如何在windows 2008上安装powershell

操作AD内用户,powershell半自动化执行