如何在Windows XP下监控Windows服务的状态变化?

时间:2009-07-27 18:30:07

标签: c winapi windows-services windows-xp

我正在尝试用C编写程序,可以检测某些Windows服务(即NT服务)何时启动或停止。

似乎有一个函数NotifyServiceStatusChange,但这只适用于Vista和Windows 7.我试图在Win XP上执行此操作,那么最好的方法是什么?除了连续投票之外还有其他吗?

编辑:

有人能用C答案吗?我也熟悉C ++,但我想远离脚本。

2 个答案:

答案 0 :(得分:3)

看起来你在XP中最接近的是QueryServiceStatusEx(单一服务)或EnumServicesStatusEx(多种服务)。

为避免重复调用其中任何一个,有些人建议使用WMI设置,查询Win32_Service的{​​{1}}属性。有关详细信息,请参阅this thread的底部。

以下是用于监控警报服务状态的(基本)WMI脚本:

state

以上和其他示例可以在this TechNet page上找到。

答案 1 :(得分: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中。