Тема: Управление службой 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"

