【问题标题】:How can I automate Telnet port checking in Powershell?`如何在 Powershell 中自动执行 Telnet 端口检查?
【发布时间】: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 建议工作的代码。谢谢你们的帮助,伙计们!

标签: powershell tcp port telnet


【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 2010-10-11
      • 2017-10-06
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 2011-02-07
      • 2011-10-18
      • 2023-01-04
      相关资源
      最近更新 更多