delphi – 列出Win-7下的服务和服务状态

我有一个服务监视器应用程序,监视其他三个服务器应用程序的状态 – 你知道那种绿色,红色状态的东西,启动,停止等.

问题是即使用户是管理员,它在Windows 7中也显示错误的状态.

启动,停止按钮被禁用并启用安装按钮,状态颜色为灰色,这也是错误的.应启用启动按钮,服务状态显示为绿色 – 应用程序正在运行.

如果应用程序使用“以管理员身份运行”设置运行,则表明其运行正常.

该应用程序是用Delphi 7编写的,在其他版本的Windows中运行良好.
这行代码:

OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_ALL_ACCESS);

永远在Win7下返回0,导致问题.

任何想法,如果可能的话,除了“以管理员身份运行”之外的任何解决方法.

最佳答案
如果请求有限访问权限,则无需管理员权限即可打开服务管理器.这行代码:

ManagerHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE,
  SC_MANAGER_ENUMERATE_SERVICE);

即使在受限用户帐户中使用,也会使用服务管理器打开活动服务的数据库.然后可以使用返回的句柄调用EnumServicesStatusEx()以获取有关正在运行的服务的信息.

传递SC_MANAGER_ALL_ACCESS作为dwDesiredAccess参数意味着传递SC_MANAGER_CREATE_SERVICE,并且文档说明:

Only processes with Administrator privileges are able to open a database handle that can be used by the CreateService function.

因此,如果您将程序限制为可由标准用户执行的操作,那么您的代码应在Windows 7上无需更改即可运行.其他所有内容都需要由安装程序或运行提升的特殊程序完成.

这是BTW没有新的要求Windows 7,你的声明

The application is written in Delphi 7 and works perfectly in other versions of Windows.

仅显示您从未在早期版本的操作系统中在有限帐户上正确测试应用程序.使用Windows NT(近20年前),不允许有限用户以完全访问权限打开服务管理器,因此代码将在那里失败.

转载注明原文:delphi – 列出Win-7下的服务和服务状态 - 代码日志