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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Помощь по: батник для управления сервисами (http://forum.oszone.net/showthread.php?t=203982)

cobra2029 05-04-2011 13:51 1651510

Помощь по: батник для управления сервисами
 
Вложений: 1
Возникла необходимость мониторинга и запуска сервисов на удалённом 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 1651690

cobra2029, используйте лучше WMI для слежения за сервисом посредством WSH или PoSH.

cobra2029 06-04-2011 10:25 1652052

Iska, ммм можно поподробнее, и если нетрудно пример.

Iska 06-04-2011 10:53 1652077

TechNet Script Center Repository:

Check to See if a Service is Installed and Running
List Service Status
Stop or Start a Service
и, наконец, Monitor Changes in Service Status

cobra2029 06-04-2011 16:24 1652318

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 1652409

полазил по форуму решения на вопрос не нашел, подскажите как зделать или ткните носом где можно почитать) (желательно с примером)

Iska 06-04-2011 20:06 1652475

Цитата:

Цитата cobra2029
использовав один из скриптов, …»

cobra2029, я с большим трудом воспринимаю написанное без учёта правил грамматики и орфографии русского языка.

Попробуйте использовать вместо моникера (Constructing a Moniker String (Windows)) метод SWbemLocator.ConnectServer:
Цитата:

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 1652862

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 1652877

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

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

cobra2029 07-04-2011 11:31 1652906

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


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

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

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

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

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



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

cobra2029 07-04-2011 14:43 1653053

просто интересно:

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

Код:

' 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/libr...=vs.85%29.aspx

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

cobra2029 07-04-2011 17:33 1653178

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

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

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

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

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

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

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

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

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

cobra2029 11-04-2011 10:11 1655703

Задача решилась добавлением нового пользователя на сервер.


Время: 07:30.

Время: 07:30.
© OSzone.net 2001-