PowerShell批量扫描IP和端口

  

前面的文章中曾经发布了对指定IP进行批量端口扫描的方法和脚本,过PowerShell收发TCP和UDP消息包的方法以及通过PowerShell尝试登录服状态"置疑"务的方法,这构成了PSNet程序集用于通过PowerShell对网络状态进行操作。最近在不断尝试之下,找到了对指定范围的IP段进行扫描和对端口进行扫描的方法,本文将会介绍如何通过PowerShell批量扫描IP及其对应的端口。

依然在PSNet程序集的基础上进行扩展,首先在$ env: PSSpace/PSNet TCPOp下创建脚本文件Invoke-ScanIPPort.ps1,并在$ env: PSSpace/PSNet TCPOp/PSNet。psm1中添加对脚本文件的调用:

。美元env: PSSpace/PSNet/TCPOp/Invoke-ScanIPPort。ps1

首先对后面代码中将会出现的变量进行介绍:
-StartAddress[扫描的起始IP地址],与-EndAddress配合使用,【此参数必须】
-EndAddress[扫描的结束IP地址],【此参数必须】
-ResolveHost[是否尝试对主机名尝试进行解析]
-ScanPort[是否进行端口扫描],如果要扫描端口此选项必须
-AllPort[是否对所有端口进行扫描],范围为1~65534(注意此选项扫描时间很长建议在选中单个IP的情况下进行使用,并且尽量少使用)
-StartPort[扫描的起始端口端口],与-EndPort配合使用,如果此选项与-Ports选项同时存在则-Port参数失效
-EndPort[扫描的结束端口]
-Ports扫描时默认扫描的端口,如果后续不带参数则仅扫描21,22,23,53,69,71,80,98,110,139,111,389,443,445,1080,1433,2001,2049,
3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901如果后续带多个以逗号分割的多个数字则会扫描数字对应的端口,如果只扫描默认的端口,则不需此参数
-TimeOut超时时间,默认值为100ms(毫秒)

此函数的调用方式如下:
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254#扫描IP段
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 –ResolveHost#扫描IP段,并尝试解析IP对应主机名
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost –ScanPort#扫描IP段,并尝试扫描默认端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost -ScanPort -TimeOut 50 #扫描IP段,尝试扫描默认端口,端口扫描50ms超时
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ResolveHost -ScanPort -Port 80 #扫描IP段,并尝试扫描80端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.1 -ResolveHost -ScanPort –AllPort#扫描ip,并尝试扫描所有1~65534之间端口
Invoke-ScanIPPort -StartAddress 192.168.10.1 -EndAddress 192.168.10.254 -ScanPort -StarPort 21 -EndPort 81#扫描IP段之间主机所有21至81之间的端口

上图来一张扫描过程中的图片
PowerShell批量扫描IP和端口

扫描结束后的结果:

PowerShell批量扫描IP和端口
代码如下:

  函数Invoke-ScanIPPort {
  参数(
  (参数(强制性=$真的,
  位置=0))
  [ValidatePattern (“\ b \ d {1,3} \ \ d {1,3} \。。\ d {1,3} \ \ d {1,3} \ b"。。))
  [string] StartAddress美元,
  (参数(强制性=$真的,
  位置=1)
  [ValidatePattern (“\ b \ d {1,3} \ \ d {1,3} \。。\ d {1,3} \ \ d {1,3} \ b"。。))
  [string] EndAddress美元,
  (开关)ResolveHost美元,
  (开关)ScanPort美元,
  (开关)AllPort美元,
  (int) StartPort美元,
  (int) EndPort美元,
  [int[]] $端口=@(21日,22日,23日,53岁,69,71,80,98110139111389443445,1080,1433,2001,2049,3001,3128,5222,6667,6868,7777,7878,8080,1521,3306,3389,5801,5900,5555,5901),
  (int)超时=100美元
  )
  开始{
  $萍=新对象System.Net.Networkinformation.Ping
  }
  过程{
  foreach(美元)(美元StartAddress.Split (“!”) [0] . . EndAddress.Split美元(“!”)[0])){
  foreach (b美元($ StartAddress.Split (“!”) [1] . . EndAddress.Split美元(“!”)[1])){
  foreach ($ c (StartAddress.Split美元(“!”)[2]. . EndAddress.Split美元(“!”)[2])){
  foreach ($ d (StartAddress.Split美元(“!”)[3]. . EndAddress.Split美元(“!”)[3])){
  ip=耙幻涝。c。美元d"美元;
  write-progress活动“ScanIP Ping"地位“ip"美元;-percentcomplete (d/美元($ EndAddress.Split (“!”) [3])) * 100)
  pingStatus=ping.Send美元(“ip"美元;,超时美元)
  如果(pingStatus美元。地位eq“Success") {
  如果(ResolveHost美元){
  write-progress活动ResolveHost地位“ip"美元;-percentcomplete (d/美元($ EndAddress.Split (“!”) [3])) * 100) id 1
  $ getHostEntry=[Net.DNS]:: BeginGetHostEntry (pingStatus美元。地址、空,空美元)
  }
  如果(ScanPort美元){
  如果(AllPort美元){
  $=@港口(1 . . 65534)
  }
  如果($ StartPort - ne零——EndPort美元- ne零美元){
  $=@港口(StartPort . . EndPort美元)
  }
  $ openPorts=@ ()
  (i=1美元;我勒Ports.Count美元;$ i + +) {
  $=$港港口[张($)
  write-progress活动“端口搜索result"美元(美元港口);地位“ip"美元;-percentcomplete (($ i/(Ports.Count美元))* 100)id 2
  $客户=新对象System.Net.Sockets.TcpClient
  beginConnect=client.BeginConnect美元(pingStatus.Address,港口,美元零美元,美元零)
  如果(client.Connected美元){
  openPorts +=美元港口
  其他}{
  #等
  美元起得毫超时
  如果(client.Connected美元){
  openPorts +=美元港口
  长度=openPorts.length美元
  美元$=敖峁鸞发现长度港口。港港口美元]“;
  }
  }
  $ client.Close ()
  }
  }
  如果(ResolveHost美元){
  主机名=美元([Net.DNS]:: EndGetHostEntry ([IAsyncResult] getHostEntry)美元).HostName
  }
  #返回对象
  如果($ openPorts - ne零美元)
  {
  write-host“IPAddress"“ip"美元;
  如果($ getHostEntry - ne零美元)
  {write-host“HostName"$ getHostEntry}
  write-host“Ports"openPorts美元
  }
  }
  }
  }
  }
  }
  }
  {结束
  }
  }

PowerShell批量扫描IP和端口