c++ - Windows 服务启动/停止另一个服务

标签 c++ windows service uac

我用 C++ 编写的服务有一个小问题。该服务本身运行正常,并在 SYSTEM 帐户下运行。在一次执行期间,我必须启动或停止另一项服务。然而,这是行不通的。对 OpenService() 的调用返回错误代码 5,即“拒绝访问”。

提供更多细节:我必须启动一个自己的时间提供程序服务,该服务尝试在网络适配器上打开端口 123,并且该端口通常已经由来自的 win32time 服务打开 Windows 。我尝试做的是让用户可以选择在我的服务启动时自动停止该服务,并在它停止时重新启动它。

此服务只能在支持 UAC 的系统上以提升的用户权限访问,我知道,但我一直认为默认情况下 SYSTEM 帐户能够执行此操作,但显然我错了。

是否有可能以某种方式提升我的服务(可能通过将 list 中的特权级别调整为“requireAdministrator”或类似的东西)?老实说,我还没有尝试过这个,因为我担心 UAC 提示会卡在 session 0 或类似的东西中。或者是否有另一种方法可以授予我在 SYSTEM 下运行的服务控制其他服务状态的权限?

非常感谢任何建议,谢谢!

编辑

好的,这是代码,我现在觉得有点傻...我完全忘记彻底检查 API,因为我认为 OpenSCManager()OpenService()可以为0默认请求所有权限,但我必须通过SC_MANAGER_ALL_ACCESS。抱歉打扰大家了。我明天会尝试这个,并在得到结果后关闭这个问题。

// I am missing SC_MANAGER_ALL_ACCESS here probably...
SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_CREATE_SERVICE) ;
if(nullptr == scm) {
/* Handle and return */
}

// ...and possibly here, too
SC_HANDLE svc = OpenService(scm, _T("w32time"), 0);
int lastError = GetLastError();

if(ERROR_SERVICE_DOES_NOT_EXIST == lastError) {
/* Handle and return */
}

if(start) {
    if(0 != StartService(svc, 0, nullptr)) {
        int lastError = GetLastError();
        if(ERROR_SERVICE_ALREADY_RUNNING != lastError) {
            /* Handle */
        }
    }
} else {
    SERVICE_STATUS status;
    QueryServiceStatus(svc, &status);
    if(SERVICE_STOPPED != status.dwCurrentState) {
        if(ControlService(svc, SERVICE_CONTROL_STOP, &status)) {
            do {
                QueryServiceStatus(svc, &status);
            } while(SERVICE_STOPPED != status.dwCurrentState);
        } else {
            /* Handle */
        }
    }
}

CloseServiceHandle(svc);
CloseServiceHandle(scm);

最佳答案

好的,问题只是缺少 SC_MANAGER_ALL_ACCESS 访问权掩码。我的服务现在可以启动/停止请求的其他服务。

关于c++ - Windows 服务启动/停止另一个服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18774179/

相关文章:

android - 服务不存在

angularjs - 了解 $http 查询获取结果所用时间的最佳方式?

c++ - RVO 和复制省略是否只能在一个编译单元内工作?

c++ - 为什么这个使用 std::rotate 的简单程序无法编译?

c++ - Gtkmm 程序编译正常但崩溃 - Windows XP

windows - 在 hyper-v 虚拟机上完成 Windows 应用程序开发

c# - Windows 服务在启动期间失败的正确方法是什么

c++ - 从 BST 的给定范围插入元素到数组中

c++ - 排序算法不起作用

windows - Silverlight 应用程序关闭一个窗口也会关闭父窗口