Электростальский форум
Hi-Tech => Компьютеры, периферия, мультимедиа и ПО => Тема начата: Faust от 21.11.07, 13:53:41
-
Есть n-количество компов.
Надо скидывать краткую информацию, например, выключите компутер.
Пользую стандартное виндовое net send. Создал bat, чтобы слал на все машины.
Проблема в том, что если комп не в сети, т.е. выключен, то проходит очень много времени, прежде чем остальные сообщения отправятся. Возможно ли отправлять сообщения только тем компам, что в сети есть и как? В виндовой справке что-то ничего не нашел... помогите плз )
-
Есть n-количество компов.
Надо скидывать краткую информацию, например, выключите компутер.
Пользую стандартное виндовое net send. Создал bat, чтобы слал на все машины.
Проблема в том, что если комп не в сети, т.е. выключен, то проходит очень много времени, прежде чем остальные сообщения отправятся. Возможно ли отправлять сообщения только тем компам, что в сети есть и как? В виндовой справке что-то ничего не нашел... помогите плз )
воспользуйся IChat. думаю будет намного удобнее и проще.
-
воспользуйся IChat. думаю будет намного удобнее и проще.
Не совсем подходит... =(
Неужели в винде нельзя реализовать обычное условие if... then... ???
-
Спросите у Матрикса))
Он в свое время программульку писал с огроным потенциалом. Отправка через нет сенд. Выбор компьюетров куда слать, повторная отправка, зацикливание, кароч дофига всего))
-
юзай start
вот для проверки сделал у себя так:
start net send 192.168.0.2 lala
echo 1
start net send 192.168.0.2 bla bla
echo 2
pause
у меня messenger вырублен, и лень проверять полностью, но вроде работает - net send октрывается в новом окне, а батник продолжает выполнятся
зы. проверил.
start pause
echo 1
start pause
echo 2
pause
открывается два окна с паузой, а батник выводит 1 2 и все ок =)
>Проблема в том, что если комп не в сети, т.е. выключен, то проходит очень много времени, прежде чем остальные сообщения отправятся. Возможно ли отправлять сообщения только тем компам, что в сети есть и как?
А как ты себе это представляешь? Может я отстал от жизни, но я думал, что узнать комп в сети или нет можно только по таймауту, истечения которого ты так не хочешь ждать =) ... или с помощью какого-нить спец. сервиса... который работает вышеописанным способом )))
и еще... а как ты через net send компы вырубаешь?! я тоже так хочу! )) или это просто сообщение юзеру, чтоб он комп вырубил??
есть замечательная комманда shutdown, которая умеет вырубать удаленные компы при наличии там админиских прав.
вот юзер удивится когда увидит такое =)
-
>>Надо скидывать краткую информацию, например, выключите компутер.
>и еще... а как ты через net send компы вырубаешь?! я тоже так хочу! )) или это просто сообщение юзеру, чтоб он комп вырубил??
Просто сообщение =) Чтобы вырубил =) Вкл выкл и прочие полезные штуки через RAdmin =)
>А как ты себе это представляешь? Может я отстал от жизни, но я думал, что узнать комп в сети или нет можно только по таймауту, истечения которого ты так не хочешь ждать =) ... или с помощью какого-нить спец. сервиса... который работает вышеописанным способом )))
Представляю себе так: снизить ожидание до 2-3сек ;)
>есть замечательная комманда shutdown, которая умеет вырубать удаленные компы при наличии там админиских прав.
RA =)
>вот юзер удивится когда увидит такое =)
Ещё больше удивляются, когда мышка сама бегает и буковки печатаюцо о.О
=))))))
===
юзай start
вот для проверки сделал у себя так:
start net send 192.168.0.2 lala
echo 1
start net send 192.168.0.2 bla bla
echo 2
pause
у меня messenger вырублен, и лень проверять полностью, но вроде работает - net send октрывается в новом окне, а батник продолжает выполнятся
зы. проверил.
start pause
echo 1
start pause
echo 2
pause
===
Вот за это пасипа ;)
Ззы=) 40 окошек %)
-
Use LanSend, Luke
-
Faust
Я вчера только случайно наткнулся на эту тему и поэтому запаздало пишу. Увы, здесь с помощью bat файлов не всегда можно решить эту задачу. Я написал такую программу которая ВАМ бы подошла на VBS. Я нашел один класс WMI, который проверяет - находится ли компьютер в сети.
Это Win32_PingStatus.
Свойства класса Win32_PingStatus:
Address
BufferSize
NoFragmentation
PrimaryAddressResolutionStatus
ProtocolAddress
ProtocolAddressResolved
RecordRoute
ReplyInconsistency
ReplySize
ResolveAddressNames
ResponseTime
ResponseTimeToLive
RouteRecord
RouteRecordResolved
SourceRoute
SourceRouteType
StatusCode
Timeout
TimeStampRecord
TimeStampRecordAddress
TimeStampRecordAddressResolved
TimestampRoute
TimeToLive
TypeofService
Нам необходимо свойство Address - проверить есть ли такой компьютер в этой в сети.
Так же, свойство StatusCode - Присутствие его в сети. И еще нам понадобиться написать функцию отправления сообщения. Для этого удачно подходит метод Run с коммандой MS-DOS и в качестве параметра Net т.е.
WshShell.Run "Net Send" & NAME & Message,0,False
Еще, на всех компьютерах должна быть запущена "Служба сообщений". Но я думаю ВЫ это знаете. Теперь дальше. Я работаю с "ДОМЕННОЙ СЕТЬЮ" и писал эту программу под нее. После того как написал, пробовал. Все здорово получается. На проверку где то 20 компьютеров и передачу сообщений уходят секунды. Конечно все зависит от самой сети и мощностей компьютеров. Программа находит компьютеры которые в сети и отправляет им сообщения. Под конец выводит список всех компьютеров в ДОМЕНЕ со статусом "в сети" или "не в сети" в текстовый файл ListDomenComp.txt по маршруту C:\Temp а потом на экран с помощь NOTEPAD
Привожу листинг программы.
'*******************************************************************
' File: NetSendComputer.vbs (VBScript)
' Author: LEND
' Проверка наличия компьютеров в сети, отправка сообщений.
' Вывод списка компьютеров со статусом "в сети" или "не в сети" в
' текстовый файл ListDomenComp.txt а потом на экран с помощью NOTEPAD.
'*******************************************************************
Option Explicit
Dim strDomainSet
Dim WshNetWork
Dim strDomainUser
Dim strDomain
Dim objDomain
Dim kolComp
Dim objComputer
Dim m
Dim WshShell
Dim FSO
Dim FOut
Dim theNotepad
Const ForWriting = 2
Dim objPing
Dim objStatus
Dim Host
Dim KolOk
Dim KolNo
Dim TITLE
Dim sMessage
Dim dl
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
TITLE ="Подача сообщений по сети"
sMessage = InputBox("Введите сообщение",TITLE)
if sMessage="" then
WScript.Quit
end if
'==== Функция для записи имен компьютеров сети в файл ========
Sub TextOut (m, File)
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile(File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine m
' Закрываем выходной файл
FOut.Close
End Sub
'======== функция отсылки сообщения на заданный компьютер ============
Sub FuncSendMessage(CompName1,sMessage1)
Const Netsend = "%COMSPEC% /C %SystemRoot%\system32\NET.EXE SEND"
Const WindowStyle = 0
Const WaitOnReturn = False
Dim sCommand
sCommand = Netsend & " " & CompName1 & " " & sMessage1
Dim oSh
Set oSh = CreateObject("WScript.Shell")
oSh.Run sCommand, WindowStyle, WaitOnReturn
'Set oSh = Nothing
' WScript.Echo "Отослано"
End Sub
'======================================================================
Set WshNetWork=WScript.CreateObject("WScript.NetWork")
strDomainSet=WshNetWork.UserDomain ' Определяем домейн
strDomainUser=WshNetWork.ComputerName ' Имя компьютера с которого посылается
' сообщение
WScript.Echo "Имя компьютера с которого запущено сообщение - " & strDomainUser
strDomain="WinNT://" & strDomainSet ' Полностью указан Домен
WScript.Echo "Домен " & StrDomain
Set objDomain=GetObject(strDomain) ' Вызываем данные домена
WScript.Echo "Домен: " & objDomain.name
objDomain.Filter=Array("computer") ' Выводим имена компьютеров в ДОМЕНЕ
m="Просмотр компьютеров домене " & VbCrLf
kolComp=0 'Переменная определяющая кол. компьютеров в домене
KolOk=0 'Количество отвечающих на пинг машин
KolNo=0 'Количество не отвечающих на пинг машин
FOR Each objComputer in objDomain
kolComp=kolComp+1 'Считаем количество компьютеров
' Служба WMI
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("select * from Win32_PingStatus where address = '" &_
objComputer.name & "'")
For Each objStatus in objPing
' Смотрим что выдает и обрабатываем ответ
If IsNull(objStatus.StatusCode) or objStatus.StatusCode <> 0 Then
Host=objStatus.StatusCode & " off"
Else
Host="on"
End If
If Host="on" then
KolOk=KolOk+1
dl=30-len(objComputer.name)
m=m+objComputer.name & space(dl) & " Есть в сети." & VbCrLf
WshShell.Popup "Проверяется компьютер - " & objComputer.name &_
" в сети." & chr(13) & "Сообщение отправлено",1,"Проверка",64
FuncSendMessage objComputer.name,sMessage ' Функция отправления сообщений
Else
KolNo=KolNo+1
dl=30-len(objComputer.name)
m=m+objComputer.name & space(dl) & " Нет." & VbCrLf
WshShell.Popup "Проверяется компьютер - " & objComputer.name &_
" не в сети.",1,"Проверка",64
End If
Next
NEXT
if KolComp=0 then
WScript.Echo "У " & strDomainUser & " нет доступа к домену " & StrDomain
WScript.Quit
end if
m=m & VbCrLf
m=m & "Всего:" & KolComp & VbCrLf
m=m & "Всего отвечающих на ПИНГ " & KolOk & VbCrLf
m=m & "Всего не отвечающих на ПИНГ " & KolNo
' Файл запишется в корневую директорию C:\Temp\ListDomenComp.txt - Выбери сам куда
TextOut m,"C:\Temp\ListDomenComp.txt"
'Открываем созданный файл в Блокноте и выводим полученные данные на экран
Set theNotepad = WshShell.Exec("notepad " & "C:\Temp\ListDomenComp.txt" )
'*******************************************************************
Если у тебя не ДОМЕННАЯ СЕТЬ то надо пробовать - возможно подойдет.
Файл упакован в нижеприведенный архив NetSendComp.rar
Попробуй.
С уважением LEND
-
Спросите у Матрикса))
Он в свое время программульку писал с огроным потенциалом. Отправка через нет сенд. Выбор компьюетров куда слать, повторная отправка, зацикливание, кароч дофига всего))
гг...
что вспомнил ;D ;D
я уж даж не помню сохранилась ли она у мя дома. Написана была чисто на работе и для работы ;D
да и она была чисто под место работы.
там было заранее известно сколько компов и какие у них имена - они не менялись.
там было проще ;D
если делать здесь - нужно много дополнять
да и NetBios думаю включен далеко не у всех.
Net send через него идёт ведь?
-
Сеть доменная. Привязка имени и ИП к каждому компу.
В принципе, подходит и start net send =)
-
LEO
<<и еще... а как ты через net send компы вырубаешь?! я тоже так хочу! ))
или это просто сообщение юзеру, чтоб он комп вырубил??>>
Написал программу для перезагрузкии и выключения компьютера в ДОМЕННОЙ СЕТИ.
Т.е. дописал предыдущую программу.
Проверял - получается.
1) Сначала предупреждаем - шлем сообщение о перезагрузке(выключения).
Для примера:
Внимание! Сейчас компьютер будет выключен (перезагружен).
2) Потом: На своем мониторе тоже видим сообщение допустим:
Компьютер Ivayov будет выключен.
или
Компьютер Ivanov будет перезагружен.
Нажимаеи Ok и компьютер под именем Ivanov будет выключен (перезагружен). Можно убрать 2 предупреждение, тогда на всех компьютерах которые доступны в сети появиться сообщение:
Внимание! Сейчас компьютер будет выключен (перезагружен).
И после этого все компьютеры будут перезагружены (выключены).
Но есть одно но. Если компьютер хоть и имеет доступ, но не может совершить этот процесс(перезагрузку или выключение), то на этом компьютере не включены соответствующие службы. Поэтому программа предупредит
MsgBox "Внимание!" & VbCrLf &_
"Компьютер " & objComputer.name & VbCrLf &_
"есть в сети но нет к нему доступа." & VbCrLf &_
"Возможно не включена служба:" & VbCrLf &_
"Диспетчер удаленного доступа и др." & VbCrLf &_
"соответствующие службы",vbSystemModal
Если включите соответствующие службы, то процесс (перезагрузка или выключение) произойдет нормально.
Как отключить ненужные строки - заремачить т.е. поставить ' (АПОСТРОФ)
Привожу листинг такой программы.
'*******************************************************************
' File: NetSendAllComp.vbs (VBScript)
' Author: LEND
' Проверка наличия компьютеров в сети, отправка сообщений, выключение,
' перезагрузка компьютеров в сети.
' Вывод списка компьютеров со статусом "в сети" или "не в сети" в
' текстовый файл ListDomenComp.txt а потом на экран с помощью NOTEPAD.
'*******************************************************************
Option Explicit
Dim strDomainSet
Dim WshNetWork
Dim strDomainUser
Dim strDomain
Dim objDomain
Dim kolComp
Dim objComputer
Dim m
Dim WshShell
Dim FSO
Dim FOut
Dim theNotepad
Const ForWriting = 2
Dim objPing
Dim objStatus
Dim Host
im KolOk
Dim KolNo
Dim TITLE
Dim sMessage
Dim strNameSpace
Dim strClass
Dim LocOurComputer
Dim objClass
Dim dl
Dim colInstances
Dim objInstance
Const TargetMean=" для выяснения доступных машин для мониторинга служб"
Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
TITLE ="Подача сообщений по сети"
sMessage = InputBox("Введите сообщение",TITLE)
if sMessage="" then
WScript.Quit
end if
'========= Функция для записи доступных компьютеров сети в файл ==========
Sub TextOut (m, File)
' Открываем выходной файл для записи
Set FOut = FSO.OpenTextFile(File,ForWriting,true)
' Записываем текстовую строку в файл
FOut.WriteLine m
' Закрываем выходной файл
FOut.Close
End Sub
'======== функция отсылки сообщения на заданный компьютер ============
Sub FuncSendMessage(CompName1,sMessage1)
Const Netsend = "%COMSPEC% /C %SystemRoot%\system32\NET.EXE SEND"
Const WindowStyle = 0
Const WaitOnReturn = False
Dim sCommand
sCommand = Netsend & " " & CompName1 & " " & sMessage1
Dim oSh
Set oSh = CreateObject("WScript.Shell")
oSh.Run sCommand, WindowStyle, WaitOnReturn
'Set oSh = Nothing
' WScript.Echo "Отослано"
End Sub
'======================================================================
Set WshNetWork=WScript.CreateObject("WScript.NetWork")
strDomainSet=WshNetWork.UserDomain ' Определяем домен
strDomainUser=WshNetWork.ComputerName ' Имя компьютера с которого посылается
' сообщение
WScript.Echo "Имя компьютера с которого запущено сообщение - " & strDomainUser
strDomain="WinNT://" & strDomainSet ' Полностью указан Домен
WScript.Echo "Домен " & StrDomain
Set objDomain=GetObject(strDomain) ' Вызываем данные домена
WScript.Echo "Домен: " & objDomain.name
objDomain.Filter=Array("computer") ' Выводим имена компьютеров в ДОМЕНЕ
m="Просмотр компьютеров домене " & VbCrLf
kolComp=0 'Переменная определяющая кол. компьютеров в домене
KolOk=0 'Количество отвечающих на пинг машин
KolNo=0 'Количество не отвечающих на пинг машин
FOR Each objComputer in objDomain
kolComp=kolComp+1 'Считаем количество компьютеров
' Служба WMI
Set objPing = GetObject("winmgmts:{impersonationLevel=impersonate}")._
ExecQuery("select * from Win32_PingStatus where address = '" &_
objComputer.name & "'")
For Each objStatus in objPing
' Смотрим что выдает и обрабатываем ответ
If IsNull(objStatus.StatusCode) or objStatus.StatusCode <> 0 Then
Host=objStatus.StatusCode & " off"
Else
Host="on"
End If
If Host="on" then
KolOk=KolOk+1
dl=30-len(objComputer.name)
m=m+objComputer.name & space(dl) & " Есть в сети." & VbCrLf
WshShell.Popup "Проверяется компьютер - " & objComputer.name &_
" в сети." & chr(13) & "Сообщение отправлено",1,"Проверка",64
'&&&&&&&&&&& Отсылаем сообщение пользователю и перезагружаем его компьютер &&&
FuncSendMessage objComputer.name,sMessage 'Отсылаем сообщение
strNameSpace="Root\CIMV2"
strClass="Win32_OperatingSystem"
On Error Resume Next
Set objClass=GetObject("WinMgmts:{(ShutDown,RemoteShutdown)}\\" &_
objComputer.name & "\" & strNameSpace & ":" & strClass)
if Err <> 0 Then ' Если компьютер не обозначен в удаленном доступе
MsgBox "Внимание!" & VbCrLf &_
"Компьютер " & objComputer.name & VbCrLf &_
"есть в сети но нет к нему доступа." & VbCrLf &_
"Возможно не включена служба:" & VbCrLf &_
"Диспетчер удаленного доступа и др." & VbCrLf &_
"соответствующие службы",vbSystemModal
else ' Если компьютер не обозначен в удаленном доступе
'Err.clear
'On Error GoTo 0
if strDomainUser<>objComputer.name then 'Проверка на совпадение
Set colInstances=objClass.Instances_
' Смотрим
for Each objInstance In colInstances
'Тут выберите что Вам надо и заремачьте что не надо
'Заремачить - поставить ' (апостроф)
'msgBox "Компьютер " & objComputer.name &_
' " будет перезагруен",vbSystemModal
msgBox "Компьютер " & objComputer.name &_
" будет выключен",vbSystemModal
'objInstance.Reboot() 'Перезагрузка компьютеров
objInstance.Shutdown() 'Выключение компьютера
next
end if 'Проверка на совпадение
end if ' Если компьютер не обозначен в удаленном доступе
Err.clear
On Error GoTo 0
'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Else
KolNo=KolNo+1
dl=30-len(objComputer.name)
m=m+objComputer.name & space(dl) & " Нет." & VbCrLf
WshShell.Popup "Проверяется компьютер - " & objComputer.name &_
" не в сети.",1,"Проверка",64
End If
Next
NEXT
if KolComp=0 then
WScript.Echo "У " & strDomainUser & " нет доступа к домену " & StrDomain
WScript.Quit
end if
m=m & VbCrLf
m=m & "Всего:" & KolComp & VbCrLf
m=m & "Всего отвечающих на ПИНГ " & KolOk & VbCrLf
m=m & "Всего не отвечающих на ПИНГ " & KolNo
' Файл запишется в корневую директорию C:\Temp\ListDomenComp.txt - Выбери сам куда
TextOut m,"C:\Temp\ListDomenComp.txt"
'Открываем созданный файл в Блокноте и выводим полученные данные на экран
Set theNotepad = WshShell.Exec("notepad " & "C:\Temp\ListDomenComp.txt" )
'************************** Конец ********************************
Но это массовый подход
Файл прилагаю.
Разархивировать и просто запустить.
В следующем посте - одиночный.
-
LEO
С помощью этой программы можно перезагрузить, выключить несколько выборочных компьютеров по их именам. Набираем в консоли NetSendComp.vbs Ivanov Petrov
(Вводить через пробел)
Будут выключены или перезагружены компьютеры с именами:
Ivanov,Petrov
Программа не проверяет на присутствия компьютеров в сети. Если их нет в сети или если они есть в ней, но нет к ним доступа я написал обработку ошибок т.е. появится сообщение:
MsgBox "Внимание! Нет доступа к компьютеру " & VbCrLf &_
strComputer & VbCrLf &_
"Возможно не включена служба:" & VbCrLf &_
"Диспетчер удаленного доступа и др." & VbCrLf &_
"соответствующие службы",vbSystemModal
Было лень писать проверку. Она есть в первой программе. Если заремачить строчки
objInstance.Reboot() 'Перезагрузка компьютеров
objInstance.Shutdown() 'Выключение компьютера
т.е. сделать
' objInstance.Reboot() 'Перезагрузка компьютеров
' objInstance.Shutdown() 'Выключение компьютера
получим список всех компьютеров в сети без презагрузки и выключения. Список компьютеров со статусом "есть в сети" или "нет в сети" записывается в фал C:\Temp\ListDomenComp.txt
Из этого файла можно узнать какой компьютер сейчас в сети.
Привожу листинг
'*******************************************************************
' File: NetSendComp.vbs (VBScript)
' Author: LEND
' Выыключение, перезагрузка компьютеров в сети.
'*******************************************************************
Option Explicit
Dim strComputer
Dim strNameSpace
Dim strClass
Dim objClass
Dim colInstances
Dim objInstance
for Each strComputer In Wscript.Arguments
strNameSpace="Root\CIMV2"
strClass="Win32_OperatingSystem"
On Error Resume Next
Set objClass=GetObject("WinMgmts:{(ShutDown,RemoteShutdown)}\\" &_
strComputer & "\" & strNameSpace & ":" & strClass)
If Err <> 0 Then
MsgBox "Внимание! Нет доступа к компьютеру " & VbCrLf &_
strComputer & VbCrLf &_
"Возможно не включена служба:" & VbCrLf &_
"Диспетчер удаленного доступа и др." & VbCrLf &_
"соответствующие службы",vbSystemModal
else
Set colInstances=objClass.Instances_
for Each objInstance In colInstances
WScript.Echo "Компьютер " & strComputer & " будет перезагружен."
objInstance.Reboot() 'Перезагрузка компьютеров
' objInstance.Shutdown() 'Выключение компьютера
next
end if
Err.clear
On Error GoTo 0
next
'************************** Конец ********************************
Да, еще
Reboot
Shutdown
являются методами класса Win32_OperatingSystem
Там же есть еще методы:
Win32Shutdown
SetDateTime
Программа у меня работает
Оба файла - листинга можно править для своего удобства.
С уважением
LEND