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

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

WildVic 28-08-2009 11:05 1205279

определение IP и подключение шары
 
Добрый день!
могу конечно повториться, не успел перечитать весь форум...
помогите составить батник
нужно в зависимости от IP подключать разные сетевые ресурсы (шары)
например определенной группе IP подключить одни сетевые ресурсы (шары)
а всем остальным другие...

заранее благодарен....

amel27 28-08-2009 11:14 1205286

1. Почему именно IP?.. Чем, к примеру, не устраивают обычные глобальные группы?
2. Как будут определяться IP?.. интервалом?.. подсетью?.. списком?

WildVic 28-08-2009 11:26 1205296

схема такая...
каждый комп после загрузки винды берет батник из общей шары (щара уже подключена на всех компах)
дальше этот батник в зависимости от IP компа с которого он запущен,
определяет какие еще шары подключить этому IP,
синхронизацию времени (с разными серверами) и т.п.

amel27 28-08-2009 11:35 1205309

Цитата:

Цитата WildVic
в зависимости от IP компа с которого он запущен »

т.е. для каждого ИП своя процедура подключения?

WildVic 28-08-2009 11:36 1205314

да!
ну или для групп IP, если это возможно (было бы супер)

amel27 28-08-2009 12:18 1205353

Вариант 1:
Код:

@Echo Off

For /F "Tokens=1 Skip=1 Delims={,} " %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPAddress') Do GoTo :%%~i
:Continue

Rem Тут
Rem продолжение
Rem батника

Exit /B 0

:192.168.0.1
 Net Use X: \\SRV01\Share1
 Net Use Y: \\SRV02\Share2
GoTo :Continue

:192.168.0.2
 Net Use X: \\SRV01\Share1
 Net Use Y: \\SRV03\Share3
GoTo :Continue

:192.168.0.3
 Net Use X: \\SRV03\Share3
 Net Use Y: \\SRV04\Share4
GoTo :Continue

Вариант 2:
Код:

@Echo Off

Set $G1=192.168.0.1 192.168.0.2 192.168.0.3
Set $G2=192.168.0.4 192.168.0.5 192.168.0.6
Set $G3=192.168.0.7 192.168.0.8 192.168.0.9

For /F "Tokens=1 Skip=1 Delims={,} " %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPAddress') Do Set $IP=%%~i& GoTo Continue
:Continue

For /F "Tokens=1,2 Delims==" %%i In ('Set $G') Do For %%a In (%%j) Do If "%$IP%"=="%%a" Call :%%i
Exit /B 0

:$G1
 Net Use X: \\SRV01\Share1
 Net Use Y: \\SRV02\Share2
GoTo :EOF

:$G2
 Net Use X: \\SRV01\Share1
 Net Use Y: \\SRV03\Share3
GoTo :EOF

:$G3
 Net Use X: \\SRV03\Share3
 Net Use Y: \\SRV04\Share4
GoTo :EOF


WildVic 28-08-2009 12:23 1205356

"WMIC NICCONFIG Where Index=1 Get IPAddress|FindStr "."" не является внутренней
или внешней
командой, исполняемой программой или пакетным файлом.


