我正在尝试用C编写程序,可以检测某些Windows服务(即NT服务)何时启动或停止。
似乎有一个函数NotifyServiceStatusChange,但这只适用于Vista和Windows 7.我试图在Win XP上执行此操作,那么最好的方法是什么?除了连续投票之外还有其他吗?
编辑:
有人能用C答案吗?我也熟悉C ++,但我想远离脚本。
答案 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中。