PowerShell skaner IP


 

Bardzo często w codziennej pracy administratorzy potrzebują wolnego adresu IP, czasem pod ręką nie ma żadnego narzędzia, lub zapisów jaki adres IP jest obecnie wolny w danej sieci. I tu jak zwykle z pomocą przyjdzie nam skrypt w PowerShell skaner IP. Jakiś czas temu opisywaliśmy pingowanie podsieci w CMD. Celem tego skryptu jest uzyskanie informacji, który z adresów danej sieci odpowiada na ping

Prosta wersja skryptu PowerShell skaner IP

Jeśli mamy do sprawdzenia całą podsieć, lub jakiś zakres adresów najprostszym rozwiązaniem jest oczywiście wykonywania zapytania ping do każdego adresu IP po kolei. Mówiąc inaczej, potrzebujemy zwykłej pętli z inkrementacją ostatniego oktetu adresu IP o jeden. Zanim jednak wskażemy drogę do uzyskania pożadanego efektu, należy się słówko wyjaśnienia – otóż w skrypcie korzystam z cmdletu Test-Connection, który jest dostępny w PowerShellu 2.0 (od 3 grudnia 2012 możemy już korzystać z PowerShella 3.0)

[string]$zakres = "192.168.0"
[int]$poczatek = 1
[int]$koniec = 254
$poczatek..$koniec | %{
if (!(test-connection "$zakres`.$_" -count 3 -quiet)) 
{
   write-host -f Red "$zakres`.$_ nie odpowiada"
 } 
   else 
   {
    write-host -f Green "$zakres`.$_ odpowiada"
   }
}

Taki skrypt ma jednak pewną wadę :) Z racji tego, że skanuje adresy IP jeden po drugim czas jaki jest potrzebny do zakończenia pętli jest niemożebnie długi. Stąd też proponujemy:

Zaawansowana wersja skryptu PowerShell skaner IP

W tej wersji wykorzystamy właściwości jakie daje nam wykonywanie równocześnie poleceń i instrukcji w PowerShell. Tu także należy się słówko wyjaśnienia. Specyfika poniższego skryptu PowerShell skaner IP, polega na odpalaniu jednocześnie kilku, bądź kilkunastu/kilkudziesięciu poleceń jednocześnie – co powoduje zwiększenie użycia pamięci RAM, ale wyniki skanowania zakresu adresów IP otrzymujemy zdecydowanie szybciej. Warto też zaznaczć, że wysyłanie kilkudziesięciu zapytań w tym samym czasie do większej ilości adresów IP może powodować problemy w sieci, oraz pożądnie wkurzyć kolegę z działu sieci :)

[string]$zakres = "10.0.25"  
[int]$poczatek = 1  
[int]$koniec = 31 
$max = 10
$licznik = 1  
$poczatek..$koniec | %{  
        start-job -ArgumentList “$zakres`.$_” -scriptblock { $test = test-connection $args[0] -count 2 -quiet; return $args[0],$test } | out-null  
        if ($licznik -gt $max) {  
            sleep 3  
            $licznik = 1  
        } else {  
            $licznik++  
        }  
    }  
 
get-job | wait-job  
$zadania = get-job  
$wyniki = @()  
foreach ($zadanie in $zadania) {  
    $temp = receive-job -id $zadanie.id -keep  
    $wyniki += ,($temp[0],$temp[1])  
}  

get-job | stop-job  
get-job | remove-job  
$wyniki = $wyniki | sort @{Expression={$_[0]}; Ascending=$false}  
foreach ($wynik in $wyniki) {  
    if ($wynik[1]) {  
        write-host -f Green "$($wynik[0]) odpowiada"
    } else {  
        write-host -f Red "$($wynik[0]) nie odpowiada"  
    }  
}

Jakby powiedział mistrz Yoda: „Tak oto w PowerShell skaner IP stworzyliśmy”. Nie jest to może zupełne wyczerpanie tematu skanowania sieci, ale od czegoś trzeba zacząć.
Podzielcie się z nami swoimi sposobami na skanowanie adresów IP :)
 
 


Podobne Tematy:

  • Benko

    Witam,
    czy do tego pierwszego skryptu da się coś dopisać, żeby od razu wynik zapisać w jakimś pliku?

  • Cezary Pielasa

    Ja polecam NBTSCAN.exe oprócz adresu sieci podajemy ilość bitów w masce.