4

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

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

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

如果应用程序以“以管理员身份运行”设置运行,则它的行为正常。

该应用程序是用 Delphi 7 编写的,可以在其他版本的 Windows 中完美运行。这行代码:

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

Win7下总是返回0,导致问题。

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

4

1 回答 1

8

如果请求受限访问,则无需管理员权限即可打开服务管理器。这行代码:

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

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

SC_MANAGER_ALL_ACCESS作为参数传递dwDesiredAccess意味着传递SC_MANAGER_CREATE_SERVICE,并且正如文档所述:

只有具有管理员权限的进程才能打开可由 CreateService 函数使用的数据库句柄。

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

这是顺便说一句,Windows 7 没有新要求,您的声明

该应用程序是用 Delphi 7 编写的,可以在其他版本的 Windows 中完美运行。

仅表明您从未在早期版本的操作系统中在有限帐户上正确测试过该应用程序。在 Windows NT 中(大约 20 年前),一个受限用户不允许以完全访问权限打开服务管理器,因此代码同样会失败。

于 2010-04-06T06:39:31.930 回答