【问题标题】:Windows Service starting/stopping another serviceWindows 服务启动/停止另一个服务
【发布时间】:2023-04-05 17:07:01
【问题描述】:

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

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

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

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

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

编辑

好了,代码就到这里了,我现在感觉有点傻……我完全忘记彻底检查API了,因为我以为OpenSCManager()OpenService()的参数可以为零请求所有默认权限,但我必须通过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);

【问题讨论】:

  • 请出示您的实际代码。您对OpenSCManager() 的调用是否授予OpenService() 要求的足够权限?
  • 你是不是先冒充amdin权限再调用API?
  • @Remy Lebeau 是的,这可能就是问题所在。我现在觉得有点傻,不知道我怎么能忽略这一点:(

标签: c++ windows service uac


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多