windows xp下如何监控windows服务的状态变化?

Posted

技术标签:

【中文标题】windows xp下如何监控windows服务的状态变化?【英文标题】:How can I monitor status changes of windows services under windows xp? 【发布时间】:2010-11-14 11:01:04 【问题描述】:

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

似乎有一个函数NotifyServiceStatusChange,但这仅适用于Vista 和Windows 7。我正在尝试在Win XP 上执行此操作,那么最好的方法是什么?除了连续轮询,还有其他方法吗?

编辑:

有人能用 C 语言给出答案吗?我对 C++ 也很满意,但我想远离脚本。

【问题讨论】:

由于这不是一个合格的答案,我将其添加为评论:您可以获得的最接近的是 RegNotifyChangeKeyValue 观看机器本地服务的 HKLM\SYSTEM\CurrentControlSet\services 【参考方案1】:

您需要通过投票来完成。将代码放在单独的线程中,并在合理的时间内将其发送到睡眠状态。每隔一秒说一次,甚至可能是 5 秒,以最大限度地降低系统性能。

作为单个服务的“c”示例:

// 各种句柄和字符串加上... SERVICE_STATUS ss状态; ...

    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 中。

【讨论】:

除了轮询之外还有一些其他的选项,比如WMI @Thomasek WMI 仍在轮询服务。原始发帖人要求提供 XP 解决方案,正如他所指出的,NotifyServiceStatusChange 在 XP 中可用。轮询远非理想。但是如果没有它(在某种程度上)有一种 XP 读取服务状态的方法,我会很想知道。【参考方案2】:

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

为避免重复调用其中任何一个,有些人建议使用 WMI 设置,查询 Win32_Servicestate 属性。详情见底部this thread。

以下是一个(基本)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 上找到。

【讨论】:

以上是关于windows xp下如何监控windows服务的状态变化?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows XP 上监控显示器电源事件

如何在Windows下升级MySQL

如何利用zabbix对windows server的服务进行监控报警?

如何在 Windows XP 上安装 Windows Server 2003 管理工具包

如何在 Windows XP 上安装 Windows Server 2003 管理工具包

如何在windows xp系统下使用huihui语音包