вот такое вот выдает :(

amel27 28-08-2009 12:26 1205357

WildVic, у тя какая ОСь?.. WMIC.EXE включена начиная с XP/2003

WildVic 28-08-2009 12:28 1205361

а еще такое

c:\bat>WMIC NICCONFIG Where IPEnabled=True Get Index,IP
Узел - ???
ОШИБКА:
Код = 0x80041017
Описание = Недопустимый запрос
Услуга = WMI

amel27 28-08-2009 12:28 1205363

CMD-команда для проверки:
Код:

WMIC NICCONFIG Where IPENabled=TRUE Get IPAddress
Цитата:

Цитата WildVic
WMIC NICCONFIG Where IPEnabled=True Get Index,IP »

такого я не давал (еще) :o

WildVic 28-08-2009 12:39 1205377

просто из консоли показывает IP
а из батника пишет ошибку :(

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

c:\bat>forum.bat
"WMIC NICCONFIG Where Index=1 Get IPAddress|FindStr "."" не является внутренней
или внешней
командой, исполняемой программой или пакетным файлом.

c:\bat>

WildVic 28-08-2009 12:55 1205393

Цитата:

Цитата amel27
такого я не давал (еще) »

ой, прости, у меня уже тут их столько накопилось, что я путатца стал...

вопщем просто из консоли IP показывает:

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

c:\bat>WMIC NICCONFIG Where IPENabled=TRUE Get IPAddress
IPAddress
{"172.17.110.101"}

а из батника нехочет :(

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

c:\bat>forum.bat
"WMIC NICCONFIG Where Index=1 Get IPAddress|FindStr "."" не является внутренней
или внешней
командой, исполняемой программой или пакетным файлом.

amel27 28-08-2009 12:57 1205395

Цитата:

Цитата WildVic
просто из консоли показывает IP »

уже позитив :)
немного изменил 1-й батник, проверь (у меня на 2003-й вроде пашет)

WildVic 28-08-2009 13:00 1205398

странно... на других компах работает... на моем валит ошибки (см. выше) :(

не знаеш в чем бок может быть?

amel27 28-08-2009 13:09 1205409

WildVic, попробуй последнюю редакцию батника... WMIC капризен... это типа нормально (на разных осях ведет себя по разному)... но если в консоли выдает, значит и в батнике заставим ;)

WildVic 28-08-2009 14:07 1205480

та же картина :(
на трех других компах нормально пашет... на моем нехочет...
оно то впринципе все равно, но
не факт, что из моих 100 компов непопадетца такой как у меня капризный...

amel27 28-08-2009 15:54 1205577

Цитата:

Цитата WildVic
на моем нехочет »

1. Заменить "@Echo Off" -> "@Echo On"
2. Выполнить батник с логированием в файл: "Batnik.CMD >Batnik.LOG 2>&1"
3. Batnik.LOG - в студию.

WildVic 28-08-2009 16:22 1205608

c:\bat>For /F "Tokens=1 Skip=1 Delims={,} " %i In ('WMIC NICCONFIG Where IPEnabled=TRUE Get IPAddress') Do GoTo :%~i
"WMIC NICCONFIG Where IPEnabled=TRUE Get IPAddress" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

c:\bat>Rem ╥≤≥

c:\bat>Rem ∩≡εΣεδµσφΦσ

c:\bat>Rem ßα≥φΦΩα

c:\bat>Exit /B 0

amel27 28-08-2009 16:29 1205615

а батник из одной строки выполняется?
Код:

WMIC NICCONFIG Where IPEnabled=TRUE Get IPAddress

NiOl 28-08-2009 18:17 1205691

Когда мне понадобилось узнать текущие адреса всех сетевушек, я анализировал таблицу шлюзов (показалось так проще всего), хитростей WMIc не знаю, но чую нужно эту команду трясти. В любом случае, при попытке повторить строку
WMIC NICCONFIG Where Index=1 Get IPAddress - не получил ровным счетом ничего. Перебрав индексы до 4го и получив также по 2 пустые строки было забросил, но возник вопрос, почему у меня не работает и тогда пустил эту команду без запроса get ipaddress и был поражен количеством инфы. Моя встроенная сетевушка нашлась только на 13м, счастливом месте....

К чему это лирическое отступление? Собственно брать первый попавшийся интерфейс стремно - у некоторых может не сработать. Нужен перебор индексов.

amel27 29-08-2009 07:50 1206106

NiOl, если все рабочие станции парка с одной сетевухой и подняты "с нуля", то "Index=1" нормальное условие, при наличии одного IP-интерфейса можно ставить условие "Where IPEnabled=TRUE", в остальных случаях прежде чем садиться писать скрипт, нужно четко определить однозначный алгоритм фильтрации интерфейса (по имени подключения, по производителю сетевухи и т.д.)

WildVic 31-08-2009 15:59 1207951

с последовательностью интерфейсов можно померитца...
я вот немогу понять своей проблемы...
на всех компах где я пробовал нормально пашет... именно на моем не хочет :(((

Цитата:

Цитата amel27
а батник из одной строки выполняется? »

да выполняетца :)


ЗЫ сорри за не оперативность :(

amel27 01-09-2009 09:27 1208554

Цитата:

Цитата WildVic
выполняетца »

тады еще два батника на проверку:
Код:

For /F "Delims=" %%i In ('WMIC /?') Do @Echo.%%i
Код:

For /F "Delims=" %%i In ('WMIC NICCONFIG Get IPAddress') Do @Echo.%%i

WildVic 01-09-2009 09:34 1208561

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

c:\bat>1.cmd

c:\bat>For /F "Delims=" %i In ('WMIC /?') Do @Echo.%i
"WMIC /?" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

c:\bat>2.cmd

c:\bat>For /F "Delims=" %i In ('WMIC NICCONFIG Get IPAddress') Do @Echo.%i
"WMIC NICCONFIG Get IPAddress" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

c:\bat>

amel27 01-09-2009 09:49 1208566

WildVic, далее:
Код:

For /F "Delims=" %%i In ('Set PATH') Do @Echo.%%i

WildVic 01-09-2009 10:23 1208594

c:\bat>For /F "Delims=" %i In ('Set PATH') Do @Echo.%i
"Set PATH" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

amel27 01-09-2009 10:41 1208608

WildVic, да... чет у тебя FOR совсем не работает:
Код:

For /F "Delims=" %%i In ("Set PATH") Do @Echo.%%i
Код:

For /F "UseBackQ Delims=" %%i In (`Set`) Do @Echo.%%i

WildVic 01-09-2009 10:58 1208616

О_о уже коечто

c:\bat>1.cmd

c:\bat>For /F "Delims=" %i In ("Set PATH") Do @Echo.%i
Set PATH

c:\bat>1.cmd

c:\bat>For /F "UseBackQ Delims=" %i In (`Set`) Do @Echo.%i
"Set" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Iska 01-09-2009 11:49 1208657

amel27, может у него каким-то боком отключена расширенная обработка команд? WildVic, выложите сюда результат выполнения:
Код:

set comspec
и содержимое разделов реестра:
Код:

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
Код:

HKEY_CURRENT_USER\Software\Microsoft\Command Processor

amel27 01-09-2009 12:20 1208687

...и проверить на всякий случай переменную PATH:
Ошибка - [решено] 'ping' is not recognized as an internal or external command...

Код:

For /F "Delims=" %%i In ('C:\WINDOWS\System32\FindStr') Do @Echo.%%i
Цитата:

Цитата Iska
может у него каким-то боком отключена расширенная обработка команд? »

тогда вроде другой текст ошибки должен быть

WildVic 01-09-2009 12:31 1208702

Все народ!
батник заработал!
был бок в comspec
стоял другой командный процессор :)


ВСЕМ огромное спасибо!

Iska 01-09-2009 12:54 1208722

Цитата:

Цитата amel27
...и проверить на всякий случай переменную PATH:

Точно! Я сам на этом несколько раз попадался.

WildVic 04-09-2009 11:33 1211258

Народ, все таки я так и не довел свой батник до поставленной задачи :(
помогите плиз добить...
задача такая:
в зависимости от разных групп IP подключать им разные шары. умом понимаю как это делать, но на практике ничего неполучаетца :( использовал для примера 2 скрипт с 1 старицы, видно не хватает опыта :(
повторюсь, нужно задать переменными разные шары, и потом использовать их при подключении в разных группах IP, например:

Set $sh1= \\server\Share1
Set $sh2= \\server\Share2
Set $sh3= \\server\Share3

Set $g1=192.168.0.1 192.168.0.2 192.168.0.3
Set $g2=192.168.1.1 192.168.1.2 192.168.1.3

как подключить группе G1 шару sh1
как подключить группе G2 шару sh2
и + еще ВСЕМ IP шару sh3

amel27 07-09-2009 10:17 1213130

Цитата:

Цитата WildVic
как подключить группе G1 шару sh1
как подключить группе G2 шару sh2
и + еще ВСЕМ IP шару sh3 »

Код:

@Echo Off

Set $SH1= \\server\Share1
Set $SH2= \\server\Share2
Set $SH3= \\server\Share3

Set $G1=192.168.0.1 192.168.0.2 192.168.0.3
Set $G2=192.168.1.1 192.168.1.2 192.168.1.3


For /F "Tokens=2 Delims=={}" %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPAddress /Value') Do Set $IP=%%~i
For /F "Tokens=1,2 Delims==" %%i In ('Set $G') Do For %%a In (%%j) Do If "%$IP%"=="%%a" Call :%%i

Net Use Y: %$SH3%
Exit /B 0

:$G1
Net Use X: %$SH1%
GoTo :EOF

:$G2
Net Use X: %$SH2%
GoTo :EOF


WildVic 09-09-2009 10:19 1214607

Спасибо!
И еще вопросик :)
как проверить из батника подключена уже шара или нет? :)

amel27 09-09-2009 11:05 1214643

Цитата:

Цитата WildVic
как проверить из батника подключена уже шара или нет? »

Код:

If Exist X: Echo Шара X: успешно подключена
If Not Exist X: Echo Шара X: не подключена!


WildVic 09-09-2009 11:25 1214670

Спасибо ОГРОМНОЕ!!!

Loverman310 14-04-2010 15:50 1392447

Добрый день!
А если стоит задача клиентам с IP из определенной подсети подключать определенные шары. Т.е. не просто сравнивать текущий IP, а сравнивать IP подсети с заданными. Например, IP адреса машин
192.168.1.6 маска 255.255.255.0 подсеть 192.168.1.0
192.168.250.8 маска 255.255.255.0 подсеть 192.168.250.0
10.72.81.156 маска 255.255.255.128 подсеть 10.72.81.128

И клиентам из каждой подсети мапить разные шары.

как модифицировать команду извлечения IP, чтобы вытащить адрес подсети?
Или, хотя бы, первые три октета IP (хотя в случае с третьим примером этот метод не сработает)?

amel27 15-04-2010 08:18 1393011

Цитата:

Цитата Loverman310
хотя бы, первые три октета IP »

заменить: "Set $IP=%%~i" --> "Set $IP=%%~ni.0" , тогда $IP будет равен подсети

Loverman310 15-04-2010 09:54 1393071

А все-таки, интереса ради - можно ли командой вытащить адрес подсети с маской?
например, ситуация:
есть сеть 192.168.1.0 255.255.255.128
и сеть 192.168.1.128 255.255.255.128

при этом наша команда ("Set $IP=%%~ni.0") заменит на 0 последний октет адреса, и адреса из обеих подсетей получатся одинаковыми. Соответственно и шары им присвоятся одинаковые.

Как думаете, сложно реализовать механизм определения адреса подсети из вывода 'WMIC NICCONFIG Where IPEnabled^=TRUE Get IPAddress /Value' ?
для удобства и наглядности, я думаю, будет удобнее адрес подсети вытаскивать в виде ххх.ххх.ххх.ххх/уу, хотя не принципиально.

amel27 15-04-2010 10:54 1393125

Цитата:

Цитата Loverman310
реализовать механизм определения адреса подсети »

как вариант - через маршрут идентификатора примыкающей сети:

Код:

@Echo Off

For /F "Tokens=2 Delims=={}" %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPSubnet /Value') Do Set SubnetMask=%%~i
For /F "Tokens=1" %%i In ('Route Print^|Find "%SubnetMask%"') Do Set SubnetIP=%%i

Echo Subnet Address: %SubnetIP% / %SubnetMask%
Pause >Nul


Loverman310 15-04-2010 12:55 1393211

Спасибо большое за ответ!
Есть небольшая заминка - последний код выдает результат
Код:

Subnet Address:  /
хотя предыдущие примеры работали отлично. Куда копать?

amel27 15-04-2010 13:16 1393222

Цитата:

Цитата Loverman310
Куда копать? »

эта CMD-команда должна выдать маску подсети типа: IPSubnet={"255.255.255.0"}
Код:

WMIC NICCONFIG Where IPEnabled=TRUE Get IPSubnet /Value
следующий батник - присвоить это значение переменной SubnetMask и вывести на экран:
Код:

@Echo Off

For /F "Tokens=2 Delims=={}" %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPSubnet /Value') Do Set SubnetMask=%%~i

Echo %SubnetMask%
Pause >Nul

P.S. проверял на XP/2003

Loverman310 15-04-2010 13:23 1393230

Вот, что выдает первая команда:
Код:

WMIC NICCONFIG Where IPEnabled=TRUE Get IPSubnet /Value


IPSubnet={"255.255.255.128"}


IPSubnet={""}


IPSubnet={""}


IPSubnet={""}

Видимо, одно из пустых значений и записывается в переменную. Причина тому, наличие на машине нескольких сетевых адаптеров, я полагаю.
т.к. результат исполнения(вывода на экран) батника - нулевой.

решил так:
Код:

@Echo Off

For /F "Tokens=2 Delims=={}" %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPSubnet /Value') Do Set SubnetMask=%%~i& GoTo

Continue

:Continue
For /F "Tokens=1" %%i In ('Route Print^|Find "%SubnetMask%"') Do Set SubnetIP=%%i



Echo Subnet Address: %SubnetIP% / %SubnetMask%
Pause >Nul

т.е. после нахождения первого значения и записи его в переменную - перехожу дальше по тексту программы. Нормальный ли это вариант? Не сулит ли он каких-либо граблей в будущем?

amel27 15-04-2010 16:16 1393382

Loverman310, непустое значение может быть и не первым в списке, может так попробовать?

Код:

@Echo Off

For /F "Tokens=2 Delims=={}" %%i In ('WMIC NICCONFIG Where IPEnabled^=TRUE Get IPSubnet /Value') Do If Not "%%~i"=="" Set SubnetMask=%%~i

Echo %SubnetMask%
Pause >Nul


Loverman310 16-04-2010 08:19 1393838

Спасибо большое! Потестируем в процессе отладки скриптов)

pedrosoft 15-05-2021 23:22 2958023

Добрый вечер.

Подскажите пожалуйста как в следующем коде, который выдает ip при совпадении требуемой маски, добавить условие ИЛИ чтобы искать еще по одной маске:
Код:

for /f "tokens=2 delims=:(" %%i in ('ipconfig /all ^| find "IP" ^| find "10.2.16."') do set IPAdress=%%i
В принципе я могу свою задачу решить так:
Код:

for /f "tokens=2 delims=:(" %%i in ('ipconfig /all ^| find "IP" ^| find "10.2.16."') do set IPAdress=%%i
for /f "tokens=2 delims=:(" %%i in ('ipconfig /all ^| find "IP" ^| find "10.4.16."') do set IPAdress=%%i

но это как то слишком избыточно и не лаконично.

Elven 17-05-2021 10:07 2958143

cmd нет под рукой потому проверить не могу
вместо find "10. ..." используйте findstr
вроде могло бы заработать и так:
Код:

...^| findstr 10.2.16. 10.4.16.
но для findstr "." - любой символ
можно попробовать так:
Код:

...^| findstr /g:filter.txt
но в таком случае нужен файл, в котором построчно перечислены все фильтры по которым фильтруются IP (в примере выше - filter.txt).

но т.к. это IP, вероятнее всего таки проканает первый вариант, т.к. маловероятно, чтобы в строке ipconfig отфильтрованной по IP (а еще лучше по IPv4) оказалось что-то, у которого между октетами будет что-то кроме точки.

alpap 17-05-2021 14:13 2958163

Код:

@echo off
:: var1
set IP="192.168.1.1","192.168.1.101","192.168.1.11"
for %%i in (%IP%) do ipconfig /all|findstr /c:%%i
echo ---------------------
::var2
set "IP=/c:"192.168.1.1" /c:"192.168.1.101" /c:"192.168.1.11""
ipconfig /all|findstr %IP%
pause



Время: 04:22.

Время: 04:22.
© OSzone.net 2001-