啥都不说了,就是这样搞!!!!

简介: 这版作为基础版。 获取当前session的token,有几个思路, 可以通过进程,活动session,或是循环所有用户,或是从共享session里弄出来。 #include #include #include #include #pragma comment(lib, "WtsApi32.

这版作为基础版。

获取当前session的token,有几个思路,

可以通过进程,活动session,或是循环所有用户,或是从共享session里弄出来。

#include <windows.h>
#include <stdio.h>
#include <Userenv.h>
#include <Wtsapi32.h>
#pragma comment(lib, "WtsApi32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "userenv.lib")
using namespace std;



HANDLE GetUserToken(DWORD dwSessionId)
{
    HANDLE hImpersonationToken = 0;
    if (!WTSQueryUserToken(dwSessionId, &hImpersonationToken))
    {
        printf(" WTSQueryUserToken ERROR: %d\n", GetLastError());
        return FALSE;
    }
    DWORD dwNeededSize = 0;
    HANDLE *realToken = new HANDLE;
    TOKEN_USER *pTokenUser = NULL;
    PTOKEN_GROUPS pGroups = NULL;
    //twice call function
    if (!GetTokenInformation(hImpersonationToken, TokenUser, NULL, 0, &dwNeededSize))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && dwNeededSize > 0)
        {
            pTokenUser = (TOKEN_USER*)new BYTE[dwNeededSize];
            if (!GetTokenInformation(hImpersonationToken, TokenUser, pTokenUser, dwNeededSize, &dwNeededSize))
            {
                printf("GetTokenInformation ERROR: %d", GetLastError());
            }
        }
        return hImpersonationToken;
    }
    return hImpersonationToken;
}

bool GetSessionUserName(DWORD dwSessionId, char username[256])
{
    LPTSTR pBuffer = NULL;
    DWORD dwBufferLen;
    if (!WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, dwSessionId, WTSUserName, &pBuffer, &dwBufferLen))
    {
        printf(" WTSQuerySessionInformation ERROR: %d\n", GetLastError());
        return FALSE;
    }
    lstrcpy(username ,pBuffer);
    WTSFreeMemory(pBuffer);
    return TRUE;
}


int main(int argc, char **argv)
{
    DWORD session_id = -1;
    DWORD session_count = 0;
    WTS_SESSION_INFOA *pSession = NULL;
    char username[256];
    HMODULE hInstKernel32 = NULL;
    HMODULE hInstWtsapi32 = NULL;
    //EnumerateSessions
    if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSession, &session_count))
    {
        printf("WTSEnumerateSessions ERROR: %d", GetLastError());
        return FALSE;
    }
    //Get the right user and his session id
    for(DWORD i = 0; i < session_count; ++i)
    {
        if( (pSession[i].State == WTSActive) && (pSession[i].State != WTSDisconnected) )
        {
            printf("\tsessionInfo.SessionId=%d\n",pSession[i].SessionId);
            GetSessionUserName(pSession[i].SessionId,username);
            printf("\tSession user's name = %s\n",username);
            session_id = pSession[i].SessionId;
        }
    }

    WTSFreeMemory(pSession); //free meme heap

    //Duplicate User Token
    HANDLE hTokenThis = GetUserToken(session_id);
    HANDLE hTokenDup = NULL;

    if (!DuplicateTokenEx(hTokenThis, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenPrimary, &hTokenDup))
    {
        printf("DuplicateTokenEx ERROR: %d\n", GetLastError());
        return FALSE;
    }

    if (!SetTokenInformation(hTokenDup, TokenSessionId, &session_id, sizeof(DWORD)))
    {
         printf("SetTokenInformation Error === %d\n",GetLastError());
         return FALSE;
    }

    //init this process info
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    si.cb = sizeof(STARTUPINFO);
    si.lpDesktop = "WinSta0\\Default";
    //LPVOID pEnv = NULL;
    DWORD dwCreationFlag = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
    //CreateEnvironmentBlock(&pEnv, hTokenDup, FALSE);

    LPSTR lpCmdLine = "c:\\windows\\system32\\notepad.exe";

    if (!CreateProcessAsUser(hTokenDup, NULL, lpCmdLine, NULL, NULL, FALSE, dwCreationFlag, NULL, NULL, &si, &pi))
    {
        printf("CreateProcessAsUser Error === %d\n",GetLastError());
    }
    printf("OK");

    return 0;
}

 

  

目录
相关文章
9、Pycharm运行报错:CreateProcess error=2, 系统找不到指定的文件
9、Pycharm运行报错:CreateProcess error=2, 系统找不到指定的文件
9、Pycharm运行报错:CreateProcess error=2, 系统找不到指定的文件
|
XML 图形学 数据格式
使用duilib开发半透明异形窗体程序(附源码和demo)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/43532791                  半透明异形窗体的功能在之前维护的老版本的duilib里面已经有了基本的功能,但是因为一直存在较多的缺陷,所以我一直建议少用,就连我自己写仿酷狗项目也只是在几个小地方用了半透明异形窗体。
2734 0
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
542 3
|
安全 Cloud Native Java
Nacos身份绕过漏洞(QVD-2023-6271)复现学习
Nacos身份绕过漏洞(QVD-2023-6271)复现学习
10708 0
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
566 0
|
存储 C++ 编译器
++ fatal error C1083: 无法打开预编译头文件:“.\Debug\router.pch”
一、出现此错误首先检查:stdafx.cpp文件上右键——属性,预编译头选“创建”,其它cpp选“使用”。 二、如果是采用这样的设置,还是有错误,重新生成解决方案,重新调试。 三、实在不行的话,步骤/方法右键点击你创建的项目,选择“属性标签”点击属性,弹出“项目属性页”,在左侧找到以下位置  配置属性 -->  C/C++  --> 预编译头,并选择它:在右边的菜单中选择 “创建/使用预编译头”中的“不使用预编译头文件”点击“确定”按钮退出即可原因分析。
1527 0
|
10月前
|
存储 安全 算法
掌握C/C++中常见的加解密技术
在实现任何安全敏感功能时,务必要详尽地测试你的代码以确保其不仅能正常工作,并且能抵御常见的攻击方式,例如重放攻击、中间人攻击等。这种测试通常需要具备专业的安全知识,并且要检查一系列的安全性能指标。
427 0
|
BI 索引
HID 入门学习:标准请求和类请求
HID 入门学习:标准请求和类请求
1300 0
|
开发工具 git
git fetch和 pull的区别
`git fetch`和 `git pull`在Git中扮演着不同的角色,了解它们的区别和使用场景对于高效管理代码库至关重要。通过合理使用这两个命令,可以更好地控制代码合并过程,减少冲突,提高团队协作效率。
1215 97