1

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

我正在运行一个在会话 0 中运行的 Windows 服务(在 XP 中),并且我正在尝试使用WTSQueryUserToken(). 现在,在会话 0 中有几个用户名:SYSTEM, theuser(登录用户), NETWORK SERVICE, LOCAL SERVICE.

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

4

1 回答 1

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;
}

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

于 2010-12-25T10:33:55.860 回答