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 🙂
Witam,
czy do tego pierwszego skryptu da się coś dopisać, żeby od razu wynik zapisać w jakimś pliku?
Ja polecam NBTSCAN.exe oprócz adresu sieci podajemy ilość bitów w masce.