1

Тема: VBS: Мониторинг и управление сервисами на удалённом пк

Доброго времени суток!

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

Суть задачи:

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


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

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

вот код который  использовался мной.




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","djs-klon") 
       If strComputer = " " Then 
          WScript.Quit 
       ElseIf strComputer = " " Then 
          MsgBox "Вы  должны ввести уникальное имя компьютера",vbOkOnly,"Computer Name Required" 
       End If 
Loop Until strComputer <> " " 
 
'сюда  добавить имя сервиса
Do  
    strService = InputBox  ("Ввведите имя сервиса который необходио сотановить или запустить" &_ 
           vbCrLf & "или введите ? для вывода списка всех сервисов" &_ 
           vbCrLf & "имя сервиса чувствительно к регистру","Service Name"," ") 'сюда  добавить имя сервиса
       If strService = "" Then 
          WScript.Quit 
       ElseIf strService = " " Then 
        MsgBox "Вы  должны ввести уникальное имя сервиса",vbOkOnly,"Service Name Required" 
       End If 
    'еслии ввели ? то
    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 & "'" 
 
'проверка статус сервиса и выбор противоположного от статуса действия
'если  выбрано остановить задаётся вопрос  об отключении сервиса 
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 & " сервис запущен, Вы хотите остановить сервис?", vbYesNo, "Stop Service?") 
        If Action = vbYes Then 
            objService.StopService() 
            objShell.Popup "Сервис остановлен", TIMEOUT 
            If objService.StartMode = "Auto" Then 
                Action = MsgBox("The " & strService & " сервис остановлен.  Вы хотите  выключить его?", vbYesNo, "Disable Service?") 
                If Action = vbYes Then 
                    errReturnCode = objService.Change( , , , , "Disabled")  
                    objShell.Popup "Сервис отключён", TIMEOUT 
                End If 
            End If 
        End If 
    ElseIf objService.State = "Stopped" Then 
        If objService.StartMode = "Disabled" Then 
            MsgBox "The " & strService & " сервис отключён. Запуск из данного скрипта  не возможен. Обратитесь в  Кабинет 203",vbOkOnly,"Service Disabled" 
        Else 
            Action = MsgBox("The " & strService & " сервес остановлен. Вы хотите запустить сервис?", vbYesNo,"Start Service?") 
            If Action = vbYes Then 
                objService.StartService() 
                objShell.Popup "Сервес запущен.", TIMEOUT 
            End If 
        End If 
    Else 
        objShell.Popup "Сервис не обнаружен, проверьте правильность введённого имени, для вывода вего списка сервисов  введите знак ?", TIMEOUT 
    End If 
Next  
 
set objShell = Nothing 
Set objService = Nothing 
Set objItem = Nothing 
Set objWMIService = Nothing 
 
WScript.Quit 
 
Function LeftPad(strData, intLen, chrPad) 
    Dim intPadLen 
    intPadLen = intLen - Len(strData) 
    If intPadLen > 0 Then 
         LeftPad = String(intPadLen, chrPad) & strData 
    Else 
         LeftPad = strData 
    End If 
End Function

Скрипт который я  привел выше  работает замечательно, но есть одна маленькая проблемка:

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

Попробую обрисовать всю картину, что бы уважаемым знатокам было понятно, что я  от них хочу:

Есть 3  ПК, назовём их "А", "В" и "С"
ПК - "А" серверная машина (ОС: WinServ2000) логин и пас: ADM; 123, находится в  домене DPO
ПК - "В" моя машина (ОС: WinServ2003) логин и пас: ADM; 123, находится в  домене DPO
ПК - "С" машина дежурного (ОС: WinХР) логин и пас: User; 1321, находится в  домене отличном  от  DPO

Скрипт, как уже писал выше, замечательно работает, и  следить за сервисами машины "А"  с машины "В" удаётся.
Но при установке  этого же скрипта  на машину "С", он перестаёт работать.

Как я понимаю, скрипт работает на машине "В" по тому что на машине "А", логин, пас, и домен одинаковые, а вот на машине ("С") логин, пас, домен - отличаются.
Мне нужно чтоб скрипт работал именно с машины "С".

