Da diese Frage geschlossen ist (wo ich zuerst antworten wollte), öffne ich diese.
Auf einigen Computern ist es verboten, Binärdateien zu installieren/herunterzuladen, daher möchte ich wissen, wie ich überprüfen kann, ob ein Port auf einem Remotecomputer nur mit systemeigenen Windows-Skriptfunktionen geöffnet ist.
Erschreckenderweise bietet Windows keine einfachen Tools zum Überprüfen, ob der Port auf einem Remoteserver geöffnet ist.
Eine Option ist Telnet, aber es kann kein Skript erstellt werden, da es geschlossen wird, wenn seine Ausgabe umgeleitet oder erfasst wird. Es war einmal ein MSWinsock.Winsock.1 COM-Objekt auf Windows-Computern installiert, das in einem Skript verwendet werden konnte, aber nicht mehr. PortQry und PsPing sind wunderbare Tools, aber Sie müssen sie noch herunterladen (obwohl sie von Microsoft bereitgestellt werden).
Am einfachsten ist es also, sich auf PowerShell zu verlassen.
Hier ist der Code für ein einfaches .bat Skript, das intern Powershell verwendet, um die Arbeit zu erledigen:
@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%
Auf einigen Computern ist .NET Framework ohne PowerShell installiert. In diesem Fall kann C # -Code mit msbuild in ein Stapelskript eingebettet werden:
<!-- :
@echo off
:: checks if a port on a remote server is open
:: returns errorlevel 1 if it's closed
setlocal
for %%h in (/h /help -help -h "") do (
if /I "%~1" equ "%%~h" (
goto :printHelp
)
)
if "%~2" equ "" goto :printHelp
set "Host=%~1"
set /a PORT=%~2
:::::: Starting C# code :::::::
:: searching for msbuild location
for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do set "msb=%%#"
if not defined msb (
echo No .NET framework installed
endlocal & exit /b 10
)
rem :::::::::: calling msbuid :::::::::
call %msb% /nologo /noconsolelogger "%~dpsfnx0"
rem ::::::::::::::::::::::::::::::::::::
endlocal & exit /b %errorlevel%
:printHelp
echo Checks if port is open on a remote server
echo(
echo Usage:
echo %~nx0 Host port
echo(
echo If the port is not accessible an errorlevel 1 is set
endlocal & exit /b 0
-->
<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
<Target Name="_"><_/></Target>
<UsingTask TaskName="_" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" >
<Task>
<Using Namespace="System" />
<Using Namespace="System.Net.Sockets" />
<Code Type="Method" Language="cs"><![CDATA[
public override bool Execute(){
String Host=Environment.GetEnvironmentVariable("Host").ToLower();
int port=Int32.Parse(Environment.GetEnvironmentVariable("PORT"));
Console.WriteLine("Checking Host {0} and port {1}",Host,port);
using(TcpClient client = new TcpClient()) {
try {
client.Connect(Host, port);
} catch(Exception) {
Console.WriteLine("Closed");
return false;
}
client.Close();
Console.WriteLine("Open");
return true;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
Was die Maschinen ohne .NET Framework betrifft, kenne ich keine systemeigene Methode zum Überprüfen von Remote-Ports.
Wenn Sie nur TCP Ports prüfen möchten, können Sie Test-NetConnection verwenden. If bietet einen -Port
-Parameter zum Definieren des TCP -Ports.
Diese Befehle könnten in Powershell verwendet werden:
New-Object System.Net.Sockets.TcpClient("123.12.12.123", 22)
New-Object System.Net.Sockets.UdpClient("123.12.12.123", 22)