2009-07-27 16 views
4

私はいくつかのWindowsサービス(別名NTサービス)が起動または停止したときに検出できるC言語でプログラムを作成しようとしています。Windows XPではWindowsサービスのステータス変更をどのように監視できますか?

機能があるようですNotifyServiceStatusChange、それはVistaとWindows 7でのみ利用できます。私はWin XPでこれをやろうとしていますので、どのような方法が最適ですか?継続的なポーリング以外はありますか?

編集:

誰でもCで回答できますか?私はC++でも大丈夫ですが、スクリプトから離れたいと思っています。

+0

これは正式な答えではありませんので、私はコメントとして追加しています。最も近いものは 'RegNotifyChangeKeyValue'です。マシンローカルサービスの' HKLM \ SYSTEM \ CurrentControlSet \ services'キーを見てください。 –

答えて

3

XPで最も近いと思われるのは、QueryServiceStatusEx(シングルサービス)またはEnumServicesStatusEx(複数サービス)です。

これらのいずれかを繰り返し呼び出さないようにするには、Win32_Servicestateプロパティを照会するWMIセットアップをお勧めします。詳細については、this threadの下部を参照してください。

以下は、Alerterサービスの状態を監視する(基本)WMIスクリプトである:

strComputer = "." 
Set objSWbemServices = GetObject("winmgmts:" &_ 
    "{impersonationLevel=impersonate}!" &_ 
    "\\" & strComputer & "\root\cimv2") 

Set objEventSource = objSWbemServices.ExecNotificationQuery(_ 
    "SELECT * FROM __InstanceModificationEvent " &_ 
    "WITHIN 10 " &_ 
    "WHERE TargetInstance " &_ 
    "ISA 'Win32_Service' " &_ 
    "AND TargetInstance.Name = 'alerter'") 

Set objEventObject = objEventSource.NextEvent() 
Wscript.Echo "The status of the alerter service just changed." 

上記、および追加例、this TechNet pageに見出すことができます。

0

ポーリングで行う必要があります。コードを別のスレッドに置き、合理的である限り、スリープ状態にしてください。システムのパフォーマンスを最小限に抑えるために、毎秒、おそらくは5秒ということもあります。単一のサービスのための 'C' の例として

//さまざまなハンドルと文字列のプラス... 上記Service_Status ssStatus。 ...

schSCManager = OpenSCManager(ServiceComputerNameStr, 
            NULL, 
            SC_MANAGER_ALL_ACCESS); 
    if (schSCManager == NULL) 
     { 
//  ... error stuff 
     goto cleanup; 
     } 

    scphService = OpenService(schSCManager, 
           ServiceNameStr, 
//        SERVICE_QUERY_STATUS); 
           SERVICE_ALL_ACCESS); 
    if (scphService == NULL) 
     { 
//  ... error stuff 
     goto cleanup; 
     } 

    if (!QueryServiceStatus(scphService, ssStatus)) 
     { 
//  ... error stuff 
     goto cleanup; 
     } 

あなたが望む結果はssStatus.dwCurrentStateになります。

+0

他にもいくつかありますWMI –

+0

のようなポーリングを除くオプション@Thomasek WMIは依然としてサービスをポーリングしています。オリジナルのポスターはXPソリューションを求めましたが、NotifyServiceStatusChangeはXPでは利用できないと指摘しています。ポーリングは理想とはほど遠い。しかし、それがない(あるレベルで)サービス状態を読み取る* XP *の方法があるなら、私は非常に知りたいと思うだろう。 –

関連する問題