测试出来了第一版代码--可以得到用户token啦

一版一版往前走啦。。。

先安装vs2010的学习版,

然后用codeblock来搞。

有一个msvcr100.dll这个文件需要和代码同级目录。

这样的好处是合规,然后,codeblock也可以用vs的库,然后比c#好的地方是不需要.net支持。

#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <Tlhelp32.h>
#include <tchar.h>
#include <psapi.h>
#include <stdio.h>
#include <STDLIB.H>
#include <tlhelp32.h>
#include <WtsApi32.h>
#include <windows.h>
#include <stdio.h>
#include <Userenv.h>
#include <Wtsapi32.h>
#pragma comment(lib, "WtsApi32.lib")
#pragma  comment (lib,"psapi")
#pragma  comment (lib,"user32.lib")
#pragma  comment (lib,"advapi32.lib")
#pragma comment(lib,"ws2_32.lib")

//Function to run a process as active user from windows service
void ImpersonateActiveUserAndRun()
{

    DWORD session_id = -1;
    DWORD session_count = 0;
    WTS_SESSION_INFOA *pSession = NULL;

    if (WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSession, &session_count))
    {
        printf("pSession=====%d\n", pSession);
        printf("session_count=====%d\n", session_count);
    }
    else
    {
        printf("WTSEnumerateSessions ===============failed \n");
        printf("ERROR: %d", GetLastError());
        return;
    }
    for (DWORD i = 0; i < session_count; i++)
    {
        session_id = pSession[i].SessionId;
        printf("session_id=====%d\n", session_id);

        WTS_CONNECTSTATE_CLASS wts_connect_state = WTSDisconnected;
        WTS_CONNECTSTATE_CLASS* ptr_wts_connect_state = NULL;

        DWORD bytes_returned = 0;
        if (::WTSQuerySessionInformation(
            WTS_CURRENT_SERVER_HANDLE,
            session_id,
            WTSConnectState,
            reinterpret_cast<LPTSTR*>(&ptr_wts_connect_state),
            &bytes_returned))
        {
            wts_connect_state = *ptr_wts_connect_state;
            ::WTSFreeMemory(ptr_wts_connect_state);
            //printf("wts_connect_state=====%d\n", wts_connect_state);
            if (wts_connect_state != WTSActive) continue;
        }
        else
        {
            printf("WTSQuerySessionInformation ===============failed \n");
            printf("ERROR: %d", GetLastError());
            return;
        }

        HANDLE hImpersonationToken = 0;
        BOOL bRet = WTSQueryUserToken(session_id, &hImpersonationToken);
        if (bRet == false)
        {
            printf(" WTSQueryUserToken ERROR: %d\n", GetLastError());
        }
        printf("hImpersonationToken=====%d\n", hImpersonationToken);

        //Get real token from impersonation token
        DWORD neededSize1 = 0;
        HANDLE *realToken = new HANDLE;
        //TOKEN_USER tkUser;
        TOKEN_USER *pTokenUser = NULL;
        PTOKEN_GROUPS pGroups = NULL;
        //if (GetTokenInformation(hImpersonationToken, TokenGroups, NULL, neededSize1, &neededSize1))
        if (GetTokenInformation(hImpersonationToken, TokenUser, NULL, 0, &neededSize1))
        //if (GetTokenInformation(hImpersonationToken, TokenUser, &tkUser, sizeof(tkUser), &neededSize1))
        //if (GetTokenInformation(hImpersonationToken, (::TOKEN_INFORMATION_CLASS) TokenLinkedToken, realToken, sizeof(HANDLE), &neededSize1))
        {
            CloseHandle(hImpersonationToken);
            hImpersonationToken = pTokenUser;
        }
        else
        {
            printf(" neededSize1: %d\n", neededSize1);
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER && neededSize1 > 0)
            {
                printf(" ERROR_INSUFFICIENT_BUFFER.\n");
                //pGroups = (PTOKEN_GROUPS)HeapAlloc(GetProcessHeap(), 0, neededSize1);
                pTokenUser = (TOKEN_USER*)new BYTE[neededSize1];
                printf("pTokenUser=====%d\n", pTokenUser);
                if (!GetTokenInformation(hImpersonationToken, TokenUser, pTokenUser, neededSize1, &neededSize1))
                //if (!GetTokenInformation(hImpersonationToken, TokenGroups, pGroups, neededSize1, &neededSize1))
                {
                    HeapFree(GetProcessHeap(), 0, pTokenUser);
                    pTokenUser = NULL;
                }

            }
            printf(" pTokenUser: %d\n", pTokenUser);
            continue;
        }
        printf("hImpersonationToken=====%d\n", hImpersonationToken);

    }

}

