首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

PowerShell 網路主機掃描腳本範例

     編輯:Java 相關知識

PowerShell 掃描 /24 網段:識別 Windows/Linux/網絡設備並獲取詳細參數

本文提供一個實用的 PowerShell 腳本,用於快速掃描指定 /24 網段內的存活主機,識別作業系統類型 (Windows/Linux/網絡設備),並對 Windows 主機通過 WMI 獲取詳細的硬體、效能與磁碟資訊。適合運維人員快速摸底陌生網絡環境。

腳本功能

  • 掃描指定網段 (如 10.7.2.0/24) 所有 IP (1-255)。
  • 並發測試關鍵端口:3389 (RDP/Windows)、22 (SSH/Linux)、23 (Telnet/網絡設備)。
  • ICMP Ping 判斷主機存活。
  • Windows 主機:獲取序列號、廠牌、型號、主機名、域、CPU/記憶體/磁碟/網絡即時效能、所有磁碟分區使用率。
  • 彩色輸出區分:綠色 (Windows)、黃色 (Linux)、青色 (網絡設備)、紅色 (離線)。

完整腳本代碼


<#
.SYNOPSIS
    掃描 /24 網段,識別主機類型並獲取 Windows 詳細參數
.PARAMETER Network
    網段前綴,例如 "10.7.2" 代表 10.7.2.0/24
#>
Param(
    [Parameter(Mandatory=$true)][string]$Network
)

$IpList = 1..255 | ForEach-Object { "$Network.$_" }

foreach ($IpAddress in $IpList) {
    # 並發測試端口 (非阻塞)
    $Port3389 = Test-Port -Ip $IpAddress -Port 3389
    $Port22   = Test-Port -Ip $IpAddress -Port 22
    $Port23   = Test-Port -Ip $IpAddress -Port 23
    $PingOk   = Test-Connection -ComputerName $IpAddress -Count 1 -Quiet

    # 1. Windows 主機 (RDP 開放)
    if ($Port3389) {
        Write-Host "================================================================================" -ForegroundColor Green
        Write-Host "時間: $(Get-Date)  WINDOWS 主機: $IpAddress" -ForegroundColor Green
        Get-WindowsDetails -Ip $IpAddress
    }
    # 2. Linux 主機 (SSH 開放)
    elseif ($Port22) {
        Write-Host "================================================================================" -ForegroundColor Yellow
        Write-Host "主機: $IpAddress 開放端口: 22  可能是 Linux 主機" -ForegroundColor Yellow
    }
    # 3. 網絡設備
    elseif ($Port23) {
        Write-Host "================================================================================" -ForegroundColor Cyan
        Write-Host "主機: $IpAddress 開放端口: 23  可能是網絡設備" -ForegroundColor Cyan
    }
    # 4. 離線
    elseif (-not $PingOk) {
        Write-Host "================================================================================" -ForegroundColor Red
        Write-Host "主機: $IpAddress 此主機不存在或防火牆阻擋 Ping" -ForegroundColor Red
    }
}

# --- 輔助函數 ---
function Test-Port {
    param($Ip, $Port)
    $tcp = New-Object Net.Sockets.TcpClient
    $result = $tcp.BeginConnect($Ip, $Port, $null, $null)
    $success = $result.AsyncWaitHandle.WaitOne(500) # 500ms 超時
    if ($success -and $tcp.Connected) { $tcp.Close(); return $true }
    $tcp.Close()
    return $false
}

function Get-WindowsDetails {
    param($Ip)
    try {
        $cs = Get-WmiObject -ComputerName $Ip -Class Win32_ComputerSystem -ErrorAction Stop
        $bios = Get-WmiObject -ComputerName $Ip -Class Win32_BIOS
        $os = Get-WmiObject -ComputerName $Ip -Class Win32_OperatingSystem
        $disks = Get-WmiObject -ComputerName $Ip -Class Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}

        # 基本信息
        Write-Host "主機名: $($cs.DNSHostName).$($cs.Domain)" -ForegroundColor Green
        Write-Host "品牌: $($bios.Manufacturer)  型號: $($cs.Model)  序列號: $($bios.SerialNumber)" -ForegroundColor Green

        # 效能計數器 (需遠程註冊表開啟、防火牆放行、權限足夠)
        $cpu = (Get-Counter -ComputerName $Ip -Counter "\Processor(_Total)\% Processor Time" -ErrorAction SilentlyContinue).CounterSamples | Where-Object {$_.InstanceName -eq "_total"} | Select-Object -ExpandProperty CookedValue
        $memFree = $os.FreePhysicalMemory
        $memTotal = $os.TotalVisibleMemorySize
        $memUsedPct = "{0:0.0}%" -f (($memTotal - $memFree) / $memTotal * 100)

        Write-Host "CPU 使用率: $("{0:0.0}%" -f $cpu)  記憶體使用率: $memUsedPct" -ForegroundColor Green

        # 磁碟
        Write-Host "盤符   總空間(GB)   可用(GB)   已用(GB)   使用率" -ForegroundColor Green
        foreach ($d in $disks) {
            $size = "{0:0.0}" -f ($d.Size / 1GB)
            $free = "{0:0.0}" -f ($d.FreeSpace / 1GB)
            $used = "{0:0.0}" -f (($d.Size - $d.FreeSpace) / 1GB)
            $pct = "{0:0.0}%" -f (($d.Size - $d.FreeSpace) / $d.Size * 100)
            Write-Host "$($d.DeviceID.PadRight(6)) $size.PadLeft(10) $free.PadLeft(10) $used.PadLeft(10) $pct" -ForegroundColor Green
        }
    } catch {
        Write-Host "獲取 WMI 信息失敗: $($_.Exception.Message)" -ForegroundColor Red
    }
}

使用方法


# 1. 保存為 Scan-Network.ps1
# 2. PowerShell 中執行 (需管理員權限以訪問遠程 WMI)
.\Scan-Network.ps1 -Network "10.7.2"

前置條件與限制

  • 權限:掃描目標主機需具備管理員權限 (域管理員或本地管理員) 以查詢 WMI/效能計數器。
  • 防火牆:目標主機需開放 WMI (RPC 動態端口)、效能計數器、文件共享 (SMB) 相關防火牆規則。
  • 服務:目標主機需啟動 Winmgmt (WMI)、RemoteRegistry (遠程註冊表)、PerfHost (效能計數器) 服務。
  • 網絡:ICMP Ping、TCP 3389/22/23 需通暢。
  • 跨域/工作組:可能需配置 TrustedHosts 或使用 Invoke-Command -Credential 提供憑證。

優化建議

  • 使用 ForEach-Object -Parallel (PowerShell 7+) 並發掃描大幅提速。
  • 改用 CIM (Get-CimInstance) 替代 WMI,基於 WS-MAN 更安全高效。
  • 結果導出 CSV/JSON 便於後續分析。
  • 增加進度條、掃描耗時統計。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved