本文提供一個實用的 PowerShell 腳本,用於快速掃描指定 /24 網段內的存活主機,識別作業系統類型 (Windows/Linux/網絡設備),並對 Windows 主機通過 WMI 獲取詳細的硬體、效能與磁碟資訊。適合運維人員快速摸底陌生網絡環境。
<#
.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"
Winmgmt (WMI)、RemoteRegistry (遠程註冊表)、PerfHost (效能計數器) 服務。TrustedHosts 或使用 Invoke-Command -Credential 提供憑證。ForEach-Object -Parallel (PowerShell 7+) 並發掃描大幅提速。