以c ++获取Windows会话的用户名

时间:2010-12-25 10:19:06

标签: windows session terminal-services

我试图更好地理解Windows会话(TS会话和登录会话)的工作原理(目前在XP中),所以也许我的整个问题或我想要做的事情是不可能的。

我正在运行Windows服务(在XP中),它在会话0中运行,我正在尝试使用WTSQueryUserToken()将该用户名附加到此会话。 现在,在会话0中有几个用户名:SYSTEMtheuser(已登录用户),NETWORK SERVICELOCAL SERVICE

当我使用WTSQueryUserToken()时,我得到“theuser”(这是活动会话),但我试图获取我的服务的用户名(即SYSTEM)。 这是可能的还是我只是弄错了?

1 个答案:

答案 0 :(得分:1)

我使用以下代码获取进程的用户令牌

HANDLE GetProcessOwnerToken(DWORD pid)
{
    if (!pid) return NULL;

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (!hProcess) return NULL;

    HANDLE hToken = NULL;
    if(OpenProcessToken(hProcess, MAXIMUM_ALLOWED, &hToken))
    {
        HANDLE result = INVALID_HANDLE_VALUE;
        if(DuplicateTokenEx(hToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &result))
        {
            if(result != INVALID_HANDLE_VALUE)
            {
                CloseHandle(hToken);
                CloseHandle(hProcess);
                return result;
            }
        }
        CloseHandle(hToken);
    }
    CloseHandle(hProcess);

    return NULL;
}

我不知道它是否适用于服务,我认为应该。