Как просканировать сеть Powershell 2

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"

Важные примечания:

  1. Права доступа: Для некоторых операций могут потребоваться права администратора
  2. Безопасность: Сканируйте только свои сети или сети, где у вас есть разрешение
  3. Производительность: Устанавливайте разумные таймауты и ограничивайте количество одновременных запросов
  4. Сетевые политики: Некоторые сети блокируют ICMP (ping) запросы

Для более продвинутого сканирования рекомендуется использовать специализированные инструменты вроде Nmap или Advanced IP Scanner.

Оставьте комментарий