1. Базовое сканирование сети
Проверка доступности хостов:
powershell
# Одиночный хост
Test-Connection 192.168.1.1 -Count 1 -Quiet
# Несколько хостов
1..254 | ForEach-Object {Test-Connection "192.168.1.$_" -Count 1 -Delay 1}
Пинг диапазона адресов:
powershell
# Быстрое сканирование подсети
1..254 | ForEach-Object {
$ip = "192.168.1.$_"
if (Test-Connection $ip -Count 1 -Quiet) {
Write-Host "$ip is alive" -ForegroundColor Green
}
}
2. Более продвинутое сканирование
Сканирование с сохранением результатов:
powershell
$activeHosts = @()
1..254 | ForEach-Object {
$ip = "192.168.1.$_"
if (Test-Connection $ip -Count 1 -Quiet) {
$activeHosts += $ip
Write-Host "Found: $ip"
}
}
$activeHosts | Out-File "active_hosts.txt"
Сканирование с таймаутом и параллельным выполнением:
powershell
# PowerShell 7+ (более быстрое)
$block = {param($ip) Test-Connection $ip -Count 1 -Quiet}
1..254 | ForEach-Object -Parallel {
$ip = "192.168.1.$_"
if (& $using:block $ip) {
Write-Host "Host $ip is alive"
}
} -ThrottleLimit 50
3. Сканирование портов
Проверка открытых портов:
powershell
function Test-Port {
param(
[string]$ComputerName,
[int]$Port,
[int]$Timeout = 1000
)
$tcpClient = New-Object System.Net.Sockets.TcpClient
$connect = $tcpClient.BeginConnect($ComputerName, $Port, $null, $null)
$wait = $connect.AsyncWaitHandle.WaitOne($Timeout, $false)
if ($wait) {
$tcpClient.EndConnect($connect)
$tcpClient.Close()
return $true
} else {
$tcpClient.Close()
return $false
}
}
# Использование
Test-Port -ComputerName "192.168.1.1" -Port 80
Сканирование нескольких портов:
powershell
$ports = 21,22,23,25,53,80,443,3389
$target = "192.168.1.1"
foreach ($port in $ports) {
if (Test-Port -ComputerName $target -Port $port -Timeout 500) {
Write-Host "Port $port is OPEN on $target" -ForegroundColor Green
}
}
4. Использование сторонних модулей
Установка и использование модуля Nmap:
powershell
# Установка через Chocolatey choco install nmap # Или использование встроенными средствами # Пример вызова nmap & "C:\Program Files (x86)\Nmap\nmap.exe" -sn 192.168.1.0/24
Модуль Posh-SSH для SSH сканирования:
powershell
Install-Module -Name Posh-SSH -Force
5. Расширенное сканирование с деталями
powershell
function Scan-Network {
param(
[string]$Network = "192.168.1",
[int]$Start = 1,
[int]$End = 254
)
$results = @()
for ($i = $Start; $i -le $End; $i++) {
$ip = "$Network.$i"
Write-Progress -Activity "Scanning network" -Status "Checking $ip" -PercentComplete (($i/$End)*100)
if (Test-Connection $ip -Count 1 -Quiet) {
try {
$hostname = [System.Net.Dns]::GetHostEntry($ip).HostName
} catch {
$hostname = "Unknown"
}
$result = [PSCustomObject]@{
IP = $ip
Status = "Online"
Hostname = $hostname
MAC = (Get-NetNeighbor -IPAddress $ip -ErrorAction SilentlyContinue).LinkLayerAddress
ResponseTime = (Test-Connection $ip -Count 1).ResponseTime
}
$results += $result
Write-Host "$ip ($hostname) is ONLINE" -ForegroundColor Green
}
}
return $results
}
# Запуск сканирования
$scanResults = Scan-Network -Network "192.168.1"
$scanResults | Export-Csv -Path "network_scan.csv" -NoTypeInformation
6. Сканирование с использованием .NET классов
powershell
# Быстрое сканирование с многопоточностью
$ipRange = 1..254
$results = @()
$ipRange | ForEach-Object -Parallel {
$ip = "192.168.1.$_"
$ping = New-Object System.Net.NetworkInformation.Ping
try {
$reply = $ping.Send($ip, 500)
if ($reply.Status -eq "Success") {
[PSCustomObject]@{
IP = $ip
Status = "Online"
ResponseTime = $reply.RoundtripTime
Timestamp = Get-Date
}
}
} catch {}
} -ThrottleLimit 100 | ForEach-Object { $results += $_ }
7. Полное сканирование сети с обнаружением ОС
powershell
function Get-NetworkInfo {
param([string]$Subnet = "192.168.1")
$results = @()
1..254 | ForEach-Object {
$ip = "$Subnet.$_"
if (Test-Connection $ip -Count 1 -Quiet) {
# Получаем hostname
$hostname = try { [System.Net.Dns]::GetHostEntry($ip).HostName } catch { "N/A" }
# Пробуем определить ОС по TTL
$ping = Test-Connection $ip -Count 1
$ttl = $ping.ResponseTimeToLive
$os = switch ($ttl) {
{$_ -le 64} { "Linux" }
{$_ -eq 128} { "Windows" }
default { "Unknown" }
}
$results += [PSCustomObject]@{
IP = $ip
Hostname = $hostname
Status = "Online"
TTL = $ttl
OS = $os
ResponseTime = $ping.ResponseTime
}
}
}
return $results
}
# Запуск
$networkInfo = Get-NetworkInfo
$networkInfo | Format-Table -AutoSize
8. Экспорт результатов
powershell
# В CSV $results | Export-Csv -Path "scan_results.csv" -NoTypeInformation -Encoding UTF8 # В JSON $results | ConvertTo-Json | Out-File "scan_results.json" # В HTML отчет $results | ConvertTo-Html | Out-File "scan_report.html"
Важные примечания:
- Права доступа: Для некоторых операций могут потребоваться права администратора
- Безопасность: Сканируйте только свои сети или сети, где у вас есть разрешение
- Производительность: Устанавливайте разумные таймауты и ограничивайте количество одновременных запросов
- Сетевые политики: Некоторые сети блокируют ICMP (ping) запросы
Для более продвинутого сканирования рекомендуется использовать специализированные инструменты вроде Nmap или Advanced IP Scanner.