Windows服务启动/停止其他服务

时间:2013-09-12 20:55:23

标签: c++ windows service uac

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

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

此服务只能在具有UAC功能的系统上使用提升的用户权限进行访问,我知道,但我一直认为SYSTEM帐户默认情况下可以执行此操作,但显然我错了。< / p>

是否有可能提升我的服务(可能是通过将清单中的权限级别调整为'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);

1 个答案:

答案 0 :(得分:0)

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