Войти

Показать полную графическую версию : [решено] Помощь по: батник для управления сервисами


cobra2029
05-04-2011, 13:51
Возникла необходимость мониторинга и запуска сервисов на удалённом 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

Iska
05-04-2011, 19:21
cobra2029, используйте лучше WMI для слежения за сервисом посредством WSH или PoSH.

cobra2029
06-04-2011, 10:25
Iska, ммм можно поподробнее, и если нетрудно пример.

Iska
06-04-2011, 10:53
TechNet Script Center Repository (http://gallery.technet.microsoft.com/scriptcenter/site/search?f%5B0%5D.Type=RootCategory&f%5B0%5D.Value=operatingsystem&f%5B0%5D.Text=Operating%20System&f%5B1%5D.Type=SubCategory&f%5B1%5D.Value=services&f%5B1%5D.Text=Services):

Check to See if a Service is Installed and Running (http://gallery.technet.microsoft.com/scriptcenter/01fcf945-ad73-44e0-8cb5-152432bc6bcf)
List Service Status (http://gallery.technet.microsoft.com/scriptcenter/4ffb2acb-7f84-4285-bd92-c6e449b09c2b)
Stop or Start a Service (http://gallery.technet.microsoft.com/scriptcenter/8ec6db72-dd5e-4330-9f64-6871d3852edf)
и, наконец, Monitor Changes in Service Status (http://gallery.technet.microsoft.com/scriptcenter/816060d1-b185-485e-bda9-29c0efc87a9d)

cobra2029
06-04-2011, 16:24
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
06-04-2011, 18:37
полазил по форуму решения на вопрос не нашел, подскажите как зделать или ткните носом где можно почитать) (желательно с примером)

Iska
06-04-2011, 20:06
использовав один из скриптов, …»
cobra2029, я с большим трудом воспринимаю написанное без учёта правил грамматики и орфографии русского языка.

Попробуйте использовать вместо моникера (Constructing a Moniker String (Windows) (http://msdn.microsoft.com/en-us/library/aa389292(v=vs.85).aspx)) метод SWbemLocator.ConnectServer (http://msdn.microsoft.com/en-us/library/aa393720(v=vs.85).aspx):
You cannot specify a password in a WMI moniker string. If you must change the password (strPassword parameter) or the type of authentication (strAuthority parameter) when connecting to WMI, then call SWbemLocator.ConnectServer. Be aware that you can only specify the password and authority in connections to remote computers. Attempting to set these in a script that is running on the local computer results in a error.

cobra2029
07-04-2011, 10:37
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


еще раз спасибо за помощь.

Iska
07-04-2011, 10:58
Как я не могу объяснить Вам, что Вы делаете не так, коль Вы молчите о том, что Вы хотите получить, что делает (или должен делать) Ваш скрипт, и что именно «не выходит»?!

Про грамматику я уже упоминал. Если Вы напишете ответ в том же духе — не обессудьте, я его молча проигнорирую.

cobra2029
07-04-2011, 11:31
"что должен делать скрипт?"
он должен узнавать какое состояние (запущен или остановлен) у сервисов на удаленном компе (там стоит winserv2000), и по команде пользователя или запустить, или остановить сервис.


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

теперь что не получается:

я использовал скрипт из сообщения 5 (этой темы). С ним все нормально, он работает но удаётся подключиться только с моей машины.
Мне же необходимо чтобы этот скрипт запускался и работал с другой машины.
Как я понимаю, на моей он работает по тому что на сервере ("А" как я уже писал выше), логин и пас точно такие же как и на моей машине ("В"), а вот на машине ("С") логин и пас отличаются.
Мне нужно чтоб скрипт работал именно с машины "С".

добавить логин и пас машины "С" на машину "А" не подходит, в свою очередь нельзя создать пользователя (с логином и пасом как на машине "А") на машине "С".

..."что именно не выходит"?
я прочитал статьи которые Вы мне написали, модифицировал скрипт, но видимо что то сделал не так, скрипт не запускается вообще.



P.S. учёл ваши пожелания по поводу запятых.

cobra2029
07-04-2011, 14:43
просто интересно:

почему не запускается вот этот скрипт?


' Full Computer Name
' can be found by right-clicking My Computer,
' then click Properties, then click the Computer Name tab)
' or use the computer's IP address
strComputer = "127.0.0.1"
strDomain = "djs-klon"
Wscript.StdOut.Write "Please enter your user name:"
strUser = Wscript.StdIn.ReadLine
Set objPassword = CreateObject("ScriptPW.Password")
Wscript.StdOut.Write "Please enter your password:"
strPassword = objPassword.GetPassword()

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strUser, _
strPassword, _
"MS_409", _
"ntlmdomain:" + strDomain)
Set colSwbemObjectSet = _
objSWbemServices.ExecQuery("Select * From Win32_Process")
For Each objProcess in colSWbemObjectSet
Wscript.Echo "Process Name: " & objProcess.Name
Next


скрипт взят от сюда: http://msdn.microsoft.com/en-us/library/aa389290%28v=vs.85%29.aspx

P.S. просто решил попробовать выполнить уже готовый скрипт и все равно ошибка.

cobra2029
07-04-2011, 17:33
перечитал еще несколько статей на тему: "VBS: WMI на удаленном компьютере"
но решение своей задачи не нашел.
изучил 2 статьи по возможному решению ошибки "Разрешение отклонено "GetObject" ", проверил все какие только знал (и те которые узнал из статей) настройки DCOM, но и там безрезультатно.

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

Суть задачи (повторю для тех кому лень читать с самого начала):

"что должен делать скрипт?"

Скрипт должен узнавать какое состояние (запущен или остановлен) у сервисов на удаленном компе, и по команде пользователя запустить, или остановить сервис.

Небольшое отступление:
как я вижу выполнение этого скрипта:

После запуска скрипта, пользователю выводится список всех сервисов (неважно запущенных или не запущенных) удалённый машины (в самом скрипте прописывается ip, user name, pw).

После того как скрипт вывел список сервисов, пользователь нажимает кнопку (предположим "ОК") и ему предлагается ввести имя сервиса.
Он нажимает снова "ОК", и появляется диалоговое окно где задаётся вопрос остановить или запустить.

вот в принципе и вся задача.
Буду очень благодарен тем кто поможет её решить.

cobra2029
11-04-2011, 10:11
Задача решилась добавлением нового пользователя на сервер.




© OSzone.net 2001-2012