Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сканер компьютеров в сети (http://forum.oszone.net/showthread.php?t=199372)

EnemyBot 13-02-2011 12:13 1611662

Сканер компьютеров в сети
 
Помогите, я совсем запутался (
Я захотел написать сканер компов в сети: 192.168.ххх.yyy
батник сканиует сначала 192.168.ххх.1, а потом из рабочих xxx, сканирует yyy, но у меня только один xxx обрабатывается((
Может я изобретаю велосипед, подскажите как оптимальнее это написать...

Код:

@echo off
Set max=255
:L0
if `%1`==`2` (goto L3) else (
if `%1`==`1` (goto L1) else (
Set check=1 & Set lv1=192.168 & Set lv2=1)
)

for /L %%i in (0,1,%max%) do (
echo %lv1%.%%i.%lv2%
cmd /v:on /c %0 %check% %lv1% %lv2% %%i)
goto end

:L1
if `%4`==`%max%` (set check=2 & goto L2)
ping -a -w 50 -n 1 %2.%4.%3>nul
if ErrorLevel 1 (Goto End)
echo !%4>>iplv.txt
Goto End

:L2
for /L %%z in (0,1,%max%) do (
echo %lv1%.%lv2%.%%z
cmd /v:on /c %0 %check% %lv1% %lv2% %%z)
goto end

:L3
FOR /F %%j in (iplv.txt) do (
ping -a -w 50 -n 1 %2.%%j.%4>nul
if ErrorLevel 1 (Goto End)
echo %2.%%j.%4>>ip_list.txt
)
goto end

:End
exit


EnemyBot 13-02-2011 14:04 1611749

Я вроде разобрался сам. Но всёравно хотел бы выслушать предложение по оптимизации:

Код:

@echo off
Set max=15
:L0
if `%1`==`2` (goto L3) else (
if `%1`==`1` (goto L1) else (
Set check=1 & Set lv1=192.168 & Set lv2=1)
)

for /L %%i in (0,1,%max%) do (
echo %lv1%.%%i.%lv2%
cmd /v:on /c %0 %check% %lv1% %lv2% %%i)
goto end

:L1
if `%4`==`%max%` (set check=2 & goto L2)
ping -a -w 50 -n 1 %2.%4.%3>nul
if ErrorLevel 1 (goto end)
echo !%4>>iplv.txt
goto end

:L2
FOR /F %%j in (iplv.txt) do (
for /L %%z in (0,1,%max%) do (
echo %2.%%j.%%z
cmd /v:on /c %0 %check% %lv1% %lv2% %%z %%j)
)
goto end

:L3
Set ip=%%j
ping -a -w 50 -n 1 %2.%5.%4>nul
if ErrorLevel 1 (goto end)
echo %2.%5.%4>>ip.txt
goto end

:End
exit

Думаю можно сделать параметры: "2 цифры ip" "max значение 3й цифры" "max значение 4й цифры"
Например CMD: scan.bat 192.168 20 30

EnemyBot 13-02-2011 15:33 1611835

Какую всётаки я фигню написал

Вот переписал)) намного короче
Код:

@echo off
if `%1`==`` (Set onetwo=192.168) else (Set onetwo=%1)
if `%2`==`` (Set three=255) else (Set three=%2)
if `%3`==`` (Set four=255) else (Set four=%3)
for /l %%t in (1,1,%three%) do (ping -a -w 50 -n 1 %onetwo%.%%t.1 >nul && Echo %%t>>ip1.txt)
for /F %%j in (ip1.txt) do (
for /l %%f in (1,1,%four%) do (ping -a -w 50 -n 1 %onetwo%.%%j.%%f >nul && Echo %onetwo%.%%j.%%f>>iplist.txt)
)
exit


Anonymоus 13-02-2011 22:46 1612191

Я давным-давно вот такую штуку писал. Да, длинная. Да, неоптимизированная. Но работает, и защищено от ввода некорректных значений, плюс можно выбирать любые диапазоны.
Код:

@Echo Off
Del tmp
Title Сканер сети
:Main
Cls
Echo.
Echo.
Echo    Введите начало диапазона IP-адресов для сканирования
Echo    в формате х.х.х.х
Echo.
Set /P IP_start=^>
Echo #%IP_start%>tmp
Echo.
Echo.
Echo    Введите конец диапазона IP-адресов для сканирования
Echo    в формате х.х.х.х
Echo.
Set /P IP_end=^>
Echo @%IP_end%>>tmp
For /F "eol=@ delims=. tokens=1,2,3,4" %%A In (tmp) do (Set Start_1=%%A&Set Start_2=%%B&Set Start_3=%%C&Set Start_4=%%D)
Set Start_1=%Start_1:~1%
For /F "eol=# delims=. tokens=1,2,3,4" %%A In (tmp) do (Set End_1=%%A&Set End_2=%%B&Set End_3=%%C&Set End_4=%%D)
Del tmp
Set End_1=%End_1:~1%
Set /A ErrLvl=0
Set /A Succes=0
Set /A Fail=0
Set /A Complete=0
Set Begin=[%date% - %time:~-0,5%]
Set Current_1=%Start_1%&Set Current_2=%Start_2%&Set Current_3=%Start_3%&Set Current_4=%Start_4%
Echo ╬Єў╕Є LanScan чр [%date% - %time:~-0,5%]>result.txt
Echo (─шрярчюэ %Start_1%.%Start_2%.%Start_3%.%Start_4% - %End_1%.%End_2%.%End_3%.%End_4%)>>result.txt
Echo └ъЄштэ√х їюёЄ√:>>result.txt
Echo.>>result.txt
:Scan
Ping -n 1 -w 400 %Current_1%.%Current_2%.%Current_3%.%Current_4%>nul
If "%ErrorLevel%" GEQ "1" (Set /A Fail=Fail+1) Else Set /A Succes=Succes+1
If "%ErrorLevel%"=="0" Echo %Current_1%.%Current_2%.%Current_3%.%Current_4%>>result.txt
If "%Current_1%"=="%End_1%" Set Complete=1
If "%Current_2%"=="%End_2%" Set Complete=%Complete%1
If "%Current_3%"=="%End_3%" Set Complete=%Complete%1
If "%Current_4%"=="%End_4%" Set Complete=%Complete%1
If "%Complete%"=="1111" GoTo EndScan
Call :Output
Set /A Current_4=Current_4+1
If "%Current_4%"=="256" Set /A Current_4=0 & Set /A Current_3=Current_3+1
If "%Current_3%"=="256" Set /A Current_3=0 & Set /A Current_2=Current_2+1
If "%Current_2%"=="256" Set /A Current_2=0 & Set /A Current_1=Current_1+1
GoTo Scan

:Output
Set /A Total=Fail+Succes
Cls
Echo.
Echo.
Echo    [%date% - %time:~-0,5%] - начато сканирование
Echo    Выбранный диапазон: %Start_1%.%Start_2%.%Start_3%.%Start_4% - %End_1%.%End_2%.%End_3%.%End_4%
Echo    Активных хостов: %Succes%
Echo    Неактивных хостов: %Fail%
Echo    Всего хостов: %Total%
Echo    Текущий адрес: %Current_1%.%Current_2%.%Current_3%.%Current_4%
Exit /B

:ErrMsg
Cls
Echo.
Echo.
Echo  Конечный адрес диапазона больше начального, проверьте правильность ввода
Echo  Нажмите любую кнопку для продолжения
Pause>Nul
GoTo Main

:EndScan
Set /A Total=Fail+Succes
Cls
Echo.
Echo.
Echo    Выбранный диапазон: %Start_1%.%Start_2%.%Start_3%.%Start_4% - %End_1%.%End_2%.%End_3%.%End_4%
Echo    Всего хостов обработано: %Total%
Echo    из них активных: %Succes% неактивных : %Fail%
Echo    Скрипт стартовал: %Begin%
Echo    Обработка закончена: [%date% - %time:~-0,5%]
Echo    Сканирование закончено, результат выведен в result.txt
Echo.
Echo    Нажмите любую кнопку для продолжения
Pause>Nul
Exit


ratibor79 15-02-2011 09:26 1613242

Anonymоus Спасибо прекрасный скрипт.
НО! есть несколько недостатков. Я проверял данный сценарий на разных ОС и вот что заметил. На Windows XP sp3, Windows Server 2003 R2 sp2 скрипт отработал прекрасно, а вот на Windows 7, Windows Server 2003 sp2 скрипт не корректно вывел результат, т.е. на экране обработки (сканирования) сети информация об активных и не активных хостах выводиться правильно, а вот в результат (result.txt) в пункт Активные хосты: просто сохраняет весь заданный диапазон.

Хотелось бы, если возможно поправить скрипт, чтобы он был универсален и отрабатывал на всех ОС корректно.

EnemyBot 15-02-2011 18:16 1613672

У меня на 7ке в result.txt всё верно. Только проблема с кодировкой

ratibor79 16-02-2011 07:00 1614094

EnemyBot
Ну что касается кодировки проблем не наблюдаю. Сохрани скрипт в кодировке 866 (OEM) и должно всё быть нормально (воспользуйся для этого к примеру AkelPad)

НО вот по поводу проблемка вывода результата сканирования сети в разных ОС на мой взгляд остаётся актуальной. Проверил скрипт ещё на нескольких ОС. Итог:
Windows XP sp3, Windows Server 2003 R2 sp2, Windows Server 2008 R2, Windows 7 x86 - сценарий отработал на ура, корректно вывел результат сканирования активного оборудования
Windows Server 2003 sp2, Windows 7 x64 - тоже самое. Скрипт отрабатывает нормально, но вот результат выводит не корректно. Просто выводит весь указанный диапазон IP (и активные и неактивные хосты)

P.S. По поводу Windows 7 разных разрядности я в шоке. В чем разница?

milligan 16-02-2011 10:50 1614198

а кто нибудь может дописать скриптик чтобы по ip определялся пользователь из AD??? Удобно будет следить за теми кто после рабочего дня не выключил комп

Anonymоus 18-02-2011 14:53 1616195

К сожалению, у меня нету доступа к машинам с установленной Win7, так что проверить корректность работы скрипта под этой ОС нет возможности. Скрипт должен быть в кодировке 866, результат он выводит в 1251.
Цитата:

Цитата ratibor79
P.S. По поводу Windows 7 разных разрядности я в шоке. В чем разница? »

Подозреваю, что проблема в этом
Код:

If "%ErrorLevel%"=="0" Echo %Current_1%.%Current_2%.%Current_3%.%Current_4%>>result.txt
а точнее, в If "%ErrorLevel%"=="0". Есть подозрение, что на Win7 x64 при успешном пинге хоста errorlevel совсем не 0, но проверить не могу.

EnemyBot 20-02-2011 09:35 1617452

Windows 7 x64 SP1 всё корректно
Код:

Отчёт LanScan за [20.02.2011 - 12:36]
(Диапазон 192.168.1.0 - 192.168.1.200)
Активные хосты:

192.168.1.1


ratibor79 20-02-2011 13:09 1617548

EnemyBot Согласен, всё нормально. Развернул виртуалку Windows 7 x64, проверил скрипт на ней. Скрипт отработал на ура. Но есть и ноутбук с Windows 7 x64 - на нём почему то скрипт выводит результат не корректно. Также не корректно выводиться результат на Windows Server 2003 sp2 (контроллер домена) проверял на 3-х серверах

Anonymоus не подскажешь, что может влиять на столь разные результаты на Windows 7 x64, развёрнутом на виртуалке и на ноутбуке? В чём разница? Может какой-то компонент или программа вызывает такие результаты.


Время: 00:05.

Время: 00:05.
© OSzone.net 2001-