Варианты  решения  которые  не подходят:
1) добавить логин и пас машины "С" на машину "А";
2) нельзя создать пользователя (с логином и пасом как на машине "А") на машине "С".

Больше в  голову  пока ничего не  приходит, вот по этому и обращаюсь к Вам.
Очень надеюсь на вашу  помощь.


P.S. по форуму искал находил похожую проблему в теме: http://forum.script-coding.com/viewtopic.php?id=5540
проведя  все  манипуляции какие  были изложены  в ней, положительного результата не получил.
Других похожих тем  не нашел.

2 (изменено: Dmitrii, 2011-04-08 13:10:14)

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Раз речь идёт о разных доменах, то в первую очередь надо "смотреть в сторону" настройки доверительных отношений между доменами.
Далее надо убедиться в том, что пользователю, в контексте безопасности которого запускается сценарий, достаточно полномочий для обращения к службам сервера.

3

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Dmitrii, к огромному сожалению этот вариант тоже не  подходит, из-за  некоторых инструкций  предприятия.


есть ли еще какие-то варианты?

4

Re: VBS: Мониторинг и управление сервисами на удалённом пк

OFF: cobra2029, ну, вот — ведь можете же, когда захотите, писать внятно и по-русски, начинать предложения с заглавной буквы и корректно расставлять запятые.

5

Re: VBS: Мониторинг и управление сервисами на удалённом пк

cobra2029 пишет:

... есть ли еще какие-то варианты?

Поищите на форуме темы по ключу "проксирование". Может быть, этот вариант Вам подойдёт.

6

Re: VBS: Мониторинг и управление сервисами на удалённом пк

alexii пишет:

OFF: cobra2029, ну, вот — ведь можете же, когда захотите, писать внятно и по-русски, начинать предложения с заглавной буквы и корректно расставлять запятые.

Не понял, я вообще то первый  раз на  этом форуме.

7

Re: VBS: Мониторинг и управление сервисами на удалённом пк

OFF: Ключевое слово — «на  этом».

8

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Dmitrii пишет:
cobra2029 пишет:

... есть ли еще какие-то варианты?

Поищите на форуме темы по ключу "проксирование". Может быть, этот вариант Вам подойдёт.

Спасибо, помогло.

В  итоге решил все таки просто добавить пользователя  на сервер, так  было проще и  более  менее  приемлемо.


Возник  еще  1  вопрос по скрипту:

Как можно реализовать такое  меню?

Имя сервиса          Статус сервиса        СТОП/СТАРТ

Сам пробовал не  получается, если Вам не трудно, ткните носом  где  можно посмотреть пример как  это делается, или  напишите  пример кода.

Заранее спасибо.

9 (изменено: cobra2029, 2011-04-11 10:09:24)

Re: VBS: Мониторинг и управление сервисами на удалённом пк

alexii пишет:

OFF: Ключевое слово — «на  этом».

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

10 (изменено: Dmitrii, 2011-04-11 13:26:53)

Re: VBS: Мониторинг и управление сервисами на удалённом пк

cobra2029 пишет:

... Как можно реализовать такое  меню?
Имя сервиса          Статус сервиса        СТОП/СТАРТ...

Для создания интерактивных интерфейсов в GUI обычно используют либо HTA, либо средства какого-нибудь приложения из пакета MS Office.

11

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Dmitrii пишет:
cobra2029 пишет:

... Как можно реализовать такое  меню?
Имя сервиса          Статус сервиса        СТОП/СТАРТ...

Для создания интерактивных интерфейсов в GUI обычно используют либо HTA, либо средства какого-нибудь приложения из пакета MS Office.

спасибо, вечерком  что-нибудь попробую.

12

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Сразу же возник вопрос: а как это все до кучи связать?
Если  нетрудно, приведите  небольшой примерчик.

13

Re: VBS: Мониторинг и управление сервисами на удалённом пк

cobra2029 пишет:

...
спасибо, вечерком  что-нибудь попробую.

