Показать полную графическую версию : [решено] Возможности команды net send
День добрый
при выполнении команды net send на определенный ВЫКЛЮЧЕННЫЙ компьютер команда пытается около 3х минут отправить сообщение и только потом вываливается в ошибку.
возможно ли сократить это время? допустим 2 секунды и сразу сброс попытки.
Petya V4sechkin
08-09-2008, 18:01
Whiteee, например, можно проверять доступность с помощью Ping (если ICMP разрешен):
@Echo Off
SetLocal EnableExtensions
Ping -n 1 -w 1 %1 >nul
If "%ErrorLevel%"=="0" (
Net Send %*
) Else (
Echo При проверке связи не удалось обнаружить узел %1.
)
Сохранить в .cmd файл и вызывать его с параметрами имя сообщение.
ошибка возникает также при отправке на включенный компьютер с остановленной службой сообщений
собственно я и использую стороннюю, send.exe приблуда (использует службу сообщений), работает из командной строки что крайне удобно
в батнике, в котором используется send.exe, указаны 80 компов получателей, вот если один из них выключен - задержка в выполнении несколько минут, если выключенно несколько - уже много минут.
выглядит так:
SET /P text=Please, input message text:
"\\srv-file\public\it\sent.exe" visior-1,hina1,hev1,era1,hin1,kov1 "%text%"
тут 6 получателей.
можно как либо тут сократить время при отключенном компе? службы сообщений на ВСЕХ компах включены
Petya V4sechkin
09-09-2008, 13:03
Whiteee, как-то так:
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
SET /P text=Please, input message text:
For %%I In (visior-1,hina1,hev1,era1,hin1,kov1) Do (
Ping -n 1 -w 1 %%I >nul
If "!ErrorLevel!"=="0" (
"\\srv-file\public\it\sent.exe" %%I "%text%"
) Else (
Echo При проверке связи не удалось обнаружить узел %%I.
)
)
При наличии в сети WINS-сервера список активных клиентов службы сообщений удобно получать через "NETSH WINS"... фишка в том, что при запуске компа и при регистрации пользователя служба сообщений регистрирует на WINS-сервере запись с кодом [03], а при выключении (штатном) освобождает эту запись... Т.е. список активных записей в норме соответствует списку компов/пользователей, готовых к получению сообщений. Из этого даже можно извлечь выгоду - не рассылать сообщения на машины без залогиненных пользователей.
Один минус - WINS не отличает компьютер от пользователя, поэтому сообщения могут уйти дважды... но обычно в организациях система именования пользователей и станций отличается, поэтому их можно фильтровать регулярным выражением (через FINDSTR) или применять другие методы (например, сверять со списком машин/пользователей). Для надежности и учета незапланированных отключений света можно совмещать с пингом, который привел выше Petya V4sechkin. Пример команды "NETSH WINS":@Echo Off
SetLocal EnableDelayedExpansion
Set $WINS=MyServer
For /F "Tokens=1 Delims=[ " %%i In ('Netsh WINS Server \\%$WINS% Show Database Servers^={} RecType^=2 EndChar^=3^|FindStr /IBRC:"................\[03h\]-D-A"') Do (
Set MSGCLIENT=%%i
@Echo !MSGCLIENT!
)
Petya V4sechkin, спасибо большое за верно указанный путь, но тут проблемка, в вашем скрипте программа sent.exe не будет выполнена если хоть один из узлов недоступен. Или я не прав? а надо что бы команда выполнялась на все узлы, за исключением недоступных.
amel27, а вот про это я даже не подумал, да и с WINS никогда не сталкивался...
как итог на 2003 win рядом с службой DNS я поднимаю службу WINS и запуская этот скрипт (указав свой сервер на месте MyServer) в переменную %%i я получаю список клиентов поддерживаюзих Службу сообщений? опять не совсем то... служба включена у всех, а получателях send.exe должны только определнные компьютеры...
Petya V4sechkin
10-09-2008, 09:20
что бы команда выполнялась на все узлы, за исключением недоступных.
Ну да.
служба включена у всех, а получателях send.exe должны только определнные компьютеры »сверить с готовым списком как раз не проблема... к примеру, список лежит в TXT-файле с именем как у скрипта... тогда вариант (через "NET SEND"), совмещенный с PING может быть таким:@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set $WINS=MyServer
Set $FILE=%~dpn0.txt
Set /P $TEXT=Please, input message text:
For /F "Tokens=1,5 Delims=[ " %%i In ('Netsh WINS Server \\%$WINS% Show Database Servers^={} RecType^=2 EndChar^=3^|Find /I "[03h]-D-A"') Do (
FindStr /I/B/E/C:"%%i" "%$FILE%" 1>nul 2>&1
If "!ERRORLEVEL!"=="0" (
Ping -n 1 -w 1 %%j >nul
If "!ERRORLEVEL!"=="0" Net Send %%i "%$TEXT%"
)
)
- в списке могут быть как имена компьютеров, так и имена пользователей
- пользователь-отправитель должен входить в группу "пользователи WINS" сервера
Whiteee, как-то так:
Код:
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
SET /P text=Please, input message text:
For %%I In (visior-1,hina1,hev1,era1,hin1,kov1) Do (
Ping -n 1 -w 1 %%I >nul
If "!ErrorLevel!"=="0" (
"\\srv-file\public\it\sent.exe" %%I "%text%"
) Else (
Echo При проверке связи не удалось обнаружить узел %%I.
)
) »
а возможно сделать так, что бы ping сначала проверял весь список получателей, потом сключал недоступных и доступных единой толпой передавал в приложение send (она умеет обрабатывать получателей через запятую без пробела)
просто при существующем раскладе приложение send запускается каждый раз заново, а ее запуск это около 10ти секунд %(
Petya V4sechkin
10-09-2008, 20:10
Whiteee, можно:
@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
Set /P text=Please, input message text:
For %%I In (visior-1,hina1,hev1,era1,hin1,kov1) Do (
Ping -n 1 -w 1 %%I >nul
If "!ErrorLevel!"=="0" (
If "!Lst!"=="" (
Set Lst=%%I
) Else (
Set Lst=!Lst!,%%I
)
) Else (
Echo При проверке связи не удалось обнаружить узел %%I.
)
)
If Not "!Lst!"=="" "\\srv-file\public\it\sent.exe" !Lst! "%text%"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.