1 (изменено: Вячеслав, 2012-11-23 18:07:42)

Тема: Управление службой Windows с помощью JScript

Доброго дня!
Коротко опишу задачу:
Управление определенной службой Windows с помощью JScript.
На форме ( а именно Windows Gadget ) есть три кнопки - Старт, Стоп и Рестарт.

Кнопка Старт - запуск службы.
Стоп - остановка службы.
Рестарт - рестарт службы.
При этом:
Когда служба запущена, активны кнопки - Стоп и Рестарт.
Когда служба остановлена - активна только кнопка Старт.
В процессе запуска службы - все кнопки неактивны.

var currentServiceState;
var eventHandlerSet = false;

objStart = document.getElementById("start");

// вход 
document.onreadystatechange = function(){
    if (document.readyState == "complete"){
        getServiceState();
        setTimeout("refresh()", 1000);
    }
}

// обработчик событий по клику
function addEventHandler(id, type, handler)
{
    var obj = document.getElementById(id);
    
    if (obj.addEventListener)
        obj.addEventListener(type, handler, false);
    else if (obj.attachEvent)
        obj.attachEvent('on' + type, handler);
}

// удаление обработчика событий
function removeEventHandler(id, type, handler) {
    
    var obj = document.getElementById(id);
    if (obj.removeEventListener) 
        obj.removeEventListener (type, handler, false);
     if (obj.detachEvent)
        obj.detachEvent ('on' + type, handler); 
}

// функция обновления статуса сервиса

function refresh(){
    RefreshInterval = 5; // value in seconds
    
    setTimeout("refresh()", RefreshInterval * 1000);
    getServiceState();
    //setupControls();
}

// отображение статуса сервиса в виде строки
function setState(status_text){
    newHTML = '<p>' + status_text;
    newHTML += '</p>';
    
    obj = document.getElementById("state_text");
    
    if ( obj.innerHTML != newHTML){
        obj.innerHTML = newHTML;
    }
}

// получение статуса сервиса

function getServiceState()
{
    var WMI_SERVICE_STOPPED = "Stopped"
       var WMI_SERVICE_STARTED = "Started"
    var serviceName = "ADDAXAppServer";
    var objWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2");
    var objService = objWMIService.ExecQuery('Select * from Win32_Service Where DisplayName = "ADDAXAppServer"');
    var enumItems = new Enumerator(objService);
    
    for( ;!enumItems.atEnd(); enumItems.moveNext() ){
        
        var objItem = enumItems.item();
        if( objItem.State == "Stopped" ) 
        {
            setState(WMI_SERVICE_STOPPED);
            setStateIcon(0);
            currentServiceState = 0;
            addEventHandler(objStart, 'click', setServiceState());
        }
        
        else if( objItem.State == "Running" ) 
        {
            setState(WMI_SERVICE_STARTED);
            setStateIcon(1);
            currentServiceState = 1;
            removeEventHanlder(objStart, 'click', setServiceState());
        }
        else
        {
            setState(objItem.State);
            setStateIcon(0);
            currentServiceState = 2;
            
        }
    }
}

// запуск или остановка сервиса в зависимости от его (сервиса) текущего состояния
function setServiceState()
{
    var serviceName = "ADDAXAppServer";
    var objWMIService = GetObject("winmgmts:\\\\.\\root\\CIMV2");
    var objService = objWMIService.ExecQuery('Select * from Win32_Service Where DisplayName = "ADDAXAppServer"');
    var enumItems = new Enumerator(objService);
    
    for( ;!enumItems.atEnd(); enumItems.moveNext() ){
        var objItem = enumItems.item();
        
        if( currentServiceState == 0) {
            objItem.StartService();//State(WMI_SERVICE_STOPPED);
            setStateIcon(1);
            currentServiceState = 1;
        }
        else if( currentServiceState == 1) 
        {
            objItem.StopService();//setState(WMI_SERVICE_STARTED);
            setStateIcon(0);
            currentServiceState = 0;
        }
    }
}

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

Кусок HTML кода

    
<div id="gadgetContent">
    <span id="state_icon"></span>
    <span id="state_text"></span>
    <div id="control_icons">
        <span class="control"><img id="start" src="start_off.png" /></span>
        <span class="control"><img id="stop" src="stop_off.png" /></span>
        <span class="control"><img id="restart" src="restart_off.png" /></span>
    </div>
</div>

Еще у меня есть подозрение, что в функции привязки обработчика я что-то не учел, и поэтому сервис запускается (если был остановлен) как только я запускаю гаджет. Т.е не отрабатывается событие "onclick"

2

Re: Управление службой Windows с помощью JScript

Пример:

wmi = GetObject("winmgmts:\\\\.\\root\\cimv2");
allserv = wmi.ExecQuery ("Select * from Win32_Service where name = 'FreeSSHDService'")
var enumItems = new Enumerator(allserv);
for (; !enumItems.atEnd(); enumItems.moveNext()) {
  if (!enumItems.item().Started) {
    enumItems.item().StartService();
  }
}

Если служба FreeSSHDService не запущена, запустить.

Нас невозможно сбить с пути, нам пофигу куда идти.