2010-10-27 77 views
-3

我想檢查窗口服務是否正常工作。我爲此寫了代碼;它對本地系統工作正常,但是當我將它用於遠程系統時,它不起作用。是檢查窗口服務工作正常

代碼爲如下:

//Main Unit... 

ServiceWatcher := TService.Create(); 
    ShowMessage('Hello ServiceWatcher'); 

//This is for local system(Which is working fine) 

if(ServiceWatcher.ServiceRunning('','CanveraPushOrder'))then 
    begin 
    ShowMessage('Sevice is running'); 
    end 
    else begin 
    ShowMessage('Sevice is not working properly'); 
    end; 
if(ServiceWatcher.ServiceStopped('','CanveraPushOrder'))then 
    begin 
    ShowMessage('Sevice is stoped'); 
    end; 

//This is for remote system but its not working 

    if(ServiceWatcher.ServiceRunning('\\10.30.0.10','OCS inventory service'))then 
    begin 
    ShowMessage('Sevice is running'); 
    end 
    else begin 
    ShowMessage('Sevice is not working properly'); 
    end; 

    if(ServiceWatcher.ServiceStopped('\\10.30.0.10','OCS inventory service'))then 
    begin 
    ShowMessage('Sevice is stoped'); 
    end; 

//code for TService 

unit ServiceStatus; 

interface 
uses WinSvc,Windows; 


type 
    // The customer class definition 
    TService = class 
    private 
    public 
    constructor Create; 
    function ServiceGetStatus(sMachine,sService : string) : DWord; 
    function ServiceRunning(sMachine, sService : string) : boolean; 
    function ServiceStopped(sMachine, sService : string) : boolean; 
    end; 

implementation 

constructor TService.Create; 
begin 

end; 
function TService.ServiceGetStatus(sMachine,sService : string) : DWord; 
var 
    schm,schs : SC_Handle; 
    ss  : TServiceStatus; 
    dwStat : DWord; 
begin 
    //dwStat := -1; 
    schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT); 
    if(schm > 0)then 
    begin 
     schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS); 
     if(schs > 0)then 
    begin 
    if(QueryServiceStatus(schs,ss))then 
     begin 
     dwStat := ss.dwCurrentState; 
    end; 
    CloseServiceHandle(schs); 
    end; 
    CloseServiceHandle(schm); 
    end; 
    Result := dwStat; 
end; 

function TService.ServiceRunning(sMachine, sService : string) : boolean; 
begin 
    Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService); 
end; 

function TService.ServiceStopped(sMachine, sService : string) : boolean; 
begin 
    Result := SERVICE_STOPPED = ServiceGetStatus(sMachine, sService); 
end; 

end. 

請檢查並告訴我在哪裏出了錯?

+2

歡迎來到StackOverflow。將您的問題標爲「緊急」不會使您得到更好的答案或更快的答案。通過制定您的問題,您可以得到更好的答案,因爲它具有所需的所有信息(如:完整的代碼示例,明確闡述您期望從您的代碼中獲得什麼行爲,哪種服務,您用於本地和遠程系統的憑證類型等)。另請參閱常見問題解答:http://stackoverflow.com/faq – 2010-10-27 16:15:50

+0

順便說一句:Windows已經有一個服務「監護人」選項。如果您在服務屬性對話框中選擇[恢復]選項卡,則會發現Windows在服務失敗時應執行的操作。正如我的回答,一項服務可能仍在運行,但尚未運行。 – 2010-10-28 10:16:22

回答

2

如果你是服務的作者,你應該添加一些日誌來看看發生了什麼。當使用GUI時,它不是很好。使用某種日誌記錄到文本文件。

至於檢查服務是否正在運行,您可以使用sc命令。有例如檢查,並開始再次遠程計算機上Apache服務的檢查:

c:\tmp>sc \\169.0.1.234 query apache2.2 

SERVICE_NAME: apache2.2 
    TYPE    : 10 WIN32_OWN_PROCESS 
    STATE    : 1 STOPPED 
       (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) 

c:\tmp>sc \\169.0.1.234 start apache2.2 

SERVICE_NAME: apache2.2 
    TYPE    : 10 WIN32_OWN_PROCESS 
    STATE    : 2 START_PENDING 
       (NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN) 
    ... 
    PID    : 2844 

c:\tmp>sc \\169.0.1.234 query apache2.2 

SERVICE_NAME: apache2.2 
    TYPE    : 10 WIN32_OWN_PROCESS 
    STATE    : 4 RUNNING 

嘗試,如果有sc命令檢查工作的服務。

編輯:

如果sc報告了一些錯誤,然後檢查是否安裝並10.0.30.0機器上運行的服務。您可以使用services.msc命令(GUI服務管理器)或使用net命令進行檢查。 net使用我的機器上用「Java快速入門」運行實例:

C:\tmp>net start | grep Java 
    Java Quick Starter 

如果是工作,那麼你必須檢查sc錯誤信息的詳情使用Bing,谷歌或其他搜索引擎。我認爲如果你無法通過sc來檢查服務是否正在運行,那麼你的程序也會失敗。

+0

它與SC不工作.. – 2010-10-27 12:37:08

+0

我寫了... c:\ tmp> sc \\ 10.30.0.10查詢Java快速入門 – 2010-10-27 12:37:37

+0

但它不工作...我應該怎麼做..plz告訴我 – 2010-10-27 12:37:59

0

服務管理器只會告訴您服務是否已啓動並對SCM作出響應。它不會告訴你任何其他的東西 - 它可能根本不起作用,但是正在開始。 要訪問遠程系統上的SCM,您需要適當的權限。