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_Service
的 state
属性。详情见底部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服务的状态变化?的主要内容,如果未能解决你的问题,请参考以下文章
如何利用zabbix对windows server的服务进行监控报警?
如何在 Windows XP 上安装 Windows Server 2003 管理工具包