Win7 C ++-从以用户身份登录的服务中以用户身份启动可执行文件的问题

时间:2018-08-20 19:44:46

标签: c++ service impersonation

我正在解决Windows服务的问题,到目前为止,该服务在模拟当前用户并在该用户的会话中启动可执行文件方面都没有问题。

我最初的问题是我无法访问有关已安装驱动器或其上文件的信息。因此,我发现需要定义服务以用户身份登录。

一旦这样做,我将不再有访问这些文件的问题,但是启动可执行文件的模拟不再起作用。更具体地说,我对WTSQueryUserToken()的调用不再起作用,但返回false,而GetLastError()返回ERROR_PRIVILEGE_NOT_HELD。

我尚不知道我是否会遇到DuplicateTokenEx()CreateProcessAsUserA()的任何问题,但一次只能解决一件事。

我的代码如下(在此之前已检索到dwSessId并且是正确的):

if (dwSessId >= 0)
{
    HANDLE hCurrentToken;
    HANDLE hPrimaryToken;
    BOOL ok = WTSQueryUserToken(dwSessId, &hCurrentToken);
    if (ok)
    {
        ok = DuplicateTokenEx(hCurrentToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, &hPrimaryToken);
        // now we start the executable process as the current user
        STARTUPINFOA si;
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = SW_SHOWNORMAL;
        ret = (CreateProcessAsUserA(hPrimaryToken, procname.c_str(), NULL, 0, 0, false, CREATE_NO_WINDOW, 0, 0, &si, &m_pProcInfo) != 0);
    }
}
else
{
    int err = GetLastError();
    return false;
}

1 个答案:

答案 0 :(得分:0)

根据WTSQueryUserToken()文档:

  

要成功调用此函数,调用应用程序必须在LocalSystem帐户的上下文中运行,并具有SE_TCB_NAME特权。

换句话说,您不能将服务配置为以任何特定用户身份运行。但是,只要正在调用WTSQueryUserToken()的线程在调用时没有冒充用户,它肯定可以在需要时冒充用户。

相关问题