Я бы весь скрипт вложил в HTA, в котором и имя удаленной машины можно ввсести и имя AD-серверов, если таковые нужны для запросов. По команде приложение формировало бы HTML-код своего слоя в виде таблички, и в коде на каждую строку-сервис добавлять код своей кнопки для пуска/остановки сервиса - например, вызов некой своей процедуры с передачей в качестве параметра имя текущего сервиса. А имя машины процедура может взять с значений input-ных HTML-элементов приложения.

WBR. Roman

14

Re: VBS: Мониторинг и управление сервисами на удалённом пк

cobra2029 пишет:

Сразу же возник вопрос: а как это все до кучи связать?
Если  нетрудно, приведите  небольшой примерчик.

OFF: Если вопрос - о написании HTA, то могу отправить свое старенькое не претендующее на "красивость исполнения" приложение, которое делает табличку с кнопками. Там правда речь не о сервисах машины, а о компьютерах определенного юнита, но в принципе Вам в качестве примера может помочь.

WBR. Roman

15 (изменено: cobra2029, 2011-04-11 16:37:50)

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Rom5 пишет:
cobra2029 пишет:

Сразу же возник вопрос: а как это все до кучи связать?
Если  нетрудно, приведите  небольшой примерчик.

OFF: Если вопрос - о написании HTA, то могу отправить свое старенькое не претендующее на "красивость исполнения" приложение, которое делает табличку с кнопками. Там правда речь не о сервисах машины, а о компьютерах определенного юнита, но в принципе Вам в качестве примера может помочь.

Да, если несложно,  отправьте, посмотрю может, что-то получится

16

Re: VBS: Мониторинг и управление сервисами на удалённом пк

Rom5 пишет:
cobra2029 пишет:

...
спасибо, вечерком  что-нибудь попробую.

Я бы весь скрипт вложил в HTA, в котором и имя удаленной машины можно ввсести и имя AD-серверов, если таковые нужны для запросов. По команде приложение формировало бы HTML-код своего слоя в виде таблички, и в коде на каждую строку-сервис добавлять код своей кнопки для пуска/остановки сервиса - например, вызов некой своей процедуры с передачей в качестве параметра имя текущего сервиса. А имя машины процедура может взять с значений input-ных HTML-элементов приложения.

Спасибо, очень интересное  предложение, единственный минус, что знаний по НТА  недостаточно, вернее их нет совсем . Но я попробую что-нибудь сварганить.
Спасибо за подсказку.

17

Re: VBS: Мониторинг и управление сервисами на удалённом пк

cobra2029 пишет:
Rom5 пишет:
cobra2029 пишет:

Сразу же возник вопрос: а как это все до кучи связать?
Если  нетрудно, приведите  небольшой примерчик.

OFF: Если вопрос - о написании HTA, то могу отправить свое старенькое не претендующее на "красивость исполнения" приложение, которое делает табличку с кнопками. Там правда речь не о сервисах машины, а о компьютерах определенного юнита, но в принципе Вам в качестве примера может помочь.

Да, если несложно,  отправьте, посмотрю может, что-то получится

Вот, мой архив - only_comp_AD--hta--20110412.rar http://files.mail.ru/T6E2SQ
Это "боевое" приложение, которое я не пытался сделать универсальным, поэтому для запуска его надо в коде заменить явное указание структуры юнитов домена на свое, т.е. делать замены в строках вида: <LDAP://OU=""Cherkasy Region"",OU=....
Приложение так же запускает некоторые другие мои внешние скрипты, которые я в этот архив не вкладывал. Если кому нужно будет - обращайтесь.
Хотя, для Ваших нужд возможно и не обязательно его запускать - достаточно рассмотреть исходный код (сам comp_AD.hta) и сделать по своему.

Если уж сильно захочется запустить мое приложение и не получается его подправить, то дайте мне знать об этом - постараюсь его чуть унифицировать.

P.S. По моему и на "Сером форуме" есть описание - чем HTA отличается от обычного HTML - поищите и многое станет ясно.

WBR. Roman

18

Re: VBS: Мониторинг и управление сервисами на удалённом пк

cobra2029 пишет:

... приведите  небольшой примерчик.

В качестве базы для создания GUI я обычно использую Excel. Пример можно найти здесь: http://fayloobmennik.net/536913