Тема: 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
проведя все манипуляции какие были изложены в ней, положительного результата не получил.
Других похожих тем не нашел.

