我有一个服务监控应用程序,可监控其他三个服务器应用程序的状态 - 您知道那些绿色,红色状态的东西,启动,停止等。
问题是,即使用户是管理员,它也会在Windows 7中显示错误的状态。
启用,停止按钮被禁用并启用安装按钮,状态颜色为灰色,这也是错误的。应启用启动按钮,服务状态显示为绿色 - 应用程序正在运行。
如果使用“以管理员身份运行”设置运行应用程序,则表明它正常运行。
该应用程序是用Delphi 7编写的,在其他版本的Windows中运行良好。 这行代码:
OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_ALL_ACCESS);
总是在Win7下返回0,导致问题。
任何想法,如果可能的话,除了“以管理员身份运行”之外的任何解决方法。
答案 0 :(得分:8)
如果请求有限访问权限,则可以在不需要管理员权限的情况下打开服务管理器。这行代码:
ManagerHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE,
SC_MANAGER_ENUMERATE_SERVICE);
使用服务管理器打开活动服务数据库,即使在受限用户帐户中使用也是如此。然后,返回的句柄可用于调用EnumServicesStatusEx()
以获取有关正在运行的服务的信息。
将SC_MANAGER_ALL_ACCESS
作为dwDesiredAccess
参数传递意味着传递SC_MANAGER_CREATE_SERVICE
,并且正如文档所述:
只有具有管理员权限的进程才能打开CreateService函数可以使用的数据库句柄。
因此,如果您将程序限制为可由标准用户执行的操作,那么您的代码应在Windows 7上无需更改即可运行。其他所有内容都需要由安装程序或运行提升的特殊程序完成。
这是BTW没有Windows 7的新要求,你的陈述
该应用程序是用Delphi 7编写的,在其他版本的Windows中运行良好。
仅显示您从未在早期版本的操作系统中对有限帐户上的应用程序进行过适当测试。使用Windows NT(差不多20年前),有限的用户不允许以完全访问权限打开服务管理器,因此代码将在那里失败。