在 c++ 中获取 Windows 会话的用户名

发布于 2024-10-08 23:47:16 字数 409 浏览 2 评论 0原文

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

我正在运行一个 Windows 服务(在 XP 中),该服务在会话 0 中运行,并且我尝试使用 WTSQueryUserToken() 获取附加到此会话的用户名。 现在,会话 0 中有多个用户名:SYSTEMtheuser(登录用户)、NETWORK SERVICELOCAL SERVICE.

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

I am trying to understand better how Windows sessions (TS sessions and log on sessions) works (currently in XP), so maybe my whole question or what I am trying to do is impossible.

I am running a Windows service (in XP), which runs in session 0, and I am trying to get the username attached to this session using WTSQueryUserToken().
Now, in session 0 there are several usernames: SYSTEM, theuser (logged on user),NETWORK SERVICE, LOCAL SERVICE.

When I use WTSQueryUserToken() I get "theuser" (which is the Active session), but I am trying to get the username of my service (which is SYSTEM).
Is that possible or did I simply get it all wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

混浊又暗下来 2024-10-15 23:47:16

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

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

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

I use the following code to get user token for my process

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

I have no idea if it works for services as well, I think it should.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文