|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Помощь по: батник для управления сервисами |
|
|
CMD/BAT - [решено] Помощь по: батник для управления сервисами
|
Новый участник Сообщения: 13 |
Профиль | Отправить PM | Цитировать
Возникла необходимость мониторинга и запуска сервисов на удалённом PC, для решения данной проблемы был использован батник взятый с этого форума (ссылку к сожалению не смогу указать) автор батника registeruser1
Итак, скопировал я батник изменил то что мне надо было, понятное дело что изменил кодировку, расширение... запустил при выполнение батника вылезла ошибка (скрин прилагается). вопрос такой: что нужно было прописывать в переменной среде? P.S. Если важно: OS - Windows Server2003 код баника: @echo off echo. echo ******************************************************************************* @echo. echo PLEASE WAIT... SCANING SERVICES: @echo. echo ******************************************************************************* echo. setlocal enabledelayedexpansion set server=\\127.0.0.1 ping -n 1 %server:~2% 1>nul 2>nul || ( echo NO RESPOND FROM SERVER, EXITING... & pause & exit ) title Scanning set "sernum=100" for /f "tokens=1*" %%a in ('sc %server% query state^= all') do ( if /i .%%a equ .SERVICE_NAME: set "_servicen_=%%b" && title Scanning %server%: %%b if /i .%%a equ .DISPLAY_NAME: echo %%b | find /i "Windows" 1>nul && ( echo %%b set /a sernum += 1 set "_service_!sernum:~1!=!_servicen_!" set "_serviced_!sernum:~1!=%%b" ) ) :display TITLE WELCOME cls if errorlevel 0 @echo echo. echo ******************************************************************************* @echo. echo STARTING/STOPPED SERVICES MENU: @echo. echo ******************************************************************************* echo. for /f "tokens=2,3* delims=_=" %%a in ('set _service_') do ( for /f "tokens=4" %%s in ('sc %server% query %%b ^| findstr /r /b /c:" *STATE " ') do ( set "_displ_=!_serviced_%%a! " echo.%%a !_displ_:~0,58! %%s ) ) echo. TITLE WELCOME set "reply=0" set /p reply="Please select number for start/stop and press Enter (0=RESCAN): " set "reply=00%reply: =%" set "reply=%reply:~-2%" if %reply% == 00 goto :display if not defined _service_%reply% echo Service %reply% not defined & pause & exit sc %server% query !_service_%reply%! | findstr /r /b /c:" *STATE " | 1>nul find "RUNNING" && (1>nul sc %server% stop !_service_%reply%! & sc %server% config !_service_%reply%! start= disabled 1>nul 2>&1)||(sc %server% config !_service_%reply%! start= auto 1>nul 2>&1 & 1>nul sc %server% start !_service_%reply%!) goto :display |
|
Отправлено: 13:51, 05-04-2011 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать cobra2029, используйте лучше WMI для слежения за сервисом посредством WSH или PoSH.
|
Отправлено: 19:21, 05-04-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать Iska, ммм можно поподробнее, и если нетрудно пример.
|
Отправлено: 10:25, 06-04-2011 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 10:53, 06-04-2011 | #4 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать Iska, спасибо за ссылки очень помогли.
использовав один из скриптов, я получил почти то, что хотел, но появился еще 1 вопрос: на удалённом компе( назовем его "А") есть пользователь и пароль, на моём рабочем ( "В") логин и пас такие же, но на компе "С", на котором необходимо запускать скрипт, чтобы перезапустить нужный сервис на удалённом компе "А", логин и пас другие. как мне вбить в скрипт, логин и пас, через которые бы он заходил на серв ("А"). если запустить скрипт на машине "В" то он работает и все классно. но если его запустить на машине "С" то пишет типа нет доступа. тест скрипта: Option Explicit Dim objWMIService, objItem, objService, objShell Dim colListOfServices, Action Dim strServiceList, strServiceName, strComputer, strService Const TIMEOUT = 2 Set objShell = WScript.CreateObject("WScript.Shell") 'имя компьютера. Do strComputer = InputBox ("Введите имя компьютера","Computer Name","klon") If strComputer = " " Then WScript.Quit ElseIf strComputer = " " Then MsgBox "You must specify a Computer name",vbOkOnly,"Computer Name Required" End If Loop Until strComputer <> " " 'описание имени сервиса Do strService = InputBox ("Enter the name of the Service to start or stop" &_ vbCrLf & "or a ? for a listing of services" &_ vbCrLf & "Note: The service name is Case Sensitive","Service Name"," ") 'сюда добавить имя сервиса If strService = "" Then WScript.Quit ElseIf strService = " " Then MsgBox "You must specify a Service name",vbOkOnly,"Service Name Required" End If 'If a '?' is entered, get a formatted list of Services by (Real) Name and Display Name If strService = "?" Then Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colListOfServices = objWMIService.ExecQuery _ ("Select * from Win32_Service ") strServiceList = LeftPad("Service Name", 30, Chr(32)) & vbTab & "Service Display Name" strServiceList = strServiceList & vbCrLf & LeftPad("------------", 30, Chr(32)) & vbTab & "--------------------" For Each objService in colListOfServices strServiceName = objService.name strServiceName = LeftPad(strServiceName, 30, Chr(32)) strServiceList = strServiceList & vbCrLf & strServiceName & vbTab & objService.DisplayName Next Set colListOfServices = nothing Set objWMIService = Nothing WScript.Echo strServiceList End If Loop Until strService <> " " And strService <> "?" strService = "'" & strService & "'" 'Check the service status, if it is stopped ask to start it 'if it is running ask to stop it, also if it is an auto startup 'ask if the user wants to change it to disabled. Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colListOfServices = objWMIService.ExecQuery _ ("Select * from Win32_Service Where Name =" & strService & " ") For Each objService in colListOfServices If objService.State = "Running" Then Action = MsgBox("The " & strService & " service is running; do you want to stop it?", vbYesNo, "Stop Service?") If Action = vbYes Then objService.StopService() objShell.Popup "Stop request sent.", TIMEOUT If objService.StartMode = "Auto" Then Action = MsgBox("The " & strService & " service is stopped; do you want to disable it?", vbYesNo, "Disable Service?") If Action = vbYes Then errReturnCode = objService.Change( , , , , "Disabled") objShell.Popup "Disable Service request sent.", TIMEOUT End If End If End If ElseIf objService.State = "Stopped" Then If objService.StartMode = "Disabled" Then MsgBox "The " & strService & " service is Disabled and can not be started with this script",vbOkOnly,"Service Disabled" Else Action = MsgBox("The " & strService & " service is stopped; do you want to start it?", vbYesNo,"Start Service?") If Action = vbYes Then objService.StartService() objShell.Popup "Start request sent.", TIMEOUT End If End If Else objShell.Popup "Service state cannot be determined.", TIMEOUT End If Next set objShell = Nothing Set objService = Nothing Set objItem = Nothing Set objWMIService = Nothing WScript.Quit ' End of WMI script to Start / Stop services Function LeftPad(strData, intLen, chrPad) 'Pads the string strData from the left to length intLen with char chrPad. 'If strData length is greater than intLen, returns strData unchanged Dim intPadLen intPadLen = intLen - Len(strData) If intPadLen > 0 Then LeftPad = String(intPadLen, chrPad) & strData Else LeftPad = strData End If End Function |
|
Последний раз редактировалось cobra2029, 07-04-2011 в 12:52. Отправлено: 16:24, 06-04-2011 | #5 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать полазил по форуму решения на вопрос не нашел, подскажите как зделать или ткните носом где можно почитать) (желательно с примером)
|
Отправлено: 18:37, 06-04-2011 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата cobra2029:
Попробуйте использовать вместо моникера (Constructing a Moniker String (Windows)) метод SWbemLocator.ConnectServer: Цитата:
|
||
Отправлено: 20:06, 06-04-2011 | #7 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать Iska, у меня что то снова не выходит, вроде делаю все как написано, но видимо что то не так, если не трудно исправьте ошибку(или скорее всего ошибки) в коде, и, если можно подробно объясните, что делал не так.
Option Explicit Dim objWMIService, objItem, objService, objShell, objPassword Dim colListOfServices, Action Dim strServiceList, strServiceName, strComputer, strService, strPassword, strUser Const TIMEOUT = 2 Set objShell = WScript.CreateObject("WScript.Shell") 'Введите имя компьютера. Do strComputer = InputBox ("Введите имя компьютера","Computer Name","djs-klon") If strComputer = " " Then WScript.Quit ElseIf strComputer = " " Then MsgBox "You must specify a Computer name",vbOkOnly,"Computer Name Required" End If Loop Until strComputer <> " " 'PW Do Set objPassword = CreateObject("ScriptPW.Password") Wscript.StdOut.Write "Please enter your password:" strPassword = objPassword.GetPassword() 'user Do Wscript.StdOut.Write "Please enter your user name:" strUser = Wscript.StdIn.ReadLine 'Enter the Service name. NOTE: Service name is case sensitive! Do strService = InputBox ("Enter the name of the Service to start or stop" &_ vbCrLf & "or a ? for a listing of services" &_ vbCrLf & "Note: The service name is Case Sensitive","Service Name","djs213bv") 'сюда добавить имя сервиса If strService = "" Then WScript.Quit ElseIf strService = " " Then MsgBox "You must specify a Service name",vbOkOnly,"Service Name Required" End If 'If a '?' is entered, get a formatted list of Services by (Real) Name and Display Name If strService = "?" Then Set objWMIService = GetObject(SWbemLocator.ConnectServer( _ strServer, _ strUser, _ strPassword, _ )) Set colListOfServices = objWMIService.ExecQuery _ ("Select * from Win32_Service ") strServiceList = LeftPad("Service Name", 30, Chr(32)) & vbTab & "Service Display Name" strServiceList = strServiceList & vbCrLf & LeftPad("------------", 30, Chr(32)) & vbTab & "--------------------" For Each objService in colListOfServices strServiceName = objService.name strServiceName = LeftPad(strServiceName, 30, Chr(32)) strServiceList = strServiceList & vbCrLf & strServiceName & vbTab & objService.DisplayName Next Set colListOfServices = nothing Set objWMIService = Nothing WScript.Echo strServiceList End If Loop Until strService <> " " And strService <> "?" strService = "'" & strService & "'" 'Check the service status, if it is stopped ask to start it 'if it is running ask to stop it, also if it is an auto startup 'ask if the user wants to change it to disabled. Set objWMIService = GetObject(SWbemLocator.ConnectServer( _ strServer, _ strUser, _ strPassword, _ ) ) Set colListOfServices = objWMIService.ExecQuery _ ("Select * from Win32_Service ") For Each objService in colListOfServices If objService.State = "Running" Then Action = MsgBox("The " & strService & " service is running; do you want to stop it?", vbYesNo, "Stop Service?") If Action = vbYes Then objService.StopService() objShell.Popup "Stop request sent.", TIMEOUT If objService.StartMode = "Auto" Then Action = MsgBox("The " & strService & " service is stopped; do you want to disable it?", vbYesNo, "Disable Service?") If Action = vbYes Then errReturnCode = objService.Change( , , , , "Disabled") objShell.Popup "Disable Service request sent.", TIMEOUT End If End If End If ElseIf objService.State = "Stopped" Then If objService.StartMode = "Disabled" Then MsgBox "The " & strService & " service is Disabled and can not be started with this script",vbOkOnly,"Service Disabled" Else Action = MsgBox("The " & strService & " service is stopped; do you want to start it?", vbYesNo,"Start Service?") If Action = vbYes Then objService.StartService() objShell.Popup "Start request sent.", TIMEOUT End If End If Else objShell.Popup "Service state cannot be determined.", TIMEOUT End If Next set objShell = Nothing Set objService = Nothing Set objItem = Nothing Set objWMIService = Nothing WScript.Quit ' End of WMI script to Start / Stop services Function LeftPad(strData, intLen, chrPad) 'Pads the string strData from the left to length intLen with char chrPad. 'If strData length is greater than intLen, returns strData unchanged Dim intPadLen intPadLen = intLen - Len(strData) If intPadLen > 0 Then LeftPad = String(intPadLen, chrPad) & strData Else LeftPad = strData End If End Function |
Последний раз редактировалось cobra2029, 07-04-2011 в 12:53. Отправлено: 10:37, 07-04-2011 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Как я не могу объяснить Вам, что Вы делаете не так, коль Вы молчите о том, что Вы хотите получить, что делает (или должен делать) Ваш скрипт, и что именно «не выходит»?!
Про грамматику я уже упоминал. Если Вы напишете ответ в том же духе — не обессудьте, я его молча проигнорирую. |
Отправлено: 10:58, 07-04-2011 | #9 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать "что должен делать скрипт?"
он должен узнавать какое состояние (запущен или остановлен) у сервисов на удаленном компе (там стоит winserv2000), и по команде пользователя или запустить, или остановить сервис. как я понимаю скрипт должен подключиться к удалённой машине, получить статус сервиса (пользователь сам укажет какой), или вывести список всех сервисов (этот вариант был бы самым лучшим), и выполнить команду пользователя (старт сервиса или стоп сервиса). теперь что не получается: я использовал скрипт из сообщения 5 (этой темы). С ним все нормально, он работает но удаётся подключиться только с моей машины. Мне же необходимо чтобы этот скрипт запускался и работал с другой машины. Как я понимаю, на моей он работает по тому что на сервере ("А" как я уже писал выше), логин и пас точно такие же как и на моей машине ("В"), а вот на машине ("С") логин и пас отличаются. Мне нужно чтоб скрипт работал именно с машины "С". добавить логин и пас машины "С" на машину "А" не подходит, в свою очередь нельзя создать пользователя (с логином и пасом как на машине "А") на машине "С". ..."что именно не выходит"? я прочитал статьи которые Вы мне написали, модифицировал скрипт, но видимо что то сделал не так, скрипт не запускается вообще. P.S. учёл ваши пожелания по поводу запятых. |
Последний раз редактировалось cobra2029, 07-04-2011 в 13:56. Отправлено: 11:31, 07-04-2011 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Новые элементы панели управления! Нужна помощь! | LP92 | Автоматическая установка Windows 2000/XP/2003 | 2 | 16-07-2010 14:23 | |
CMD/BAT - [решено] батник для управления сервисами | registeruser1 | Скриптовые языки администрирования Windows | 9 | 07-05-2010 13:24 | |
батник для NTOS | admart | Лечение систем от вредоносных программ | 2 | 17-10-2008 23:36 | |
Проблема с сервисами | CTEPBA | Microsoft Windows NT/2000/2003 | 1 | 19-01-2006 08:51 | |
батник для выключения win98 | mikesip | Microsoft Windows 95/98/Me (архив) | 4 | 21-12-2004 19:01 |
|