【问题标题】:List service and services status under Win-7Win-7下列出服务和服务状态
【发布时间】:2011-02-04 15:41:42
【问题描述】:

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

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

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

如果应用程序以“以管理员身份运行”设置运行,那么它会正常运行。

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

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

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

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

【问题讨论】:

标签: delphi windows-7 windows-services privileges


【解决方案1】:

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

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 年前),受限用户无法打开具有完全访问权限的服务管理器,因此代码同样会失败。

【讨论】:

  • 完美答案!切勿将 xxx_ALL_ACCESS 标志用于 DesiredAccess 参数。而是只使用必要的东西。此外,不应在此处使用 GENERIC_xxxx 权限,因为它们的语义可能会从一个 Winversion 更改为另一个(并且它们已经拥有)。
  • 您好 - 感谢您的回答和解释。会尝试你的方法,但是,如果我也想启动或停止服务怎么办 - 我的意思是,给用户这样做的权力?
  • 启动和停止服务可能需要比当前用户更多的权限。在这种情况下,OpenService(ManagerHandle, ServiceName, SERVICE_START or SERVICE_STOP) 将返回 0,GetLastError() 将返回错误代码 5。此时需要提升,有关于如何使用 Delphi 执行此操作的 SO 答案。
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多