C# 如何在带有批处理文件且没有第三方软件的远程服务器上检查端口是否打开?

C# 如何在带有批处理文件且没有第三方软件的远程服务器上检查端口是否打开?,c#,windows,powershell,batch-file,cmd,C#,Windows,Powershell,Batch File,Cmd,既然已经结束了(我打算先回答的地方),我就打开这个 在某些机器上,禁止安装/下载二进制文件,因此我想知道如何仅使用本机windows脚本功能检查远程机器上的端口是否打开。令人沮丧的是,windows不提供简单的工具来检查远程服务器上的端口是否打开 其中一个选项是telnet,但无法编写脚本,因为在重定向或捕获其输出时它会关闭。很久以前,在Windows机器上安装了一个MSWinsock.Winsock.1COM对象,可以在脚本中使用,但不能再使用了。和是一个很棒的工具,但是你仍然需要下载它们(尽

既然已经结束了(我打算先回答的地方),我就打开这个


在某些机器上,禁止安装/下载二进制文件,因此我想知道如何仅使用本机windows脚本功能检查远程机器上的端口是否打开。

令人沮丧的是,windows不提供简单的工具来检查远程服务器上的端口是否打开

其中一个选项是telnet,但无法编写脚本,因为在重定向或捕获其输出时它会关闭。很久以前,在Windows机器上安装了一个MSWinsock.Winsock.1COM对象,可以在脚本中使用,但不能再使用了。和是一个很棒的工具,但是你仍然需要下载它们(尽管它是由微软提供的)

因此,最简单的方法是依靠PowerShell。
下面是一个简单的.bat脚本的代码,该脚本在内部使用Powershell完成任务:

@echo off

::Must be without quotes. If you intend to use command line arguments use %~1
set "host=google.com"
set /a port=443

for /f %%a in ('powershell "$t = New-Object Net.Sockets.TcpClient;try{$t.Connect("""%host%""", %port%)}catch{};$t.Connected"') do set "open=%%a"
:: or simply
:: powershell "$t = New-Object Net.Sockets.TcpClient;try{$t.Connect("""%host%""", %port%)}catch{};$t.Connected"
echo Open: %open%
有些机器的.NET framework没有安装PowerShell,因此在这种情况下,可以使用以下方法将C#代码嵌入到批处理脚本中:


也可以检查-它依赖于jscript.net创建一个小的可执行文件,并且可以与相同的命令行界面一起使用。可能更便于移植,因为它可以在较旧的系统上使用,并且代码更易于阅读。

如果您只想检查可以使用的TCP端口。If提供了一个
-Port
参数来定义TCP端口

这些命令可在Powershell中使用:

New-Object System.Net.Sockets.TcpClient("123.12.12.123", "22")
New-Object System.Net.Sockets.UdpClient("123.12.12.123", "22")

是 啊我知道-但这是一个powershell 4 cmd let,我想让它尽可能向后兼容。+1无论如何。
C:\>checkport.bat google.com 443
Checking host google.com and port 443
Open

C:\>checkport.bat google.com 666
Checking host google.com and port 666
Closed
New-Object System.Net.Sockets.TcpClient("123.12.12.123", "22")
New-Object System.Net.Sockets.UdpClient("123.12.12.123", "22")