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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows 2000/XP (http://forum.oszone.net/forumdisplay.php?f=6)
-   -   [решено] Возможности команды net send (http://forum.oszone.net/showthread.php?t=116600)

Whiteee 08-09-2008 17:41 893872

Возможности команды net send
 
День добрый
при выполнении команды net send на определенный ВЫКЛЮЧЕННЫЙ компьютер команда пытается около 3х минут отправить сообщение и только потом вываливается в ошибку.

возможно ли сократить это время? допустим 2 секунды и сразу сброс попытки.

Petya V4sechkin 08-09-2008 18:01 893885

Whiteee, например, можно проверять доступность с помощью Ping (если ICMP разрешен):
Код:

@Echo Off
SetLocal EnableExtensions

Ping -n 1 -w 1 %1 >nul
If "%ErrorLevel%"=="0" (
  Net Send %*
) Else (
  Echo При проверке связи не удалось обнаружить узел %1.
)

Сохранить в .cmd файл и вызывать его с параметрами имя сообщение.

amel27 09-09-2008 11:01 894395

ошибка возникает также при отправке на включенный компьютер с остановленной службой сообщений

Whiteee 09-09-2008 11:14 894410

собственно я и использую стороннюю, 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 894485

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.
  )
)


amel27 10-09-2008 06:23 895207

При наличии в сети 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!
)


Whiteee 10-09-2008 09:10 895276

Petya V4sechkin, спасибо большое за верно указанный путь, но тут проблемка, в вашем скрипте программа sent.exe не будет выполнена если хоть один из узлов недоступен. Или я не прав? а надо что бы команда выполнялась на все узлы, за исключением недоступных.

amel27, а вот про это я даже не подумал, да и с WINS никогда не сталкивался...
как итог на 2003 win рядом с службой DNS я поднимаю службу WINS и запуская этот скрипт (указав свой сервер на месте MyServer) в переменную %%i я получаю список клиентов поддерживаюзих Службу сообщений? опять не совсем то... служба включена у всех, а получателях send.exe должны только определнные компьютеры...

Petya V4sechkin 10-09-2008 09:20 895281

Цитата:

Цитата Whiteee
что бы команда выполнялась на все узлы, за исключением недоступных.

Ну да.

amel27 10-09-2008 10:09 895310

Цитата:

Цитата Whiteee
служба включена у всех, а получателях 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 10-09-2008 18:18 895706

Цитата:

Цитата Petya V4sechkin
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 895791

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%"


Whiteee 12-09-2008 12:17 897105

спасибо!


Время: 01:27.

Время: 01:27.
© OSzone.net 2001-