测试出来了第一版代码--可以得到用户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;
}

时间: 07-24

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

用 console.time()和 console.timeEnd() 测试你的 javascript 代码执行效率

无意中学习到了一种测试 javascript 代码执行效率的一种方法,就记下来便于以后使用,用到了console对象中的  time  和  timeEnd  方法 . console.time('myFirstCode');  //开始(开始的名字要和结束的名字要一致哦) //你所要执行的 javascript程序 .... console.timeEnd('myFirstCode');    //结束 在浏览器控制台 console 这个按钮,查看代码执行时间 用 console.time(

测试新浪微博@小冰 为代码机器人的一些方法

微软的微信小冰被腾讯封杀之后,现在移民到了新浪微博; @小冰 这里贴一些目前有效的用来识别是这是"机器"而不是有正常人类智商的代码的方法: 1. 在正常的文字中夹杂其它符号,确保不存在有意义的连续的词汇,人眼可以分辨,机器不知所云而会露馅: 比如:    ^^^小v冰^^^--你,,总.算--v开-始--^^不^^知^^道^^我^^在^^说^^啥^^了;  2. 人类对部分词汇乃至个别整句的颠倒仍有识别能力,照理机器应该更容易,但目前还不行: 所以这句话: "哈哈哇,了岗下要

易于跨引擎和测试的游戏客户端代码设计方法

一.前言 本文讲的设计方法,不涉及算法.优化.接口讲解等技术介绍. 该设计方法基于MVC设计模式(主要是抽出控制类),而且本文主要面向游戏开发的一些问题. 该设计方法样例由python编写,但是实际上都是伪代码,有一点代码基础的问基本看得懂. 该设计方法由师兄教授,在项目使用过之后,感觉确实不错,特地提取一个方法论出来以记录. 二.MVC简介 在游戏开发中,目前用到架构主要分为MVC和ESC架构(这部分如有异议欢迎指正,有其他架构也希望能提出,博主也可以学习). 在一个功能复杂的模块中,通常会有

融云SDK:获取用户Token的方法

融云SDK查看ServerAPI里面有个获取Token的方法,本以为只要传三个参数就可以.后来发现,在请求头有几个必须要传的参数,否则服务器返回401(未授权).拿获取Token接口为例子 如图所示,请求头中包含 : App-Key(应用appkey), Nonce(随机数,不限长度),Timestamp(时间戳from1970),Signature(签名).签名生成的方法 就是 sha1(appsecret+Nonce+Timestamp) 只有这几个请求头的值都正确了,接口才能正确返回Tok

获取后台用户 token 的方法

一,通过电子邮箱获取用户token protected function getCustomerToken($emailId){ /** * @var \Magento\Customer\Model\Customer $customer */ */ $customer->loadByEmail($emailId); if($customer->getId()){ /** * @var \Magento\Integration\Model\Oauth\TokenFactory $tokenMod

测试,发布,质量保障,用户体验

1.在实际项目中何时开始设计用户体验:用户的第一印象:从用户的角度考虑问题:软件啊服务始终要记住用户的选择:短期刺激和长期影响 2.测试经验交流:基本名词解释及分类:按测试设计的方法分类:按测试的目的分类:按测试的时机和作用分类: 3.开发阶段:对于每一个成功的构建,测试人员要运行功能测试,场景测试,同时建立回归测试基准,以便开始回归测试,各类测试人员要进行探索测试以求尽早发现问题. 4.测试人员如何体现工作的价值:软件的质量:程序的质量:软件工程的质量:软件开发过程的风险控制,开发成本的控制:

Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的,在nodejs里用还是觉得怪怪的. 如果想简单可以tap,它和tape很像,下文会有详细说明 mocha mocha是tj写的 https://github.com/mochajs/mocha var assert = require("assert") describe('truth',

团队博客-项目再分析,代码完善,用户体验评估

一.项目需求:让用户浏览公证处发布的信息:以及在线办理工程处的一些业务,例如:公正申请,公正咨询等 二.目标客户:想了解公证处信息,以及需要去公证处去公证的人群 三.功能特点:可以在线查看公正动态.处内新闻.政策法规等.可以在线办理公证业务 四.优势:对于用户而言,可以随时.及时查看自己感兴趣的公证信息,在线办理业务. 五.未来发展:把公证处的一些其他业务加上去.做成手机app以方便用户 六.代码完善情况 1.为后台管理员设置账户密码验证 解决方法:通过servlet技术接收网页传入后端的数据(

测试、发布、质量保障,用户体验

在一款软件的整个开发过程中,软件的测试也占了很大的比重,软件测试按照测试设计的方法分类有两类方法:黑箱和白箱:黑箱指的是在设计测试的过程中,把软件系统当作一个“黑箱”,无法了解或使用系统的内部结构及知识.一个更准确的说法是行为设计测试,即从软件的行为,而不是从内部结构出发来设计测试.白箱指的是在设计测试的过程中,设计者可以“看到”软件系统的内部结构,并使用软件的内部结构和知识来选择测试数据及具体的测试方法.而按照测试的目的分类可以分为功能测试和非功能测试.至于测试方法种类很多,比如有单元测试和代