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

简介: 这版作为基础版。 获取当前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;
}

 

  

目录
相关文章
|
4月前
|
存储 前端开发 数据可视化
刚关上灯准备睡时 女朋友抱着我说那个不明白 怎么办?
刚关上灯准备睡时 女朋友抱着我说那个不明白 怎么办?
|
10月前
编程要搞明白的东西(一)
编程要搞明白的东西(一)
53 0
|
7月前
aviator 属实搞事情
aviator 属实搞事情
52 0
|
9月前
|
SQL 缓存 Java
终于来新同事了,没想到竟是我噩梦的开始
终于来新同事了,没想到竟是我噩梦的开始
45 0
|
10月前
|
Java
编程要搞明白的东西(二)
编程要搞明白的东西(二)
64 0
|
12月前
|
监控 Python
前天才讲的知识点,不听讲的人今天就跑来问
前天才讲的知识点,不听讲的人今天就跑来问
71 0
|
Android开发
ViewBingding?搞!
kotlin-android-extensions插件
157 0
ViewBingding?搞!
|
网络协议 Linux
又被鹅厂搞懵了!
客户端(主动关闭方)在 TIME_WAIT 状态下,如果收到服务端的数据包时,会怎么处理?
又被鹅厂搞懵了!
|
Java 大数据 程序员
搭建开发环境搞的我怀疑人生。。
搭建开发环境搞的我怀疑人生。。
搭建开发环境搞的我怀疑人生。。
您了解对方吗?不了解的话那就只能算是“剃头挑子一头热”了,呵呵。
     博客园就像一个大家庭,大家来自五湖四海,互相帮助,共同提高,本来是挺好的。但是如果有“与众不同”的出现的话,就很容易引起轩然大波,有关心的、有反对的、有赞成的。也有忍不住在首页跟贴的。呵呵。
631 0