void Usage(void)
{
    fprintf(stderr,"==============================\n"
            "\tname:run programe at any session ,need system permission\n"
            "\tsession 1 D:\\callsession\\bin\\callsession.exe \n"
            "==================================\n");
}

int main(int argc, char **argv)
{
    ImpersonateActiveUserAndRun();

    return 0;
}

时间: 2024-09-20 19:52:14

测试出来了第一版代码--可以得到用户token啦的相关文章

使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4

以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host, port); List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>(); mongoCredentialList.add(MongoCredential.createMongoCRCre

用于测试php函数的代码

函数 今天忽然想到的,就写了一段测试php函数的代码. <?php /** * 参数数组$ParamList说明 * * 数组的第一维索引是需要测试的函数的参数名,第二维的每个元素是该参数需要测试的可能值,元素值可以为数组. */ $ParamList = array("Param1" => array(3,4,3,2,1),                   "Param2" => array(3,2,5),                  

测试php函数的代码

今天忽然想到的,就写了一段测试php函数的代码 <?php /** * 参数数组$ParamList说明 * * 数组的第一维索引是需要测试的函数的参数名,第二维的每个元素是该参数需要测试的可能值,元素值可以为数组. */ $ParamList = array("Param1" => array(3,4,3,2,1), "Param2" => array(3,2,5), "Param3" => array(0,0.5,1,

c#中怎么设置用户的投票次数代码就一个用户只能投3次

问题描述 c#中怎么设置用户的投票次数代码就一个用户只能投3次我有个登陆页面的我想用session传到投票页面但是实现不了希望可以说下额详细点额希望是代码额我是新手哈万分感谢 解决方案 解决方案二:SESSION无关IP地址,要么用户要么IP地址来判断解决方案三:没明白,用session传到投票页面但实现不了这是啥意思?是说传不过去么还是说用session实现不了你的功能...我觉着用session不行吧,用户不关浏览器时你能限制他只投3次,可用户要是惯了浏览器session不就清了么,他再进来

《HTML5 Canvas游戏开发实战》——1.5 测试与上传代码

1.5 测试与上传代码 在上传工程代码的时候,需要将工程里包含的HTML.图片及JavaScript等所有文件上传至服务器,并保证文件结构不变. 现在来写个简单的页面,测试一下我们的服务器和开发工具是否已经正确无误地安装完毕,同时也可了解一下代码如何在服务器上运行. 按照1.4节中的步骤,建立一个sample1.5.1工程,在工程中新建一个index.html文件,输入代码清单1-8中所示的代码. 代码清单 1-8 <!DOCTYPE html> <html lang="en&

api-如何用jbehave进行编写测试API的自动化测试代码呢?

问题描述 如何用jbehave进行编写测试API的自动化测试代码呢? 如何用jbehave进行编写测试API的自动化测试代码呢?请各位大神支招..谢谢了 解决方案 http://yangzb.iteye.com/blog/309354

一步步教你编写可测试的Go语言代码_Golang

第一个测试 "Hello Test!" 首先,在我们$GOPATH/src目录下创建hello目录,作为本文涉及到的所有示例代码的根目录. 然后,新建名为hello.go的文件,定义一个函数hello() ,功能是返回一个由若干单词拼接成句子: package hello func hello() string { words := []string{"hello", "func", "in", "package&q

c++-如何用C++代码设计记录用户登录的顺序以及次数

问题描述 如何用C++代码设计记录用户登录的顺序以及次数 如何用C++代码设计记录用户登录的顺序以及次数.用户登录后写下感言,退出登陆后再次登陆可以看见自己之前写的感言,并且可以按次序显示用户写下的感言.类似于贴吧回帖一样.

javascript验证-增加javascript测试没反应,代码如下:

问题描述 增加javascript测试没反应,代码如下: <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> 发布新闻一级标题<br> function checkOneTitle(){<br> if(form1.titlename.value == null || form1.tltlename.value == "&